Skip to content

Commit 8a7f0e9

Browse files
authored
refactor(cli): extract workspace list parameters (#10605)
Extracts the --search and --all parameters to a separate struct in cliui.
1 parent 473585d commit 8a7f0e9

File tree

2 files changed

+66
-27
lines changed

2 files changed

+66
-27
lines changed

cli/cliui/filter.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package cliui
2+
3+
import (
4+
"github.com/coder/coder/v2/cli/clibase"
5+
"github.com/coder/coder/v2/codersdk"
6+
)
7+
8+
var defaultQuery = "owner:me"
9+
10+
// WorkspaceFilter wraps codersdk.WorkspaceFilter
11+
// and allows easy integration to a CLI command.
12+
// Example usage:
13+
//
14+
// func (r *RootCmd) MyCmd() *clibase.Cmd {
15+
// var (
16+
// filter cliui.WorkspaceFilter
17+
// ...
18+
// )
19+
// cmd := &clibase.Cmd{
20+
// ...
21+
// }
22+
// filter.AttachOptions(&cmd.Options)
23+
// ...
24+
// return cmd
25+
// }
26+
//
27+
// The above will add the following flags to the command:
28+
// --all
29+
// --search
30+
type WorkspaceFilter struct {
31+
searchQuery string
32+
all bool
33+
}
34+
35+
func (w *WorkspaceFilter) Filter() codersdk.WorkspaceFilter {
36+
var f codersdk.WorkspaceFilter
37+
if w.all {
38+
return f
39+
}
40+
f.FilterQuery = w.searchQuery
41+
if f.FilterQuery == "" {
42+
f.FilterQuery = defaultQuery
43+
}
44+
return f
45+
}
46+
47+
func (w *WorkspaceFilter) AttachOptions(opts *clibase.OptionSet) {
48+
*opts = append(*opts,
49+
clibase.Option{
50+
Flag: "all",
51+
FlagShorthand: "a",
52+
Description: "Specifies whether all workspaces will be listed or not.",
53+
54+
Value: clibase.BoolOf(&w.all),
55+
},
56+
clibase.Option{
57+
Flag: "search",
58+
Description: "Search for a workspace with a query.",
59+
Default: defaultQuery,
60+
Value: clibase.StringOf(&w.searchQuery),
61+
},
62+
)
63+
}

cli/list.go

+3-27
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ func workspaceListRowFromWorkspace(now time.Time, usersByID map[uuid.UUID]coders
7777

7878
func (r *RootCmd) list() *clibase.Cmd {
7979
var (
80-
all bool
81-
defaultQuery = "owner:me"
82-
searchQuery string
80+
filter cliui.WorkspaceFilter
8381
displayWorkspaces []workspaceListRow
8482
formatter = cliui.NewOutputFormatter(
8583
cliui.TableFormat(
@@ -109,14 +107,7 @@ func (r *RootCmd) list() *clibase.Cmd {
109107
r.InitClient(client),
110108
),
111109
Handler: func(inv *clibase.Invocation) error {
112-
filter := codersdk.WorkspaceFilter{
113-
FilterQuery: searchQuery,
114-
}
115-
if all && searchQuery == defaultQuery {
116-
filter.FilterQuery = ""
117-
}
118-
119-
res, err := client.Workspaces(inv.Context(), filter)
110+
res, err := client.Workspaces(inv.Context(), filter.Filter())
120111
if err != nil {
121112
return err
122113
}
@@ -153,22 +144,7 @@ func (r *RootCmd) list() *clibase.Cmd {
153144
return err
154145
},
155146
}
156-
cmd.Options = clibase.OptionSet{
157-
{
158-
Flag: "all",
159-
FlagShorthand: "a",
160-
Description: "Specifies whether all workspaces will be listed or not.",
161-
162-
Value: clibase.BoolOf(&all),
163-
},
164-
{
165-
Flag: "search",
166-
Description: "Search for a workspace with a query.",
167-
Default: defaultQuery,
168-
Value: clibase.StringOf(&searchQuery),
169-
},
170-
}
171-
147+
filter.AttachOptions(&cmd.Options)
172148
formatter.AttachOptions(&cmd.Options)
173149
return cmd
174150
}

0 commit comments

Comments
 (0)