Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit77a72b1

Browse files
committed
chore: prompt user to select a preset when no --preset flag is provided
1 parentb8a1c14 commit77a72b1

File tree

3 files changed

+203
-170
lines changed

3 files changed

+203
-170
lines changed

‎cli/create.go‎

Lines changed: 90 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ import (
2121
"github.com/coder/serpent"
2222
)
2323

24-
// DefaultPresetName is used when a user runs `create --preset default`.
25-
// It instructs the CLI to use the default preset defined for the template version, if one exists.
26-
constDefaultPresetName="default"
24+
// PresetNone represents the special preset value "none".
25+
// It is used when a user runs `create --preset none`,
26+
// indicating that the CLI should not apply any preset.
27+
constPresetNone="none"
2728

2829
func (r*RootCmd)create()*serpent.Command {
2930
var (
@@ -268,47 +269,31 @@ func (r *RootCmd) create() *serpent.Command {
268269
}
269270
}
270271

271-
// If a preset name is provided, resolve the preset to use.
272+
// Get presets for the template version
273+
tvPresets,err:=client.TemplateVersionPresets(inv.Context(),templateVersionID)
274+
iferr!=nil {
275+
returnxerrors.Errorf("failed to get presets: %w",err)
276+
}
277+
272278
varpreset*codersdk.Preset
273279
varpresetParameters []codersdk.WorkspaceBuildParameter
274-
isDefaultPreset:=false
275-
iflen(presetName)>0 {
276-
tvPresets,err:=client.TemplateVersionPresets(inv.Context(),templateVersionID)
277-
iferr!=nil {
278-
returnxerrors.Errorf("failed to get presets: %w",err)
279-
}
280280

281-
for_,tvPreset:=rangetvPresets {
282-
// If the preset name is the special "default" keyword,
283-
// fetch the template version's default preset (if any).
284-
ifpresetName==DefaultPresetName&&tvPreset.Default {
285-
preset=&tvPreset
286-
isDefaultPreset=true
287-
break
288-
}
289-
iftvPreset.Name==presetName {
290-
preset=&tvPreset
291-
break
292-
}
293-
}
294-
295-
ifpreset==nil {
296-
returnxerrors.Errorf("preset %q not found",presetName)
281+
// If the template has no presets, or the user explicitly used --preset none,
282+
// skip applying a preset.
283+
iflen(tvPresets)>0&&presetName!=PresetNone {
284+
// Resolve which preset to use
285+
preset,err=resolvePreset(inv,tvPresets,presetName)
286+
iferr!=nil {
287+
returnxerrors.Errorf("unable to resolve preset: %w",err)
297288
}
298289

299290
// Convert preset parameters into workspace build parameters.
300-
presetBuildParameters:=presetParameterAsWorkspaceBuildParameters(preset.Parameters)
301-
presetParameters=append(presetParameters,presetBuildParameters...)
302-
291+
presetParameters=presetParameterAsWorkspaceBuildParameters(preset.Parameters)
303292
// Inform the user which preset was applied and its parameters.
304-
presetLabel:=fmt.Sprintf("Preset '%s'",preset.Name)
305-
ifisDefaultPreset {
306-
presetLabel+=" (default)"
307-
}
308-
_,_=fmt.Fprintf(inv.Stdout,"%s applied:",cliui.Bold(presetLabel))
309-
for_,p:=rangepresetParameters {
310-
_,_=fmt.Fprintf(inv.Stdout," %s: '%s'\n",cliui.Bold(p.Name),p.Value)
311-
}
293+
displayAppliedPreset(inv,preset,presetParameters)
294+
}else {
295+
// Inform the user that no preset was applied
296+
_,_=fmt.Fprintf(inv.Stdout,"%s",cliui.Bold("No preset applied."))
312297
}
313298

314299
richParameters,err:=prepWorkspaceBuild(inv,client,prepWorkspaceBuildArgs{
@@ -446,6 +431,74 @@ type prepWorkspaceBuildArgs struct {
446431
RichParameterDefaults []codersdk.WorkspaceBuildParameter
447432
}
448433

434+
// resolvePreset determines which preset to use based on the --preset flag,
435+
// or prompts the user to select one if the flag is not provided.
436+
funcresolvePreset(inv*serpent.Invocation,presets []codersdk.Preset,presetNamestring) (*codersdk.Preset,error) {
437+
// If preset name is specified, find it
438+
ifpresetName!="" {
439+
for_,preset:=rangepresets {
440+
ifpreset.Name==presetName {
441+
return&preset,nil
442+
}
443+
}
444+
returnnil,xerrors.Errorf("preset %q not found",presetName)
445+
}
446+
447+
// No preset specified, prompt user to select one
448+
returnpromptPresetSelection(inv,presets)
449+
}
450+
451+
// promptPresetSelection shows a CLI selection menu of the presets defined in the template version.
452+
funcpromptPresetSelection(inv*serpent.Invocation,presets []codersdk.Preset) (*codersdk.Preset,error) {
453+
presetMap:=make(map[string]*codersdk.Preset)
454+
vardefaultOptionstring
455+
varoptions []string
456+
457+
// Process presets, with the default option (if any) listed first.
458+
for_,preset:=rangepresets {
459+
option:=preset.Name
460+
ifpreset.Default {
461+
option="(default) "+preset.Name
462+
defaultOption=option
463+
}
464+
presetMap[option]=&preset
465+
}
466+
467+
ifdefaultOption!="" {
468+
options=append(options,defaultOption)
469+
}
470+
foroption:=rangepresetMap {
471+
ifoption!=defaultOption {
472+
options=append(options,option)
473+
}
474+
}
475+
476+
// Show selection UI
477+
_,_=fmt.Fprintln(inv.Stdout,pretty.Sprint(cliui.DefaultStyles.Wrap,"Select a preset below:"))
478+
selected,err:=cliui.Select(inv, cliui.SelectOptions{
479+
Options:options,
480+
HideSearch:true,
481+
})
482+
iferr!=nil {
483+
returnnil,xerrors.Errorf("failed to select preset: %w",err)
484+
}
485+
486+
returnpresetMap[selected],nil
487+
}
488+
489+
// displayAppliedPreset shows the user which preset was applied and its parameters
490+
funcdisplayAppliedPreset(inv*serpent.Invocation,preset*codersdk.Preset,parameters []codersdk.WorkspaceBuildParameter) {
491+
label:=fmt.Sprintf("Preset '%s'",preset.Name)
492+
ifpreset.Default {
493+
label+=" (default)"
494+
}
495+
496+
_,_=fmt.Fprintf(inv.Stdout,"%s applied:\n",cliui.Bold(label))
497+
for_,param:=rangeparameters {
498+
_,_=fmt.Fprintf(inv.Stdout," %s: '%s'\n",cliui.Bold(param.Name),param.Value)
499+
}
500+
}
501+
449502
// prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version.
450503
// Any missing params will be prompted to the user. It supports rich parameters.
451504
funcprepWorkspaceBuild(inv*serpent.Invocation,client*codersdk.Client,argsprepWorkspaceBuildArgs) ([]codersdk.WorkspaceBuildParameter,error) {

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp