v2/tools/generator/root.go (80 lines of code) (raw):

/* * Copyright (c) Microsoft Corporation. * Licensed under the MIT license. */ package main import ( "context" "os" "github.com/go-logr/logr" "github.com/go-logr/zerologr" "github.com/rs/zerolog" "github.com/spf13/cobra" "github.com/Azure/azure-service-operator/v2/internal/version" "github.com/Azure/azure-service-operator/v2/pkg/xcontext" ) // Execute kicks off the command line func Execute() { cmd, err := newRootCommand() if err != nil { log := CreateLogger() log.Error(err, "failed to create root command") return } ctx := xcontext.MakeInterruptibleContext(context.Background()) if err := cmd.ExecuteContext(ctx); err != nil { log := CreateLogger() log.Error(err, "failed to execute root command") os.Exit(1) } } func newRootCommand() (*cobra.Command, error) { rootCmd := &cobra.Command{ Use: "aso-gen", Short: "aso-gen provides a cmdline interface for generating Azure Service Operator types from Azure deployment template schema", TraverseChildren: true, SilenceErrors: true, // We show errors ourselves using our logger SilenceUsage: true, // Let users ask for usage themselves } rootCmd.Flags().SortFlags = false rootCmd.PersistentFlags().BoolVar(&verbose, "verbose", false, "Enable verbose logging") rootCmd.PersistentFlags().BoolVar(&quiet, "quiet", false, "Suppress non-error logging") rootCmd.PersistentFlags().BoolVar(&trace, "trace", false, "Enable trace logging (very verbose)") rootCmd.MarkFlagsMutuallyExclusive("verbose", "quiet", "trace") cmdFuncs := []func() (*cobra.Command, error){ NewGenTypesCommand, NewGenKustomizeCommand, version.NewCommand, } for _, f := range cmdFuncs { cmd, err := f() if err != nil { return rootCmd, err } rootCmd.AddCommand(cmd) } rootCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) { // Configure logging; --trace overrides --verbose overrides --quiet if trace { zerologr.SetMaxV(2) } else if verbose { zerologr.SetMaxV(1) } else if quiet { // Can't use zerologr.SetMaxV(-1) zerolog.SetGlobalLevel(zerolog.ErrorLevel) } else { zerologr.SetMaxV(0) } } return rootCmd, nil } var ( quiet bool trace bool verbose bool ) // CreateLogger creates a logger for console output. func CreateLogger() logr.Logger { // Configure console writer for ZeroLog output := zerolog.ConsoleWriter{ Out: os.Stderr, // Write to StdErr TimeFormat: "15:04:05.999", // Display time to the millisecond } // Create zerolog logger zl := zerolog.New(output). With().Timestamp(). Logger() // Use standard interface for logging zerologr.VerbosityFieldName = "" // Don't include verbosity in output log := zerologr.New(&zl) return log }