github.com/kamilsk/grafaman@v1.0.0-beta3.0.20201207211242-3e0d02dd84ce/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "os" 8 "runtime/debug" 9 10 "go.octolab.org/errors" 11 "go.octolab.org/safe" 12 "go.octolab.org/toolkit/cli/cobra" 13 "go.octolab.org/unsafe" 14 15 "github.com/kamilsk/grafaman/internal/cmd" 16 "github.com/kamilsk/grafaman/internal/cnf" 17 ) 18 19 const unknown = "unknown" 20 21 var ( 22 commit = unknown 23 date = unknown 24 version = "dev" 25 exit = os.Exit 26 stderr = io.Writer(os.Stderr) 27 stdout = io.Writer(os.Stdout) 28 ) 29 30 func init() { 31 if info, available := debug.ReadBuildInfo(); available && commit == unknown { 32 version = info.Main.Version 33 commit = fmt.Sprintf("%s, mod sum: %s", commit, info.Main.Sum) 34 } 35 } 36 37 func main() { 38 ctx, cancel := context.WithCancel(context.Background()) 39 defer cancel() 40 root := cmd.New() 41 root.SetErr(stderr) 42 root.SetOut(stdout) 43 root.AddCommand( 44 cobra.NewCompletionCommand(), 45 cobra.NewVersionCommand(version, date, commit, cnf.Features...), 46 ) 47 safe.Do(func() error { return root.ExecuteContext(ctx) }, shutdown) 48 } 49 50 func shutdown(err error) { 51 if recovered, is := errors.Unwrap(err).(errors.Recovered); is { 52 unsafe.DoSilent(fmt.Fprintf(stderr, "recovered: %+v\n", recovered.Cause())) 53 unsafe.DoSilent(fmt.Fprintln(stderr, "---")) 54 unsafe.DoSilent(fmt.Fprintf(stderr, "%+v\n", err)) 55 } 56 exit(1) 57 }