From c2ecd4e416d4321fff27d79b6500ea228697a713 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Thu, 9 Nov 2023 12:46:00 +0100 Subject: [PATCH] refactor(cli): extract workspace list parameters --- cli/cliui/filter.go | 63 +++++++++++++++++++++++++++++++++++++++++++++ cli/list.go | 30 +++------------------ 2 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 cli/cliui/filter.go diff --git a/cli/cliui/filter.go b/cli/cliui/filter.go new file mode 100644 index 0000000000000..7246374d60d31 --- /dev/null +++ b/cli/cliui/filter.go @@ -0,0 +1,63 @@ +package cliui + +import ( + "github.com/coder/coder/v2/cli/clibase" + "github.com/coder/coder/v2/codersdk" +) + +var defaultQuery = "owner:me" + +// WorkspaceFilter wraps codersdk.WorkspaceFilter +// and allows easy integration to a CLI command. +// Example usage: +// +// func (r *RootCmd) MyCmd() *clibase.Cmd { +// var ( +// filter cliui.WorkspaceFilter +// ... +// ) +// cmd := &clibase.Cmd{ +// ... +// } +// filter.AttachOptions(&cmd.Options) +// ... +// return cmd +// } +// +// The above will add the following flags to the command: +// --all +// --search +type WorkspaceFilter struct { + searchQuery string + all bool +} + +func (w *WorkspaceFilter) Filter() codersdk.WorkspaceFilter { + var f codersdk.WorkspaceFilter + if w.all { + return f + } + f.FilterQuery = w.searchQuery + if f.FilterQuery == "" { + f.FilterQuery = defaultQuery + } + return f +} + +func (w *WorkspaceFilter) AttachOptions(opts *clibase.OptionSet) { + *opts = append(*opts, + clibase.Option{ + Flag: "all", + FlagShorthand: "a", + Description: "Specifies whether all workspaces will be listed or not.", + + Value: clibase.BoolOf(&w.all), + }, + clibase.Option{ + Flag: "search", + Description: "Search for a workspace with a query.", + Default: defaultQuery, + Value: clibase.StringOf(&w.searchQuery), + }, + ) +} diff --git a/cli/list.go b/cli/list.go index b82d6f31579bf..f7479e789978f 100644 --- a/cli/list.go +++ b/cli/list.go @@ -77,9 +77,7 @@ func workspaceListRowFromWorkspace(now time.Time, usersByID map[uuid.UUID]coders func (r *RootCmd) list() *clibase.Cmd { var ( - all bool - defaultQuery = "owner:me" - searchQuery string + filter cliui.WorkspaceFilter displayWorkspaces []workspaceListRow formatter = cliui.NewOutputFormatter( cliui.TableFormat( @@ -109,14 +107,7 @@ func (r *RootCmd) list() *clibase.Cmd { r.InitClient(client), ), Handler: func(inv *clibase.Invocation) error { - filter := codersdk.WorkspaceFilter{ - FilterQuery: searchQuery, - } - if all && searchQuery == defaultQuery { - filter.FilterQuery = "" - } - - res, err := client.Workspaces(inv.Context(), filter) + res, err := client.Workspaces(inv.Context(), filter.Filter()) if err != nil { return err } @@ -153,22 +144,7 @@ func (r *RootCmd) list() *clibase.Cmd { return err }, } - cmd.Options = clibase.OptionSet{ - { - Flag: "all", - FlagShorthand: "a", - Description: "Specifies whether all workspaces will be listed or not.", - - Value: clibase.BoolOf(&all), - }, - { - Flag: "search", - Description: "Search for a workspace with a query.", - Default: defaultQuery, - Value: clibase.StringOf(&searchQuery), - }, - } - + filter.AttachOptions(&cmd.Options) formatter.AttachOptions(&cmd.Options) return cmd }