@@ -21,10 +21,10 @@ import (
21
21
"github.com/coder/serpent"
22
22
)
23
23
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 `,
26
26
// indicating that the CLI should not apply any preset.
27
- const PresetNone = "none "
27
+ const PresetNone = "None "
28
28
29
29
func (r * RootCmd ) create () * serpent.Command {
30
30
var (
@@ -278,18 +278,25 @@ func (r *RootCmd) create() *serpent.Command {
278
278
var preset * codersdk.Preset
279
279
var presetParameters []codersdk.WorkspaceBuildParameter
280
280
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
283
283
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 )
286
286
if err != nil {
287
287
return xerrors .Errorf ("unable to resolve preset: %w" , err )
288
288
}
289
289
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
291
298
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
293
300
displayAppliedPreset (inv , preset , presetParameters )
294
301
} else {
295
302
// Inform the user that no preset was applied
@@ -377,7 +384,7 @@ func (r *RootCmd) create() *serpent.Command {
377
384
serpent.Option {
378
385
Flag : "preset" ,
379
386
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." ,
381
388
Value : serpent .StringOf (& presetName ),
382
389
},
383
390
serpent.Option {
@@ -431,52 +438,47 @@ type prepWorkspaceBuildArgs struct {
431
438
RichParameterDefaults []codersdk.WorkspaceBuildParameter
432
439
}
433
440
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 ) {
437
445
// If preset name is specified, find it
438
446
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
442
450
}
443
451
}
444
452
return nil , xerrors .Errorf ("preset %q not found" , presetName )
445
453
}
446
454
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
449
464
}
450
465
451
466
// promptPresetSelection shows a CLI selection menu of the presets defined in the template version.
467
+ // Returns the selected preset
452
468
func promptPresetSelection (inv * serpent.Invocation , presets []codersdk.Preset ) (* codersdk.Preset , error ) {
453
469
presetMap := make (map [string ]* codersdk.Preset )
454
- var defaultOption string
455
- var options []string
470
+ var presetOptions []string
456
471
457
- // Process presets, with the default option (if any) listed first.
458
472
for _ , preset := range presets {
459
473
option := preset .Name
460
- if preset .Default {
461
- option = "(default) " + preset .Name
462
- defaultOption = option
463
- }
474
+ presetOptions = append (presetOptions , option )
464
475
presetMap [option ] = & preset
465
476
}
466
477
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
-
476
478
// Show selection UI
477
479
_ , _ = fmt .Fprintln (inv .Stdout , pretty .Sprint (cliui .DefaultStyles .Wrap , "Select a preset below:" ))
478
480
selected , err := cliui .Select (inv , cliui.SelectOptions {
479
- Options : options ,
481
+ Options : presetOptions ,
480
482
HideSearch : true ,
481
483
})
482
484
if err != nil {
0 commit comments