package cli import ( "context" "fmt" "io" "runtime" "text/tabwriter" "edge-infra.dev/pkg/lib/build" "edge-infra.dev/pkg/lib/cli/rags" "edge-infra.dev/pkg/lib/cli/sink" ) // NewVersionCmd creates a standard [edge-infra.dev/pkg/lib/cli/sink.Command] // for exposing version information in a CLI. func NewVersionCmd(v *build.Version) *sink.Command { var ( short bool commit bool ) versionCmd := &sink.Command{ Use: "version [flags]", Short: "Print CLI version information", Flags: []*rags.Rag{ { Name: "commit", Short: "c", Usage: "Only print the versions commit hash", Value: &rags.Bool{Var: &commit}, }, { Name: "short", Short: "s", Usage: "Only print the machine-readable semantic version string", Value: &rags.Bool{Var: &short}, }, }, Exec: func(_ context.Context, r sink.Run) error { if short { fmt.Fprintln(r.Out(), v.String()) return nil } if commit { fmt.Fprintln(r.Out(), v.Commit) return nil } Version(r.Out(), v) return nil }, } return versionCmd } // Version writes a CLI-friendly string representation of build.Version v to // w. func Version(w io.Writer, v *build.Version) { tw := tabwriter.NewWriter(w, 8, 2, 2, ' ', 0) defer tw.Flush() fmt.Fprintln(tw, v.String()+"\t\t") fmt.Fprintln(tw) if v.ReleaseCandidate { fmt.Fprintln(tw, "Release candidate:\t"+v.RCIdentifierStr()+"\t") } fmt.Fprintln(tw, "Commit:\t"+v.Commit+"\t") fmt.Fprintln(tw, "Timestamp:\t"+v.Date().String()+"\t") fmt.Fprintln(tw, "Go Version:\t"+runtime.Version()+"\t") fmt.Fprintln(tw, "Go Compiler:\t"+runtime.Compiler+"\t") fmt.Fprintln(tw, "Go Platform:\t"+runtime.GOOS+"/"+runtime.GOARCH+"\t") }