package command import ( "context" "io" "os" "strconv" "github.com/docker/cli/cli/streams" "github.com/docker/docker/client" "github.com/moby/term" ) // CLIOption is a functional argument to apply options to a [DockerCli]. These // options can be passed to [NewDockerCli] to initialize a new CLI, or // applied with [DockerCli.Initialize] or [DockerCli.Apply]. type CLIOption func(cli *DockerCli) error // WithStandardStreams sets a cli in, out and err streams with the standard streams. func WithStandardStreams() CLIOption { return func(cli *DockerCli) error { // Set terminal emulation based on platform as required. stdin, stdout, stderr := term.StdStreams() cli.in = streams.NewIn(stdin) cli.out = streams.NewOut(stdout) cli.err = streams.NewOut(stderr) return nil } } // WithBaseContext sets the base context of a cli. It is used to propagate // the context from the command line to the client. func WithBaseContext(ctx context.Context) CLIOption { return func(cli *DockerCli) error { cli.baseCtx = ctx return nil } } // WithCombinedStreams uses the same stream for the output and error streams. func WithCombinedStreams(combined io.Writer) CLIOption { return func(cli *DockerCli) error { s := streams.NewOut(combined) cli.out = s cli.err = s return nil } } // WithInputStream sets a cli input stream. func WithInputStream(in io.ReadCloser) CLIOption { return func(cli *DockerCli) error { cli.in = streams.NewIn(in) return nil } } // WithOutputStream sets a cli output stream. func WithOutputStream(out io.Writer) CLIOption { return func(cli *DockerCli) error { cli.out = streams.NewOut(out) return nil } } // WithErrorStream sets a cli error stream. func WithErrorStream(err io.Writer) CLIOption { return func(cli *DockerCli) error { cli.err = streams.NewOut(err) return nil } } // WithContentTrustFromEnv enables content trust on a cli from environment variable DOCKER_CONTENT_TRUST value. func WithContentTrustFromEnv() CLIOption { return func(cli *DockerCli) error { cli.contentTrust = false if e := os.Getenv("DOCKER_CONTENT_TRUST"); e != "" { if t, err := strconv.ParseBool(e); t || err != nil { // treat any other value as true cli.contentTrust = true } } return nil } } // WithContentTrust enables content trust on a cli. func WithContentTrust(enabled bool) CLIOption { return func(cli *DockerCli) error { cli.contentTrust = enabled return nil } } // WithDefaultContextStoreConfig configures the cli to use the default context store configuration. func WithDefaultContextStoreConfig() CLIOption { return func(cli *DockerCli) error { cli.contextStoreConfig = DefaultContextStoreConfig() return nil } } // WithAPIClient configures the cli to use the given API client. func WithAPIClient(c client.APIClient) CLIOption { return func(cli *DockerCli) error { cli.client = c return nil } }