@@ -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 --presetnone `,
24
+ // PresetNone represents the special preset value "None ".
25
+ // It is used when a user runs `create --presetNone `,
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 --presetnone ,
282
- // skip applying a preset.
281
+ // If the template has no presets, or the user explicitly used --presetNone ,
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 {