99 lines
2.1 KiB
Go
99 lines
2.1 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
|
|
|
|
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
|
|
}
|