Skip to content

Commit 8b924a5

Browse files
authored
Merge pull request #5111 from thaJeztah/completion_use_apiClient
cli/command: use shallower interface for completions
2 parents ce85b24 + 20d1b66 commit 8b924a5

File tree

7 files changed

+35
-24
lines changed

7 files changed

+35
-24
lines changed

cli/command/completion/functions.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,33 @@ package completion
33
import (
44
"os"
55

6-
"github.com/docker/cli/cli/command"
76
"github.com/docker/cli/cli/command/formatter"
87
"github.com/docker/docker/api/types"
98
"github.com/docker/docker/api/types/container"
109
"github.com/docker/docker/api/types/image"
1110
"github.com/docker/docker/api/types/network"
1211
"github.com/docker/docker/api/types/volume"
12+
"github.com/docker/docker/client"
1313
"github.com/spf13/cobra"
1414
)
1515

1616
// ValidArgsFn a function to be used by cobra command as `ValidArgsFunction` to offer command line completion
1717
type ValidArgsFn func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective)
1818

19+
// APIClientProvider provides a method to get an [client.APIClient], initializing
20+
// it if needed.
21+
//
22+
// It's a smaller interface than [command.Cli], and used in situations where an
23+
// APIClient is needed, but we want to postpone initializing the client until
24+
// it's used.
25+
type APIClientProvider interface {
26+
Client() client.APIClient
27+
}
28+
1929
// ImageNames offers completion for images present within the local store
20-
func ImageNames(dockerCli command.Cli) ValidArgsFn {
30+
func ImageNames(dockerCLI APIClientProvider) ValidArgsFn {
2131
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
22-
list, err := dockerCli.Client().ImageList(cmd.Context(), image.ListOptions{})
32+
list, err := dockerCLI.Client().ImageList(cmd.Context(), image.ListOptions{})
2333
if err != nil {
2434
return nil, cobra.ShellCompDirectiveError
2535
}
@@ -34,9 +44,9 @@ func ImageNames(dockerCli command.Cli) ValidArgsFn {
3444
// ContainerNames offers completion for container names and IDs
3545
// By default, only names are returned.
3646
// Set DOCKER_COMPLETION_SHOW_CONTAINER_IDS=yes to also complete IDs.
37-
func ContainerNames(dockerCli command.Cli, all bool, filters ...func(types.Container) bool) ValidArgsFn {
47+
func ContainerNames(dockerCLI APIClientProvider, all bool, filters ...func(types.Container) bool) ValidArgsFn {
3848
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
39-
list, err := dockerCli.Client().ContainerList(cmd.Context(), container.ListOptions{
49+
list, err := dockerCLI.Client().ContainerList(cmd.Context(), container.ListOptions{
4050
All: all,
4151
})
4252
if err != nil {
@@ -67,9 +77,9 @@ func ContainerNames(dockerCli command.Cli, all bool, filters ...func(types.Conta
6777
}
6878

6979
// VolumeNames offers completion for volumes
70-
func VolumeNames(dockerCli command.Cli) ValidArgsFn {
80+
func VolumeNames(dockerCLI APIClientProvider) ValidArgsFn {
7181
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
72-
list, err := dockerCli.Client().VolumeList(cmd.Context(), volume.ListOptions{})
82+
list, err := dockerCLI.Client().VolumeList(cmd.Context(), volume.ListOptions{})
7383
if err != nil {
7484
return nil, cobra.ShellCompDirectiveError
7585
}
@@ -82,9 +92,9 @@ func VolumeNames(dockerCli command.Cli) ValidArgsFn {
8292
}
8393

8494
// NetworkNames offers completion for networks
85-
func NetworkNames(dockerCli command.Cli) ValidArgsFn {
95+
func NetworkNames(dockerCLI APIClientProvider) ValidArgsFn {
8696
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
87-
list, err := dockerCli.Client().NetworkList(cmd.Context(), network.ListOptions{})
97+
list, err := dockerCLI.Client().NetworkList(cmd.Context(), network.ListOptions{})
8898
if err != nil {
8999
return nil, cobra.ShellCompDirectiveError
90100
}

cli/command/config/cmd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ func NewConfigCommand(dockerCli command.Cli) *cobra.Command {
3030
}
3131

3232
// completeNames offers completion for swarm configs
33-
func completeNames(dockerCli command.Cli) completion.ValidArgsFn {
33+
func completeNames(dockerCLI completion.APIClientProvider) completion.ValidArgsFn {
3434
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
35-
list, err := dockerCli.Client().ConfigList(cmd.Context(), types.ConfigListOptions{})
35+
list, err := dockerCLI.Client().ConfigList(cmd.Context(), types.ConfigListOptions{})
3636
if err != nil {
3737
return nil, cobra.ShellCompDirectiveError
3838
}

cli/command/secret/cmd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ func NewSecretCommand(dockerCli command.Cli) *cobra.Command {
3030
}
3131

3232
// completeNames offers completion for swarm secrets
33-
func completeNames(dockerCli command.Cli) completion.ValidArgsFn {
33+
func completeNames(dockerCLI completion.APIClientProvider) completion.ValidArgsFn {
3434
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
35-
list, err := dockerCli.Client().SecretList(cmd.Context(), types.SecretListOptions{})
35+
list, err := dockerCLI.Client().SecretList(cmd.Context(), types.SecretListOptions{})
3636
if err != nil {
3737
return nil, cobra.ShellCompDirectiveError
3838
}

cli/command/service/cmd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ func NewServiceCommand(dockerCli command.Cli) *cobra.Command {
3535
}
3636

3737
// CompletionFn offers completion for swarm services
38-
func CompletionFn(dockerCli command.Cli) completion.ValidArgsFn {
38+
func CompletionFn(dockerCLI completion.APIClientProvider) completion.ValidArgsFn {
3939
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
40-
list, err := dockerCli.Client().ServiceList(cmd.Context(), types.ServiceListOptions{})
40+
list, err := dockerCLI.Client().ServiceList(cmd.Context(), types.ServiceListOptions{})
4141
if err != nil {
4242
return nil, cobra.ShellCompDirectiveError
4343
}

cli/command/stack/cmd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ func NewStackCommand(dockerCli command.Cli) *cobra.Command {
4646
}
4747

4848
// completeNames offers completion for swarm stacks
49-
func completeNames(dockerCli command.Cli) completion.ValidArgsFn {
49+
func completeNames(dockerCLI completion.APIClientProvider) completion.ValidArgsFn {
5050
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
51-
list, err := swarm.GetStacks(cmd.Context(), dockerCli)
51+
list, err := swarm.GetStacks(cmd.Context(), dockerCLI.Client())
5252
if err != nil {
5353
return nil, cobra.ShellCompDirectiveError
5454
}

cli/command/stack/list.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package stack
22

33
import (
44
"context"
5+
"io"
56
"sort"
67

78
"github.com/docker/cli/cli"
@@ -36,22 +37,22 @@ func newListCommand(dockerCli command.Cli) *cobra.Command {
3637

3738
// RunList performs a stack list against the specified swarm cluster
3839
func RunList(ctx context.Context, dockerCli command.Cli, opts options.List) error {
39-
ss, err := swarm.GetStacks(ctx, dockerCli)
40+
ss, err := swarm.GetStacks(ctx, dockerCli.Client())
4041
if err != nil {
4142
return err
4243
}
4344
stacks := make([]*formatter.Stack, 0, len(ss))
4445
stacks = append(stacks, ss...)
45-
return format(dockerCli, opts, stacks)
46+
return format(dockerCli.Out(), opts, stacks)
4647
}
4748

48-
func format(dockerCli command.Cli, opts options.List, stacks []*formatter.Stack) error {
49+
func format(out io.Writer, opts options.List, stacks []*formatter.Stack) error {
4950
fmt := formatter.Format(opts.Format)
5051
if fmt == "" || fmt == formatter.TableFormatKey {
5152
fmt = formatter.SwarmStackTableFormat
5253
}
5354
stackCtx := formatter.Context{
54-
Output: dockerCli.Out(),
55+
Output: out,
5556
Format: fmt,
5657
}
5758
sort.Slice(stacks, func(i, j int) bool {

cli/command/stack/swarm/list.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ package swarm
33
import (
44
"context"
55

6-
"github.com/docker/cli/cli/command"
76
"github.com/docker/cli/cli/command/stack/formatter"
87
"github.com/docker/cli/cli/compose/convert"
98
"github.com/docker/docker/api/types"
9+
"github.com/docker/docker/client"
1010
"github.com/pkg/errors"
1111
)
1212

1313
// GetStacks lists the swarm stacks.
14-
func GetStacks(ctx context.Context, dockerCli command.Cli) ([]*formatter.Stack, error) {
15-
services, err := dockerCli.Client().ServiceList(
14+
func GetStacks(ctx context.Context, apiClient client.ServiceAPIClient) ([]*formatter.Stack, error) {
15+
services, err := apiClient.ServiceList(
1616
ctx,
1717
types.ServiceListOptions{Filters: getAllStacksFilter()})
1818
if err != nil {

0 commit comments

Comments
 (0)