github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/cmd/syft/internal/clio_setup_config.go (about) 1 package internal 2 3 import ( 4 "io" 5 "os" 6 7 "github.com/anchore/clio" 8 "github.com/anchore/stereoscope" 9 ui2 "github.com/anchore/syft/cmd/syft/cli/ui" 10 "github.com/anchore/syft/cmd/syft/internal/ui" 11 "github.com/anchore/syft/internal/bus" 12 "github.com/anchore/syft/internal/log" 13 "github.com/anchore/syft/internal/redact" 14 ) 15 16 func AppClioSetupConfig(id clio.Identification, out io.Writer) *clio.SetupConfig { 17 clioCfg := clio.NewSetupConfig(id). 18 WithGlobalConfigFlag(). // add persistent -c <path> for reading an application config from 19 WithGlobalLoggingFlags(). // add persistent -v and -q flags tied to the logging config 20 WithConfigInRootHelp(). // --help on the root command renders the full application config in the help text 21 WithUIConstructor( 22 // select a UI based on the logging configuration and state of stdin (if stdin is a tty) 23 func(cfg clio.Config) ([]clio.UI, error) { 24 noUI := ui.None(out, cfg.Log.Quiet) 25 if !cfg.Log.AllowUI(os.Stdin) || cfg.Log.Quiet { 26 return []clio.UI{noUI}, nil 27 } 28 29 return []clio.UI{ 30 ui.New(out, cfg.Log.Quiet, 31 ui2.New(ui2.DefaultHandlerConfig()), 32 ), 33 noUI, 34 }, nil 35 }, 36 ). 37 WithInitializers( 38 func(state *clio.State) error { 39 // clio is setting up and providing the bus, redact store, and logger to the application. Once loaded, 40 // we can hoist them into the internal packages for global use. 41 stereoscope.SetBus(state.Bus) 42 bus.Set(state.Bus) 43 44 redact.Set(state.RedactStore) 45 46 log.Set(state.Logger) 47 stereoscope.SetLogger(state.Logger) 48 return nil 49 }, 50 ). 51 WithPostRuns(func(_ *clio.State, _ error) { 52 stereoscope.Cleanup() 53 }) 54 return clioCfg 55 }