package cli import ( "fmt" "runtime" "github.com/spf13/cobra" ) // rootCmd builds the command tree. Configuration comes from the // environment (see internal/config), not from flags: the bot runs in a // container, where the environment is the interface, and one source of // truth means there is no precedence rule to get wrong. func rootCmd(version string) *cobra.Command { root := &cobra.Command{ Use: appname, Short: appname + " — a SimpleX Chat bot that answers arithmetic", Long: appname + " is a SimpleX Chat bot that answers arithmetic.\n\n" + "It runs the simplex-chat command-line client, which must be on\n" + "PATH. Configuration is read from the environment and from an\n" + "optional .env file in the working directory. See README.md\n" + "for the full list of variables.", SilenceUsage: true, // Without this, cobra prints the error itself and main prints // it again. SilenceErrors: true, } root.AddCommand(runCmd(version), versionCmd(version)) return root } func versionCmd(version string) *cobra.Command { return &cobra.Command{ Use: "version", Short: "print the version and exit", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { _, err := fmt.Fprintf(cmd.OutOrStdout(), "%s %s %s/%s\n", appname, version, runtime.GOOS, runtime.GOARCH) if err != nil { return fmt.Errorf("writing version: %w", err) } return nil }, } }