@@ -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 --presetnone `,
24+ // PresetNone represents the special preset value "None ".
25+ // It is used when a user runs `create --presetNone `,
2626// indicating that the CLI should not apply any preset.
27- const PresetNone = "none "
27+ const PresetNone = "None "
2828
2929func (r * RootCmd )create ()* serpent.Command {
3030var (
@@ -278,18 +278,25 @@ func (r *RootCmd) create() *serpent.Command {
278278var preset * codersdk.Preset
279279var presetParameters []codersdk.WorkspaceBuildParameter
280280
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
283283if 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 )
286286if err != nil {
287287return 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
291298presetParameters = 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
293300displayAppliedPreset (inv ,preset ,presetParameters )
294301}else {
295302// Inform the user that no preset was applied
@@ -377,7 +384,7 @@ func (r *RootCmd) create() *serpent.Command {
377384serpent.Option {
378385Flag :"preset" ,
379386Env :"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." ,
381388Value :serpent .StringOf (& presetName ),
382389},
383390serpent.Option {
@@ -431,52 +438,47 @@ type prepWorkspaceBuildArgs struct {
431438RichParameterDefaults []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
438446if 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}
444452return 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
452468func promptPresetSelection (inv * serpent.Invocation ,presets []codersdk.Preset ) (* codersdk.Preset ,error ) {
453469presetMap := 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.
458472for _ ,preset := range presets {
459473option := preset .Name
460- if preset .Default {
461- option = "(default) " + preset .Name
462- defaultOption = option
463- }
474+ presetOptions = append (presetOptions ,option )
464475presetMap [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:" ))
478480selected ,err := cliui .Select (inv , cliui.SelectOptions {
479- Options :options ,
481+ Options :presetOptions ,
480482HideSearch :true ,
481483})
482484if err != nil {