Move the command tree into internal/cli (closes #8)
check / check (push) Successful in 1m40s
check / check (push) Successful in 1m40s
`cmd/simplexcalc/` now holds only `main.go`, whose body is one call, `os.Exit(cli.Main(version))`, as the Go style guide requires. The command tree and the `run` and `version` commands moved unchanged into `internal/cli`, with tests for `version` and for an unknown command. Output streams, exit statuses and the `-X main.version` build flag are as before. Disclosure: the comment in `execute` saying cobra has already printed the error is false, since the root command silences cobra's errors; it moved unchanged and is left for a follow-up. Model: opus-5-5
This commit was merged in pull request #9.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"runtime"
|
||||
"syscall"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"sneak.berlin/go/simplexcalc/internal/bot"
|
||||
"sneak.berlin/go/simplexcalc/internal/config"
|
||||
"sneak.berlin/go/simplexcalc/internal/logger"
|
||||
)
|
||||
|
||||
func runCmd(version string) *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "run",
|
||||
Short: "run the bot",
|
||||
Args: cobra.NoArgs,
|
||||
RunE: func(cmd *cobra.Command, _ []string) error {
|
||||
return run(cmd.Context(), version)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// run reads the configuration and runs the bot until SIGINT or SIGTERM,
|
||||
// or until it fails. A failure is the process's exit status, so a
|
||||
// supervisor restarts it.
|
||||
func run(ctx context.Context, version string) error {
|
||||
cfg, err := config.New()
|
||||
if err != nil {
|
||||
return fmt.Errorf("reading configuration: %w", err)
|
||||
}
|
||||
|
||||
log := logger.New(os.Stdout, cfg.Debug)
|
||||
log.Info("starting",
|
||||
"appname", appname,
|
||||
"version", version,
|
||||
"arch", runtime.GOARCH,
|
||||
"data_dir", cfg.DataDir,
|
||||
)
|
||||
|
||||
ctx, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
err = bot.Run(ctx, log, cfg.DataDir)
|
||||
if err != nil {
|
||||
log.Error("stopped", "error", err)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
log.Info("stopped")
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user