Skip to content

Commit 1e94877

Browse files
authored
feat(autocomplete): pass partial request to autocompleteFunc (#3693)
1 parent b968c03 commit 1e94877

File tree

9 files changed

+55
-17
lines changed

9 files changed

+55
-17
lines changed

internal/core/autocomplete.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const (
3737

3838
// AutoCompleteArgFunc is the function called to complete arguments values.
3939
// It is retrieved from core.ArgSpec.AutoCompleteFunc.
40-
type AutoCompleteArgFunc func(ctx context.Context, prefix string) AutocompleteSuggestions
40+
type AutoCompleteArgFunc func(ctx context.Context, prefix string, request any) AutocompleteSuggestions
4141

4242
// AutoCompleteNode is a node in the AutoComplete Tree.
4343
// An AutoCompleteNode can either represent a command, a subcommand, or a command argument.
@@ -361,7 +361,7 @@ func AutoCompleteArgValue(ctx context.Context, cmd *Command, argSpec *ArgSpec, a
361361
return nil
362362
}
363363
if argSpec.AutoCompleteFunc != nil {
364-
return argSpec.AutoCompleteFunc(ctx, argValuePrefix)
364+
return argSpec.AutoCompleteFunc(ctx, argValuePrefix, requestFromCompletedArgs(cmd, completedArgs))
365365
}
366366

367367
possibleValues := []string(nil)

internal/core/autocomplete_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func testAutocompleteGetCommands() *Commands {
2929
},
3030
{
3131
Name: "size",
32-
AutoCompleteFunc: func(_ context.Context, prefix string) AutocompleteSuggestions {
32+
AutoCompleteFunc: func(_ context.Context, prefix string, _ any) AutocompleteSuggestions {
3333
return []string{regexp.MustCompile("[a-z]").ReplaceAllString(prefix, "")}
3434
},
3535
EnumValues: []string{"S", "M", "L", "XL", "XXL"},

internal/core/autocomplete_utils.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func getGlobalFlags(ctx context.Context) []FlagSpec {
5959
}
6060

6161
func AutocompleteProfileName() AutoCompleteArgFunc {
62-
return func(ctx context.Context, prefix string) AutocompleteSuggestions {
62+
return func(ctx context.Context, prefix string, _ any) AutocompleteSuggestions {
6363
res := AutocompleteSuggestions(nil)
6464
configPath := ExtractConfigPath(ctx)
6565
config, err := scw.LoadConfigFromPath(configPath)
@@ -204,3 +204,19 @@ func listRawArgsLocalities(completedArgs map[string]string, cmd *Command) []stri
204204
}
205205
return listRawArgs
206206
}
207+
208+
func flattenCompleteArgs(completedArgs map[string]string) []string {
209+
rawArgs := make([]string, 0, len(completedArgs))
210+
for arg, value := range completedArgs {
211+
rawArgs = append(rawArgs, arg+value) // "region=" + "nl-ams"
212+
}
213+
214+
return rawArgs
215+
}
216+
217+
func requestFromCompletedArgs(cmd *Command, completedArgs map[string]string) any {
218+
request := reflect.New(cmd.ArgsType).Interface()
219+
_ = args.UnmarshalStruct(flattenCompleteArgs(completedArgs), request)
220+
221+
return request
222+
}

internal/namespaces/iam/v1alpha1/custom.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func GetCommands() *core.Commands {
4848

4949
// Autocomplete permission set names using IAM API.
5050
cmds.MustFind("iam", "policy", "create").Override(func(c *core.Command) *core.Command {
51-
c.ArgSpecs.GetByName("rules.{index}.permission-set-names.{index}").AutoCompleteFunc = func(ctx context.Context, _ string) core.AutocompleteSuggestions {
51+
c.ArgSpecs.GetByName("rules.{index}.permission-set-names.{index}").AutoCompleteFunc = func(ctx context.Context, _ string, _ any) core.AutocompleteSuggestions {
5252
client := core.ExtractClient(ctx)
5353
api := iam.NewAPI(client)
5454
// TODO: store result in a CLI cache

internal/namespaces/instance/v1/custom_server.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,12 @@ func serverUpdateBuilder(c *core.Command) *core.Command {
323323

324324
func serverGetBuilder(c *core.Command) *core.Command {
325325
// This method is here as a proof of concept before we find the correct way to implement it at larger scale
326-
c.ArgSpecs.GetPositionalArg().AutoCompleteFunc = func(ctx context.Context, prefix string) core.AutocompleteSuggestions {
326+
c.ArgSpecs.GetPositionalArg().AutoCompleteFunc = func(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {
327+
req := request.(*instance.GetServerRequest)
327328
api := instance.NewAPI(core.ExtractClient(ctx))
328-
resp, err := api.ListServers(&instance.ListServersRequest{}, scw.WithAllPages())
329+
resp, err := api.ListServers(&instance.ListServersRequest{
330+
Zone: req.Zone,
331+
}, scw.WithAllPages())
329332
if err != nil {
330333
return nil
331334
}

internal/namespaces/instance/v1/custom_server_create.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ func sanitizeVolumeMap(serverName string, volumes map[string]*instance.VolumeSer
727727
// Caching listImage response for shell completion
728728
var completeListImagesCache *marketplace.ListImagesResponse
729729

730-
func instanceServerCreateImageAutoCompleteFunc(ctx context.Context, prefix string) core.AutocompleteSuggestions {
730+
func instanceServerCreateImageAutoCompleteFunc(ctx context.Context, prefix string, _ any) core.AutocompleteSuggestions {
731731
suggestions := core.AutocompleteSuggestions(nil)
732732

733733
client := core.ExtractClient(ctx)

internal/namespaces/instance/v1/helpers_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ var serverTypes = []string{
6868
"H100-2-80G",
6969
}
7070

71-
func completeServerType(_ context.Context, prefix string) core.AutocompleteSuggestions {
71+
func completeServerType(_ context.Context, prefix string, _ any) core.AutocompleteSuggestions {
7272
suggestions := []string(nil)
7373

7474
for _, serverType := range serverTypes {

internal/namespaces/k8s/v1/custom_cluster.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,14 +441,17 @@ func k8sClusterWaitCommand() *core.Command {
441441
// Caching ListClusterTypes response for shell completion
442442
var completeListClusterTypesCache *k8s.ListClusterTypesResponse
443443

444-
func autocompleteClusterType(ctx context.Context, prefix string) core.AutocompleteSuggestions {
444+
func autocompleteClusterType(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {
445+
req := request.(*k8s.CreateClusterRequest)
445446
suggestions := core.AutocompleteSuggestions(nil)
446447

447448
client := core.ExtractClient(ctx)
448449
api := k8s.NewAPI(client)
449450

450451
if completeListClusterTypesCache == nil {
451-
res, err := api.ListClusterTypes(&k8s.ListClusterTypesRequest{})
452+
res, err := api.ListClusterTypes(&k8s.ListClusterTypesRequest{
453+
Region: req.Region,
454+
})
452455
if err != nil {
453456
return nil
454457
}
@@ -467,14 +470,17 @@ func autocompleteClusterType(ctx context.Context, prefix string) core.Autocomple
467470
// Caching ListK8SVersions response for shell completion
468471
var completeListK8SVersionsCache *k8s.ListVersionsResponse
469472

470-
func autocompleteK8SVersion(ctx context.Context, prefix string) core.AutocompleteSuggestions {
473+
func autocompleteK8SVersion(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {
474+
req := request.(*k8s.CreateClusterRequest)
471475
suggestions := core.AutocompleteSuggestions(nil)
472476

473477
client := core.ExtractClient(ctx)
474478
api := k8s.NewAPI(client)
475479

476480
if completeListK8SVersionsCache == nil {
477-
res, err := api.ListVersions(&k8s.ListVersionsRequest{})
481+
res, err := api.ListVersions(&k8s.ListVersionsRequest{
482+
Region: req.Region,
483+
})
478484
if err != nil {
479485
return nil
480486
}

internal/namespaces/rdb/v1/custom_instance.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,24 @@ var completeListNodeTypeCache *rdb.ListNodeTypesResponse
170170

171171
var completeListEngineCache *rdb.ListDatabaseEnginesResponse
172172

173-
func autoCompleteNodeType(ctx context.Context, prefix string) core.AutocompleteSuggestions {
173+
func autoCompleteNodeType(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {
174+
region := scw.Region("")
175+
switch req := request.(type) {
176+
case *rdb.CreateInstanceRequest:
177+
region = req.Region
178+
case *rdb.UpgradeInstanceRequest:
179+
region = req.Region
180+
}
181+
174182
suggestions := core.AutocompleteSuggestions(nil)
175183

176184
client := core.ExtractClient(ctx)
177185
api := rdb.NewAPI(client)
178186

179187
if completeListNodeTypeCache == nil {
180-
res, err := api.ListNodeTypes(&rdb.ListNodeTypesRequest{}, scw.WithAllPages())
188+
res, err := api.ListNodeTypes(&rdb.ListNodeTypesRequest{
189+
Region: region,
190+
}, scw.WithAllPages())
181191
if err != nil {
182192
return nil
183193
}
@@ -193,13 +203,16 @@ func autoCompleteNodeType(ctx context.Context, prefix string) core.AutocompleteS
193203
return suggestions
194204
}
195205

196-
func autoCompleteDatabaseEngines(ctx context.Context, prefix string) core.AutocompleteSuggestions {
206+
func autoCompleteDatabaseEngines(ctx context.Context, prefix string, request any) core.AutocompleteSuggestions {
207+
req := request.(*rdb.CreateInstanceRequest)
197208
suggestion := core.AutocompleteSuggestions(nil)
198209
client := core.ExtractClient(ctx)
199210
api := rdb.NewAPI(client)
200211

201212
if completeListEngineCache == nil {
202-
res, err := api.ListDatabaseEngines(&rdb.ListDatabaseEnginesRequest{}, scw.WithAllPages())
213+
res, err := api.ListDatabaseEngines(&rdb.ListDatabaseEnginesRequest{
214+
Region: req.Region,
215+
}, scw.WithAllPages())
203216
if err != nil {
204217
return nil
205218
}

0 commit comments

Comments
 (0)