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 }