Files
dirmd/internal/tui/generate.go
T
2026-08-27 15:49:18 +01:00

134 lines
3.0 KiB
Go

package tui
import (
"fmt"
"os"
"path/filepath"
"dirmd/internal/config"
"dirmd/internal/drive"
"dirmd/internal/renderer"
"dirmd/internal/walker"
)
type GenerateResult struct {
Files []string
Uploaded bool
Error error
}
func Generate(cfg *config.Config) GenerateResult {
result := GenerateResult{}
abs, err := filepath.Abs(cfg.InputPath)
if err != nil {
result.Error = fmt.Errorf("resolve input path: %w", err)
return result
}
cfg.AbsRoot = abs
var outputBase string
if cfg.AppendMode || cfg.SingleFile {
absOutput, err := filepath.Abs(cfg.OutputPath)
if err != nil {
result.Error = fmt.Errorf("resolve output path: %w", err)
return result
}
if !cfg.AppendMode {
if _, err := os.Stat(absOutput); err == nil && !cfg.Force {
result.Error = fmt.Errorf("output %s exists (enable force or append)", absOutput)
return result
}
}
dir := filepath.Dir(absOutput)
if err := os.MkdirAll(dir, 0755); err != nil {
result.Error = fmt.Errorf("create output dir: %w", err)
return result
}
outputBase = absOutput
} else {
absOutput, err := filepath.Abs(cfg.OutputPath)
if err != nil {
result.Error = fmt.Errorf("resolve output path: %w", err)
return result
}
absOutput = filepath.Join(filepath.Dir(absOutput), filepath.Base(absOutput)+"_dirmd")
if !cfg.AppendMode {
if _, err := os.Stat(absOutput); err == nil && !cfg.Force {
result.Error = fmt.Errorf("output %s exists (enable force)", absOutput)
return result
}
}
if err := os.MkdirAll(absOutput, 0755); err != nil {
result.Error = fmt.Errorf("create output dir: %w", err)
return result
}
cfg.OutputPath = absOutput
outputBase = absOutput
}
walkResult, err := walker.Run(cfg)
if err != nil {
result.Error = err
return result
}
if len(walkResult.Entries) == 0 {
result.Error = fmt.Errorf("no readable files in %s", cfg.AbsRoot)
return result
}
repoName := filepath.Base(cfg.AbsRoot)
if cfg.VerticalSlices {
generated, err := renderer.WriteSlices(walkResult, cfg.OutputPath, repoName)
if err != nil {
result.Error = err
return result
}
result.Files = generated
} else {
indexPath := cfg.OutputPath
if err := renderer.Write(walkResult, indexPath, cfg.AppendMode, cfg.SingleFile); err != nil {
result.Error = err
return result
}
result.Files = []string{indexPath}
}
if cfg.ProtonDrive {
remoteDir := cfg.DrivePath
if remoteDir == "" {
remoteDir = "/my-files/md/" + filepath.Base(outputBase)
}
if err := drive.CheckAuth(); err != nil {
result.Error = fmt.Errorf("drive auth: %w", err)
return result
}
if cfg.VerticalSlices {
if err := drive.UploadDir(cfg.OutputPath, remoteDir); err != nil {
result.Error = fmt.Errorf("drive upload: %w", err)
return result
}
} else {
indexPath := cfg.OutputPath
if err := drive.Upload(indexPath, remoteDir); err != nil {
result.Error = fmt.Errorf("drive upload: %w", err)
return result
}
}
result.Uploaded = true
}
return result
}