spruce/main.go
Dan Anglin 90638f5569
fix: customised usage messages
Add functionality to display the default help message when running
spruce without any arguments or when the help flag is used.

Customise the help message for the subcommands.

Additional changes:

- Refactor: move the Runner interface to the internal cmd package
- Fix: Add a summary for each of the subcommands.
- Refactor: Use string builder to replace string literals.
- Perf: Use a switch statement to only create the subcommand that the
  user calls.
2023-08-13 17:45:33 +01:00

65 lines
1.2 KiB
Go

package main
import (
"fmt"
"log/slog"
"os"
"codeflow.dananglin.me.uk/apollo/spruce/internal/cmd"
)
var (
binaryVersion string
buildTime string
goVersion string
gitCommit string
)
func main() {
args := os.Args[1:]
if len(args) < 1 || args[0] == "--help" || args[0] == "-h" || args[0] == "help" || args[0] == "-help" {
cmd.SpruceUsage()
os.Exit(0)
}
logOptions := slog.HandlerOptions{
AddSource: false,
}
logger := slog.New(slog.NewTextHandler(os.Stdout, &logOptions))
slog.SetDefault(logger)
subcommand := args[0]
var runner cmd.Runner
switch subcommand {
case "version":
runner = cmd.NewVersionCommand(
binaryVersion,
buildTime,
goVersion,
gitCommit,
)
case "generate":
runner = cmd.NewGenerateCommand()
case "create":
runner = cmd.NewCreateCommand()
default:
slog.Error("unknown subcommand", "subcommand", subcommand)
cmd.SpruceUsage()
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)
}
}