Skip to content

Commit dbe0685

Browse files
committed
chore: default to preset if available and none specified
1 parent ac12e0a commit dbe0685

File tree

3 files changed

+203
-118
lines changed

3 files changed

+203
-118
lines changed

cli/create.go

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

24-
// PresetNone represents the special preset value "none".
25-
// It is used when a user runs `create --preset none`,
24+
// PresetNone represents the special preset value "None".
25+
// It is used when a user runs `create --preset None`,
2626
// indicating that the CLI should not apply any preset.
27-
const PresetNone = "none"
27+
const PresetNone = "None"
2828

2929
func (r *RootCmd) create() *serpent.Command {
3030
var (
@@ -278,18 +278,25 @@ func (r *RootCmd) create() *serpent.Command {
278278
var preset *codersdk.Preset
279279
var presetParameters []codersdk.WorkspaceBuildParameter
280280

281-
// If the template has no presets, or the user explicitly used --preset none,
282-
// skip applying a preset.
281+
// If the template has no presets, or the user explicitly used --preset None,
282+
// skip applying a preset
283283
if len(tvPresets) > 0 && presetName != PresetNone {
284-
// Resolve which preset to use
285-
preset, err = resolvePreset(inv, tvPresets, presetName)
284+
// Attempt to resolve which preset to use
285+
preset, err = resolvePreset(tvPresets, presetName)
286286
if err != nil {
287287
return xerrors.Errorf("unable to resolve preset: %w", err)
288288
}
289289

290-
// Convert preset parameters into workspace build parameters.
290+
// If no preset found, prompt the user to choose a preset
291+
if preset == nil {
292+
if preset, err = promptPresetSelection(inv, tvPresets); err != nil {
293+
return xerrors.Errorf("unable to prompt user for preset: %w", err)
294+
}
295+
}
296+
297+
// Convert preset parameters into workspace build parameters
291298
presetParameters = presetParameterAsWorkspaceBuildParameters(preset.Parameters)
292-
// Inform the user which preset was applied and its parameters.
299+
// Inform the user which preset was applied and its parameters
293300
displayAppliedPreset(inv, preset, presetParameters)
294301
} else {
295302
// Inform the user that no preset was applied
@@ -377,7 +384,7 @@ func (r *RootCmd) create() *serpent.Command {
377384
serpent.Option{
378385
Flag: "preset",
379386
Env: "CODER_PRESET_NAME",
380-
Description: "Specify the name of a template version preset. Use 'none' to explicitly indicate that no preset should be used.",
387+
Description: "Specify the name of a template version preset. Use 'None' to explicitly indicate that no preset should be used.",
381388
Value: serpent.StringOf(&presetName),
382389
},
383390
serpent.Option{
@@ -431,52 +438,47 @@ type prepWorkspaceBuildArgs struct {
431438
RichParameterDefaults []codersdk.WorkspaceBuildParameter
432439
}
433440

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-
func resolvePreset(inv *serpent.Invocation, presets []codersdk.Preset, presetName string) (*codersdk.Preset, error) {
441+
// resolvePreset returns the preset matching the given presetName (if specified),
442+
// or the default preset (if any).
443+
// Returns nil if no matching or default preset is found.
444+
func resolvePreset(presets []codersdk.Preset, presetName string) (*codersdk.Preset, error) {
437445
// If preset name is specified, find it
438446
if presetName != "" {
439-
for _, preset := range presets {
440-
if preset.Name == presetName {
441-
return &preset, nil
447+
for _, p := range presets {
448+
if p.Name == presetName {
449+
return &p, nil
442450
}
443451
}
444452
return nil, xerrors.Errorf("preset %q not found", presetName)
445453
}
446454

447-
// No preset specified, prompt user to select one
448-
return promptPresetSelection(inv, presets)
455+
// No preset name specified, search for the default preset
456+
for _, p := range presets {
457+
if p.Default {
458+
return &p, nil
459+
}
460+
}
461+
462+
// No preset found, return nil to indicate no preset found
463+
return nil, nil
449464
}
450465

451466
// promptPresetSelection shows a CLI selection menu of the presets defined in the template version.
467+
// Returns the selected preset
452468
func promptPresetSelection(inv *serpent.Invocation, presets []codersdk.Preset) (*codersdk.Preset, error) {
453469
presetMap := make(map[string]*codersdk.Preset)
454-
var defaultOption string
455-
var options []string
470+
var presetOptions []string
456471

457-
// Process presets, with the default option (if any) listed first.
458472
for _, preset := range presets {
459473
option := preset.Name
460-
if preset.Default {
461-
option = "(default) " + preset.Name
462-
defaultOption = option
463-
}
474+
presetOptions = append(presetOptions, option)
464475
presetMap[option] = &preset
465476
}
466477

467-
if defaultOption != "" {
468-
options = append(options, defaultOption)
469-
}
470-
for option := range presetMap {
471-
if option != defaultOption {
472-
options = append(options, option)
473-
}
474-
}
475-
476478
// Show selection UI
477479
_, _ = fmt.Fprintln(inv.Stdout, pretty.Sprint(cliui.DefaultStyles.Wrap, "Select a preset below:"))
478480
selected, err := cliui.Select(inv, cliui.SelectOptions{
479-
Options: options,
481+
Options: presetOptions,
480482
HideSearch: true,
481483
})
482484
if err != nil {

0 commit comments

Comments
 (0)