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  }