Files
xls_doc/cmd/docfill/main.go
2026-06-18 20:03:47 +08:00

97 lines
2.2 KiB
Go

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
}