package main import ( "flag" "fmt" "io" "os" "strings" "xlsdoc/internal/docfill" ) type varFlags map[string]string func main() { os.Exit(run(os.Args[1:], os.Stdout, os.Stderr)) } func run(args []string, stdout, stderr io.Writer) int { if len(args) == 0 { fmt.Fprintln(stderr, "docfill: missing command: run") return 2 } if args[0] != "run" { fmt.Fprintf(stderr, "docfill: unknown command: %s\n", args[0]) return 2 } result, code := runFill(args[1:], stderr) if code != 0 { return code } fmt.Fprintf(stdout, "generated %d file(s)\n", len(result.Files)) for _, file := range result.Files { fmt.Fprintf(stdout, "- %s\n", file) } return 0 } func runFill(args []string, stderr io.Writer) (docfill.RunResult, int) { fs := flag.NewFlagSet("docfill run", flag.ContinueOnError) fs.SetOutput(stderr) var configPath string var vars varFlags = make(map[string]string) fs.SetOutput(io.Discard) fs.StringVar(&configPath, "config", "", "path to task json") fs.StringVar(&configPath, "c", "", "path to task json") fs.Var(vars, "var", "template variable as key=value; repeatable") if err := fs.Parse(args); err != nil { fmt.Fprintf(stderr, "docfill: %v\n", err) return docfill.RunResult{}, 2 } if fs.NArg() > 0 { fmt.Fprintf(stderr, "docfill: unexpected argument: %s\n", fs.Arg(0)) return docfill.RunResult{}, 2 } if vars == nil { vars = make(map[string]string) } if configPath == "" { fmt.Fprintln(stderr, "docfill: missing --config") fs.SetOutput(stderr) fs.Usage() return docfill.RunResult{}, 2 } result, err := docfill.RunWithOptions(configPath, docfill.RunOptions{Vars: vars}) if err != nil { fmt.Fprintf(stderr, "docfill: %v\n", err) return docfill.RunResult{}, 1 } return result, 0 } func (v varFlags) String() string { if len(v) == 0 { return "" } parts := make([]string, 0, len(v)) for key, value := range v { parts = append(parts, key+"="+value) } return strings.Join(parts, ",") } func (v varFlags) Set(value string) error { key, val, ok := strings.Cut(value, "=") if !ok || strings.TrimSpace(key) == "" { return fmt.Errorf("invalid --var %q, want key=value", value) } v[strings.TrimSpace(key)] = val return nil }