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 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 } 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, absOutput, repoName) if err != nil { result.Error = err return result } result.Files = generated } else { indexBasename := "index_" + repoName + ".md" indexPath := filepath.Join(absOutput, indexBasename) 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(absOutput) } if err := drive.CheckAuth(); err != nil { result.Error = fmt.Errorf("drive auth: %w", err) return result } if err := drive.UploadDir(absOutput, remoteDir); err != nil { result.Error = fmt.Errorf("drive upload: %w", err) return result } result.Uploaded = true } return result }