package tui import ( "fmt" "os" "path/filepath" "git.flo.fo/FLO/dirmd/internal/config" "git.flo.fo/FLO/dirmd/internal/drive" "git.flo.fo/FLO/dirmd/internal/renderer" "git.flo.fo/FLO/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 } if _, err := os.Stat(absOutput); err == nil && !cfg.Force { if info, err2 := os.Stat(absOutput); err2 == nil && !info.IsDir() { result.Error = fmt.Errorf("output %s exists and is not a directory (enable force)", absOutput) return result } 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 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 := filepath.Join(cfg.OutputPath, "index_"+repoName+".md") if err := renderer.Write(walkResult, indexPath, false, false); 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(cfg.OutputPath) } 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 := filepath.Join(cfg.OutputPath, "index_"+repoName+".md") if err := drive.Upload(indexPath, remoteDir); err != nil { result.Error = fmt.Errorf("drive upload: %w", err) return result } } result.Uploaded = true } return result }