// Package cli builds the command tree and runs it. package cli import ( "errors" "fmt" "os" "git.eeqj.de/sneak/keyfunc/internal/cli/options" "git.eeqj.de/sneak/keyfunc/internal/cli/ssh" "github.com/spf13/cobra" ) // Version is what --version prints. The build sets it. // //nolint:gochecknoglobals // set at build time with -ldflags var Version = "dev" // Root returns the whole command tree. func Root() *cobra.Command { root := &cobra.Command{ Use: "keyfunc", Short: "derive key pairs from a BIP-39 mnemonic", Long: "keyfunc turns a BIP-39 mnemonic into key pairs that can " + "be recreated from that mnemonic at any time. The same " + "mnemonic, key type and index always give the same key.", Version: Version, SilenceUsage: true, SilenceErrors: true, } options.Add(root) root.AddCommand(ssh.Command()) return root } // Main runs the tool and returns the status the process should exit // with. An error ends the tool with status 1, except when it carries a // status of its own, which "ssh to" uses to hand on the status ssh // ended with. ssh has already said whatever it had to say in that // case, so nothing more is printed. func Main() int { err := Root().Execute() if err == nil { return 0 } var passed ssh.StatusError if errors.As(err, &passed) { return passed.Status } fmt.Fprintln(os.Stderr, "keyfunc: "+err.Error()) return 1 }