package main import ( "fmt" "log/slog" "os" "codeflow.dananglin.me.uk/apollo/spruce/internal/cmd" ) type Runner interface { Parse([]string) error Name() string Run() error } var ( binaryVersion string buildTime string goVersion string gitCommit string ) func main() { logOptions := slog.HandlerOptions{ AddSource: false, } logger := slog.New(slog.NewTextHandler(os.Stdout, &logOptions)) slog.SetDefault(logger) commandMap := map[string]Runner{ "version": cmd.NewVersionCommand( binaryVersion, buildTime, goVersion, gitCommit, ), "generate": cmd.NewGenerateCommand(), "create": cmd.NewCreateCommand(), } subcommand := os.Args[1] runner, ok := commandMap[subcommand] if !ok { slog.Error("unknown subcommand", "subcommand", subcommand) os.Exit(1) } if err := runner.Parse(os.Args[2:]); err != nil { slog.Error(fmt.Sprintf("unable to parse the command line flags; %v.", err)) os.Exit(1) } if err := runner.Run(); err != nil { slog.Error(fmt.Sprintf("unable to run '%s'; %v.", runner.Name(), err)) os.Exit(1) } }