From 2872e11b2a6079f88044363c03ae4da86a4856c8 Mon Sep 17 00:00:00 2001 From: Anthony Gomez Date: Mon, 12 Jan 2026 09:54:06 -0500 Subject: [PATCH 1/5] refactor(flag_conversion.go): add flag conversion utilities for converting string flags to bools and checking ascending and desecnding flags --- pkg/commands/alerts/list.go | 9 ++-- pkg/commands/alerts/list_history.go | 9 ++-- pkg/commands/backend/create.go | 25 +++------- pkg/commands/backend/update.go | 27 +++-------- pkg/commands/dashboard/list.go | 9 ++-- pkg/commands/imageoptimizerdefaults/update.go | 47 ++++++++----------- .../ngwaf/workspace/threshold/create.go | 23 +++------ .../ngwaf/workspace/threshold/update.go | 23 +++------ .../ngwaf/workspace/virtualpatch/update.go | 17 +++---- pkg/flagconversion/flag_conversion.go | 29 ++++++++++++ 10 files changed, 96 insertions(+), 122 deletions(-) create mode 100644 pkg/flagconversion/flag_conversion.go diff --git a/pkg/commands/alerts/list.go b/pkg/commands/alerts/list.go index c82b36359..7f86ebccf 100644 --- a/pkg/commands/alerts/list.go +++ b/pkg/commands/alerts/list.go @@ -5,6 +5,7 @@ import ( "errors" "io" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/text" "github.com/fastly/go-fastly/v12/fastly" @@ -114,12 +115,10 @@ func (c *ListCommand) constructInput() (*fastly.ListAlertDefinitionsInput, error input.ServiceID = &c.serviceID.Value } var sign string + var err error if c.order.WasSet { - switch c.order.Value { - case "asc": - case "desc": - sign = "-" - default: + sign, err = flagconversion.ConvertOrderFromStringFlag(c.order.Value) + if err != nil { err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) return nil, err diff --git a/pkg/commands/alerts/list_history.go b/pkg/commands/alerts/list_history.go index 02d3a6a84..329a54d7b 100644 --- a/pkg/commands/alerts/list_history.go +++ b/pkg/commands/alerts/list_history.go @@ -5,6 +5,7 @@ import ( "errors" "io" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/text" "github.com/fastly/go-fastly/v12/fastly" @@ -114,12 +115,10 @@ func (c *ListHistoryCommand) constructInput() (*fastly.ListAlertHistoryInput, er input.Limit = &c.limit.Value } var sign string + var err error if c.order.WasSet { - switch c.order.Value { - case "asc": - case "desc": - sign = "-" - default: + sign, err = flagconversion.ConvertOrderFromStringFlag(c.order.Value) + if err != nil { err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) return nil, err diff --git a/pkg/commands/backend/create.go b/pkg/commands/backend/create.go index 878602683..af21f7c77 100644 --- a/pkg/commands/backend/create.go +++ b/pkg/commands/backend/create.go @@ -12,6 +12,7 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -194,20 +195,14 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input.OverrideHost = &c.overrideHost.Value } if c.preferIPv6.WasSet { - var preferIPv6 bool - - switch c.preferIPv6.Value { - case "true": - preferIPv6 = true - case "false": - preferIPv6 = false - default: + preferIPv6, err := flagconversion.ConvertBoolFromStringFlag(c.preferIPv6.Value) + if err != nil { err := errors.New("'prefer-ipv6' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - input.PreferIPv6 = fastly.ToPointer(fastly.Compatibool(preferIPv6)) + input.PreferIPv6 = fastly.ToPointer(fastly.Compatibool(*preferIPv6)) } if c.requestCondition.WasSet { input.RequestCondition = &c.requestCondition.Value @@ -238,20 +233,14 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input.SSLSNIHostname = &c.sslSNIHostname.Value } if c.tcpKaEnable.WasSet { - var tcpKaEnable bool - - switch c.tcpKaEnable.Value { - case "true": - tcpKaEnable = true - case "false": - tcpKaEnable = false - default: + tcpKaEnable, err := flagconversion.ConvertBoolFromStringFlag(c.tcpKaEnable.Value) + if err != nil { err := errors.New("'tcp-ka-enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - input.TCPKeepAliveEnable = &tcpKaEnable + input.TCPKeepAliveEnable = tcpKaEnable } if c.tcpKaInterval.WasSet { input.TCPKeepAliveIntvl = &c.tcpKaInterval.Value diff --git a/pkg/commands/backend/update.go b/pkg/commands/backend/update.go index 9d48db064..332ba0656 100644 --- a/pkg/commands/backend/update.go +++ b/pkg/commands/backend/update.go @@ -11,6 +11,7 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -174,20 +175,13 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } if c.preferIPv6.WasSet { - var preferIPv6 bool - - switch c.preferIPv6.Value { - case "true": - preferIPv6 = true - case "false": - preferIPv6 = false - default: + preferIPv6, err := flagconversion.ConvertBoolFromStringFlag(c.preferIPv6.Value) + if err != nil { err := errors.New("'prefer-ipv6' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - - input.PreferIPv6 = fastly.ToPointer(fastly.Compatibool(preferIPv6)) + input.PreferIPv6 = fastly.ToPointer(fastly.Compatibool(*preferIPv6)) } if c.ConnectTimeout.WasSet { @@ -272,20 +266,13 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } if c.TCPKaEnable.WasSet { - var tcpKaEnable bool - - switch c.TCPKaEnable.Value { - case "true": - tcpKaEnable = true - case "false": - tcpKaEnable = false - default: + tcpKaEnable, err := flagconversion.ConvertBoolFromStringFlag(c.TCPKaEnable.Value) + if err != nil { err := errors.New("'tcp-ka-enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - - input.TCPKeepAliveEnable = &tcpKaEnable + input.TCPKeepAliveEnable = tcpKaEnable } if c.TCPKaInterval.WasSet { input.TCPKeepAliveIntvl = &c.TCPKaInterval.Value diff --git a/pkg/commands/dashboard/list.go b/pkg/commands/dashboard/list.go index 8bff745f2..f83ea9b47 100644 --- a/pkg/commands/dashboard/list.go +++ b/pkg/commands/dashboard/list.go @@ -10,6 +10,7 @@ import ( "github.com/fastly/cli/pkg/argparser" "github.com/fastly/cli/pkg/commands/dashboard/printer" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -121,12 +122,10 @@ func (c *ListCommand) constructInput() (*fastly.ListObservabilityCustomDashboard input.Limit = &c.limit.Value } var sign string + var err error if c.order.WasSet { - switch c.order.Value { - case "asc": - case "desc": - sign = "-" - default: + sign, err = flagconversion.ConvertOrderFromStringFlag(c.order.Value) + if err != nil { err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) return nil, err diff --git a/pkg/commands/imageoptimizerdefaults/update.go b/pkg/commands/imageoptimizerdefaults/update.go index 826db09ce..de4a4b1b5 100644 --- a/pkg/commands/imageoptimizerdefaults/update.go +++ b/pkg/commands/imageoptimizerdefaults/update.go @@ -2,6 +2,7 @@ package imageoptimizerdefaults import ( "context" + "errors" "fmt" "io" @@ -9,6 +10,7 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" ) @@ -159,16 +161,13 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } } if c.webp.WasSet { - var webp bool - switch c.webp.Value { - case "true": - webp = true - case "false": - webp = false - default: - return fmt.Errorf("'webp' flag must be one of the following [true, false]") + webp, err := flagconversion.ConvertBoolFromStringFlag(c.webp.Value) + if err != nil { + err := errors.New("'webp' flag must be one of the following [true, false]") + c.Globals.ErrLog.Add(err) + return err } - c.Input.Webp = &webp + c.Input.Webp = webp } if c.webpQuality.WasSet { c.Input.WebpQuality = &c.webpQuality.Value @@ -193,28 +192,22 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { c.Input.JpegQuality = &c.jpegQuality.Value } if c.upscale.WasSet { - var upscale bool - switch c.upscale.Value { - case "true": - upscale = true - case "false": - upscale = false - default: - return fmt.Errorf("'upscale' flag must be one of the following [true, false]") + upscale, err := flagconversion.ConvertBoolFromStringFlag(c.upscale.Value) + if err != nil { + err := errors.New("'upscale' flag must be one of the following [true, false]") + c.Globals.ErrLog.Add(err) + return err } - c.Input.Upscale = &upscale + c.Input.Upscale = upscale } if c.allowVideo.WasSet { - var allowVideo bool - switch c.allowVideo.Value { - case "true": - allowVideo = true - case "false": - allowVideo = false - default: - return fmt.Errorf("'allow-video' flag must be one of the following [true, false]") + allowVideo, err := flagconversion.ConvertBoolFromStringFlag(c.allowVideo.Value) + if err != nil { + err := errors.New("'allow-video' flag must be one of the following [true, false]") + c.Globals.ErrLog.Add(err) + return err } - c.Input.AllowVideo = &allowVideo + c.Input.AllowVideo = allowVideo } o, err := c.Globals.APIClient.UpdateImageOptimizerDefaultSettings(context.TODO(), &c.Input) diff --git a/pkg/commands/ngwaf/workspace/threshold/create.go b/pkg/commands/ngwaf/workspace/threshold/create.go index 43645bb72..13f953c57 100644 --- a/pkg/commands/ngwaf/workspace/threshold/create.go +++ b/pkg/commands/ngwaf/workspace/threshold/create.go @@ -10,6 +10,7 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -75,25 +76,15 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { return err } - var enabled bool - switch c.enabled.Value { - case "true": - enabled = true - case "false": - enabled = false - default: + enabled, err := flagconversion.ConvertBoolFromStringFlag(c.enabled.Value) + if err != nil { err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - var dontNotify bool - switch c.dontNotify.Value { - case "true": - dontNotify = true - case "false": - dontNotify = false - default: + dontNotify, err := flagconversion.ConvertBoolFromStringFlag(c.dontNotify.Value) + if err != nil { err := errors.New("'do-not-notify' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err @@ -102,11 +93,11 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input := &thresholds.CreateInput{ Action: &c.action, Duration: &c.duration, - Enabled: &enabled, + Enabled: enabled, Interval: &c.interval, Limit: &c.limit, Name: &c.name, - DontNotify: &dontNotify, + DontNotify: dontNotify, Signal: &c.signal, WorkspaceID: &c.workspaceID.Value, } diff --git a/pkg/commands/ngwaf/workspace/threshold/update.go b/pkg/commands/ngwaf/workspace/threshold/update.go index d9626e95b..01ebd250a 100644 --- a/pkg/commands/ngwaf/workspace/threshold/update.go +++ b/pkg/commands/ngwaf/workspace/threshold/update.go @@ -10,6 +10,7 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -84,35 +85,25 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { input.Action = &c.action.Value } if c.dontNotify.WasSet { - var dontNotify bool - switch c.dontNotify.Value { - case "true": - dontNotify = true - case "false": - dontNotify = false - default: + dontNotify, err := flagconversion.ConvertBoolFromStringFlag(c.dontNotify.Value) + if err != nil { err := errors.New("'do-not-notify' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - input.DontNotify = &dontNotify + input.DontNotify = dontNotify } if c.duration.WasSet { input.Duration = &c.duration.Value } if c.enabled.WasSet { - var enabled bool - switch c.enabled.Value { - case "true": - enabled = true - case "false": - enabled = false - default: + enabled, err := flagconversion.ConvertBoolFromStringFlag(c.enabled.Value) + if err != nil { err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - input.Enabled = &enabled + input.Enabled = enabled } if c.interval.WasSet { input.Interval = &c.interval.Value diff --git a/pkg/commands/ngwaf/workspace/virtualpatch/update.go b/pkg/commands/ngwaf/workspace/virtualpatch/update.go index 8270b95c5..85b19a1f2 100644 --- a/pkg/commands/ngwaf/workspace/virtualpatch/update.go +++ b/pkg/commands/ngwaf/workspace/virtualpatch/update.go @@ -3,7 +3,6 @@ package virtualpatch import ( "context" "errors" - "fmt" "io" "github.com/fastly/go-fastly/v12/fastly" @@ -11,6 +10,7 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" + "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -67,16 +67,13 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { WorkspaceID: &c.workspaceID, } if c.enabled.WasSet { - var enableToggle bool - switch c.enabled.Value { - case "true": - enableToggle = true - case "false": - enableToggle = false - default: - return fmt.Errorf("'enabled' flag must be one of the following [true, false]") + enabled, err := flagconversion.ConvertBoolFromStringFlag(c.enabled.Value) + if err != nil { + err := errors.New("'enabled' flag must be one of the following [true, false]") + c.Globals.ErrLog.Add(err) + return err } - input.Enabled = &enableToggle + input.Enabled = enabled } if c.mode.WasSet { input.Mode = &c.mode.Value diff --git a/pkg/flagconversion/flag_conversion.go b/pkg/flagconversion/flag_conversion.go new file mode 100644 index 000000000..a11112994 --- /dev/null +++ b/pkg/flagconversion/flag_conversion.go @@ -0,0 +1,29 @@ +package flagconversion + +import ( + "errors" + + "github.com/fastly/go-fastly/v12/fastly" +) + +func ConvertBoolFromStringFlag(value string) (*bool, error) { + switch value { + case "true": + return fastly.ToPointer(true), nil + case "false": + return fastly.ToPointer(false), nil + default: + return nil, errors.New("value must be one of the following [true, false]") + } +} + +func ConvertOrderFromStringFlag(value string) (string, error) { + switch value { + case "asc": + return "", nil + case "desc": + return "-", nil + default: + return "", errors.New("value must be one of the following [asc, desc]") + } +} From e9db686f5ab0e6346c4adbf49642f87b755cb740 Mon Sep 17 00:00:00 2001 From: Anthony Gomez Date: Mon, 12 Jan 2026 09:56:26 -0500 Subject: [PATCH 2/5] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fc0ba451..7c6d71668 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - feat(compute/hashfiles): remove hashsum subcommand ([#1608](https://github.com/fastly/cli/pull/1608)) - feat(commands/ngwaf/rules): add support for CRUD operations for NGWAF rules ([#1578](https://github.com/fastly/cli/pull/1605)) - feat(compute/deploy): added the `--no-default-domain` flag to allow for the skipping of automatic domain creation when deploying a Compute service([#1610](https://github.com/fastly/cli/pull/1610)) +- refactor(flag_conversion.go): add flag conversion utilities for converting string flags to bools and checking ascending and desecnding flags ([#1611](https://github.com/fastly/cli/pull/1611)) ### Bug fixes: From 8d503533338b65e58f66d6ecd1c404d91ff70694 Mon Sep 17 00:00:00 2001 From: Anthony Gomez Date: Mon, 12 Jan 2026 11:23:21 -0500 Subject: [PATCH 3/5] move to argparser package --- pkg/argparser/flags.go | 22 ++++++++++++++ pkg/commands/alerts/list.go | 3 +- pkg/commands/alerts/list_history.go | 3 +- pkg/commands/backend/create.go | 5 ++-- pkg/commands/backend/update.go | 5 ++-- pkg/commands/dashboard/list.go | 3 +- pkg/commands/imageoptimizerdefaults/update.go | 7 ++--- .../ngwaf/workspace/threshold/create.go | 5 ++-- .../ngwaf/workspace/threshold/update.go | 5 ++-- .../ngwaf/workspace/virtualpatch/update.go | 3 +- pkg/flagconversion/flag_conversion.go | 29 ------------------- 11 files changed, 37 insertions(+), 53 deletions(-) delete mode 100644 pkg/flagconversion/flag_conversion.go diff --git a/pkg/argparser/flags.go b/pkg/argparser/flags.go index c08a685d9..739511415 100644 --- a/pkg/argparser/flags.go +++ b/pkg/argparser/flags.go @@ -373,3 +373,25 @@ func (j *JSONOutput) WriteJSON(out io.Writer, value any) (bool, error) { enc.SetIndent("", " ") return true, enc.Encode(value) } + +func ConvertBoolFromStringFlag(value string) (*bool, error) { + switch value { + case "true": + return fastly.ToPointer(true), nil + case "false": + return fastly.ToPointer(false), nil + default: + return nil, errors.New("value must be one of the following [true, false]") + } +} + +func ConvertOrderFromStringFlag(value string) (string, error) { + switch value { + case "asc": + return "", nil + case "desc": + return "-", nil + default: + return "", errors.New("value must be one of the following [asc, desc]") + } +} diff --git a/pkg/commands/alerts/list.go b/pkg/commands/alerts/list.go index 7f86ebccf..79019860f 100644 --- a/pkg/commands/alerts/list.go +++ b/pkg/commands/alerts/list.go @@ -5,7 +5,6 @@ import ( "errors" "io" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/text" "github.com/fastly/go-fastly/v12/fastly" @@ -117,7 +116,7 @@ func (c *ListCommand) constructInput() (*fastly.ListAlertDefinitionsInput, error var sign string var err error if c.order.WasSet { - sign, err = flagconversion.ConvertOrderFromStringFlag(c.order.Value) + sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value) if err != nil { err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/alerts/list_history.go b/pkg/commands/alerts/list_history.go index 329a54d7b..06ba9e3a9 100644 --- a/pkg/commands/alerts/list_history.go +++ b/pkg/commands/alerts/list_history.go @@ -5,7 +5,6 @@ import ( "errors" "io" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/text" "github.com/fastly/go-fastly/v12/fastly" @@ -117,7 +116,7 @@ func (c *ListHistoryCommand) constructInput() (*fastly.ListAlertHistoryInput, er var sign string var err error if c.order.WasSet { - sign, err = flagconversion.ConvertOrderFromStringFlag(c.order.Value) + sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value) if err != nil { err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/backend/create.go b/pkg/commands/backend/create.go index af21f7c77..bc84e249b 100644 --- a/pkg/commands/backend/create.go +++ b/pkg/commands/backend/create.go @@ -12,7 +12,6 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -195,7 +194,7 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input.OverrideHost = &c.overrideHost.Value } if c.preferIPv6.WasSet { - preferIPv6, err := flagconversion.ConvertBoolFromStringFlag(c.preferIPv6.Value) + preferIPv6, err := argparser.ConvertBoolFromStringFlag(c.preferIPv6.Value) if err != nil { err := errors.New("'prefer-ipv6' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) @@ -233,7 +232,7 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input.SSLSNIHostname = &c.sslSNIHostname.Value } if c.tcpKaEnable.WasSet { - tcpKaEnable, err := flagconversion.ConvertBoolFromStringFlag(c.tcpKaEnable.Value) + tcpKaEnable, err := argparser.ConvertBoolFromStringFlag(c.tcpKaEnable.Value) if err != nil { err := errors.New("'tcp-ka-enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/backend/update.go b/pkg/commands/backend/update.go index 332ba0656..171accbdc 100644 --- a/pkg/commands/backend/update.go +++ b/pkg/commands/backend/update.go @@ -11,7 +11,6 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -175,7 +174,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } if c.preferIPv6.WasSet { - preferIPv6, err := flagconversion.ConvertBoolFromStringFlag(c.preferIPv6.Value) + preferIPv6, err := argparser.ConvertBoolFromStringFlag(c.preferIPv6.Value) if err != nil { err := errors.New("'prefer-ipv6' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) @@ -266,7 +265,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } if c.TCPKaEnable.WasSet { - tcpKaEnable, err := flagconversion.ConvertBoolFromStringFlag(c.TCPKaEnable.Value) + tcpKaEnable, err := argparser.ConvertBoolFromStringFlag(c.TCPKaEnable.Value) if err != nil { err := errors.New("'tcp-ka-enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/dashboard/list.go b/pkg/commands/dashboard/list.go index f83ea9b47..575023b4c 100644 --- a/pkg/commands/dashboard/list.go +++ b/pkg/commands/dashboard/list.go @@ -10,7 +10,6 @@ import ( "github.com/fastly/cli/pkg/argparser" "github.com/fastly/cli/pkg/commands/dashboard/printer" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -124,7 +123,7 @@ func (c *ListCommand) constructInput() (*fastly.ListObservabilityCustomDashboard var sign string var err error if c.order.WasSet { - sign, err = flagconversion.ConvertOrderFromStringFlag(c.order.Value) + sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value) if err != nil { err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/imageoptimizerdefaults/update.go b/pkg/commands/imageoptimizerdefaults/update.go index de4a4b1b5..d2c868f96 100644 --- a/pkg/commands/imageoptimizerdefaults/update.go +++ b/pkg/commands/imageoptimizerdefaults/update.go @@ -10,7 +10,6 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" ) @@ -161,7 +160,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } } if c.webp.WasSet { - webp, err := flagconversion.ConvertBoolFromStringFlag(c.webp.Value) + webp, err := argparser.ConvertBoolFromStringFlag(c.webp.Value) if err != nil { err := errors.New("'webp' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) @@ -192,7 +191,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { c.Input.JpegQuality = &c.jpegQuality.Value } if c.upscale.WasSet { - upscale, err := flagconversion.ConvertBoolFromStringFlag(c.upscale.Value) + upscale, err := argparser.ConvertBoolFromStringFlag(c.upscale.Value) if err != nil { err := errors.New("'upscale' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) @@ -201,7 +200,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { c.Input.Upscale = upscale } if c.allowVideo.WasSet { - allowVideo, err := flagconversion.ConvertBoolFromStringFlag(c.allowVideo.Value) + allowVideo, err := argparser.ConvertBoolFromStringFlag(c.allowVideo.Value) if err != nil { err := errors.New("'allow-video' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/ngwaf/workspace/threshold/create.go b/pkg/commands/ngwaf/workspace/threshold/create.go index 13f953c57..26c8d188e 100644 --- a/pkg/commands/ngwaf/workspace/threshold/create.go +++ b/pkg/commands/ngwaf/workspace/threshold/create.go @@ -10,7 +10,6 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -76,14 +75,14 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { return err } - enabled, err := flagconversion.ConvertBoolFromStringFlag(c.enabled.Value) + enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value) if err != nil { err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - dontNotify, err := flagconversion.ConvertBoolFromStringFlag(c.dontNotify.Value) + dontNotify, err := argparser.ConvertBoolFromStringFlag(c.dontNotify.Value) if err != nil { err := errors.New("'do-not-notify' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/ngwaf/workspace/threshold/update.go b/pkg/commands/ngwaf/workspace/threshold/update.go index 01ebd250a..be4e51bd8 100644 --- a/pkg/commands/ngwaf/workspace/threshold/update.go +++ b/pkg/commands/ngwaf/workspace/threshold/update.go @@ -10,7 +10,6 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -85,7 +84,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { input.Action = &c.action.Value } if c.dontNotify.WasSet { - dontNotify, err := flagconversion.ConvertBoolFromStringFlag(c.dontNotify.Value) + dontNotify, err := argparser.ConvertBoolFromStringFlag(c.dontNotify.Value) if err != nil { err := errors.New("'do-not-notify' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) @@ -97,7 +96,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { input.Duration = &c.duration.Value } if c.enabled.WasSet { - enabled, err := flagconversion.ConvertBoolFromStringFlag(c.enabled.Value) + enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value) if err != nil { err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) diff --git a/pkg/commands/ngwaf/workspace/virtualpatch/update.go b/pkg/commands/ngwaf/workspace/virtualpatch/update.go index 85b19a1f2..ca9cc478c 100644 --- a/pkg/commands/ngwaf/workspace/virtualpatch/update.go +++ b/pkg/commands/ngwaf/workspace/virtualpatch/update.go @@ -10,7 +10,6 @@ import ( "github.com/fastly/cli/pkg/argparser" fsterr "github.com/fastly/cli/pkg/errors" - "github.com/fastly/cli/pkg/flagconversion" "github.com/fastly/cli/pkg/global" "github.com/fastly/cli/pkg/text" ) @@ -67,7 +66,7 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { WorkspaceID: &c.workspaceID, } if c.enabled.WasSet { - enabled, err := flagconversion.ConvertBoolFromStringFlag(c.enabled.Value) + enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value) if err != nil { err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) diff --git a/pkg/flagconversion/flag_conversion.go b/pkg/flagconversion/flag_conversion.go deleted file mode 100644 index a11112994..000000000 --- a/pkg/flagconversion/flag_conversion.go +++ /dev/null @@ -1,29 +0,0 @@ -package flagconversion - -import ( - "errors" - - "github.com/fastly/go-fastly/v12/fastly" -) - -func ConvertBoolFromStringFlag(value string) (*bool, error) { - switch value { - case "true": - return fastly.ToPointer(true), nil - case "false": - return fastly.ToPointer(false), nil - default: - return nil, errors.New("value must be one of the following [true, false]") - } -} - -func ConvertOrderFromStringFlag(value string) (string, error) { - switch value { - case "asc": - return "", nil - case "desc": - return "-", nil - default: - return "", errors.New("value must be one of the following [asc, desc]") - } -} From d68472729da72a9573584978ea305b2f80a75529 Mon Sep 17 00:00:00 2001 From: Anthony Gomez Date: Mon, 12 Jan 2026 12:53:18 -0500 Subject: [PATCH 4/5] move name into the function to produce reusuable error message --- pkg/argparser/flags.go | 8 ++++---- pkg/commands/alerts/list.go | 4 +--- pkg/commands/alerts/list_history.go | 4 +--- pkg/commands/backend/create.go | 7 ++----- pkg/commands/backend/update.go | 7 ++----- pkg/commands/dashboard/list.go | 4 +--- pkg/commands/imageoptimizerdefaults/update.go | 10 +++------- pkg/commands/ngwaf/workspace/threshold/create.go | 6 ++---- pkg/commands/ngwaf/workspace/threshold/update.go | 6 ++---- pkg/commands/ngwaf/workspace/virtualpatch/update.go | 3 +-- 10 files changed, 19 insertions(+), 40 deletions(-) diff --git a/pkg/argparser/flags.go b/pkg/argparser/flags.go index 739511415..1b5b4fcc3 100644 --- a/pkg/argparser/flags.go +++ b/pkg/argparser/flags.go @@ -374,24 +374,24 @@ func (j *JSONOutput) WriteJSON(out io.Writer, value any) (bool, error) { return true, enc.Encode(value) } -func ConvertBoolFromStringFlag(value string) (*bool, error) { +func ConvertBoolFromStringFlag(value string, argName string) (*bool, error) { switch value { case "true": return fastly.ToPointer(true), nil case "false": return fastly.ToPointer(false), nil default: - return nil, errors.New("value must be one of the following [true, false]") + return nil, fmt.Errorf("'%s' flag must be one of the following [true, false]", argName) } } -func ConvertOrderFromStringFlag(value string) (string, error) { +func ConvertOrderFromStringFlag(value string, argName string) (string, error) { switch value { case "asc": return "", nil case "desc": return "-", nil default: - return "", errors.New("value must be one of the following [asc, desc]") + return "", fmt.Errorf("'%s' flag must be one of the following [asc, desc]", argName) } } diff --git a/pkg/commands/alerts/list.go b/pkg/commands/alerts/list.go index 79019860f..561d57fdb 100644 --- a/pkg/commands/alerts/list.go +++ b/pkg/commands/alerts/list.go @@ -2,7 +2,6 @@ package alerts import ( "context" - "errors" "io" "github.com/fastly/cli/pkg/text" @@ -116,9 +115,8 @@ func (c *ListCommand) constructInput() (*fastly.ListAlertDefinitionsInput, error var sign string var err error if c.order.WasSet { - sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value) + sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value, "order") if err != nil { - err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) return nil, err } diff --git a/pkg/commands/alerts/list_history.go b/pkg/commands/alerts/list_history.go index 06ba9e3a9..18d28134e 100644 --- a/pkg/commands/alerts/list_history.go +++ b/pkg/commands/alerts/list_history.go @@ -2,7 +2,6 @@ package alerts import ( "context" - "errors" "io" "github.com/fastly/cli/pkg/text" @@ -116,9 +115,8 @@ func (c *ListHistoryCommand) constructInput() (*fastly.ListAlertHistoryInput, er var sign string var err error if c.order.WasSet { - sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value) + sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value, "order") if err != nil { - err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) return nil, err } diff --git a/pkg/commands/backend/create.go b/pkg/commands/backend/create.go index bc84e249b..a2037fa11 100644 --- a/pkg/commands/backend/create.go +++ b/pkg/commands/backend/create.go @@ -2,7 +2,6 @@ package backend import ( "context" - "errors" "io" "net" @@ -194,9 +193,8 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input.OverrideHost = &c.overrideHost.Value } if c.preferIPv6.WasSet { - preferIPv6, err := argparser.ConvertBoolFromStringFlag(c.preferIPv6.Value) + preferIPv6, err := argparser.ConvertBoolFromStringFlag(c.preferIPv6.Value, "prefer-ipv6") if err != nil { - err := errors.New("'prefer-ipv6' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } @@ -232,9 +230,8 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { input.SSLSNIHostname = &c.sslSNIHostname.Value } if c.tcpKaEnable.WasSet { - tcpKaEnable, err := argparser.ConvertBoolFromStringFlag(c.tcpKaEnable.Value) + tcpKaEnable, err := argparser.ConvertBoolFromStringFlag(c.tcpKaEnable.Value, "tcp-ka-enabled") if err != nil { - err := errors.New("'tcp-ka-enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } diff --git a/pkg/commands/backend/update.go b/pkg/commands/backend/update.go index 171accbdc..b3263f65b 100644 --- a/pkg/commands/backend/update.go +++ b/pkg/commands/backend/update.go @@ -2,7 +2,6 @@ package backend import ( "context" - "errors" "io" "github.com/fastly/go-fastly/v12/fastly" @@ -174,9 +173,8 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } if c.preferIPv6.WasSet { - preferIPv6, err := argparser.ConvertBoolFromStringFlag(c.preferIPv6.Value) + preferIPv6, err := argparser.ConvertBoolFromStringFlag(c.preferIPv6.Value, "prefer-ipv6") if err != nil { - err := errors.New("'prefer-ipv6' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } @@ -265,9 +263,8 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } if c.TCPKaEnable.WasSet { - tcpKaEnable, err := argparser.ConvertBoolFromStringFlag(c.TCPKaEnable.Value) + tcpKaEnable, err := argparser.ConvertBoolFromStringFlag(c.TCPKaEnable.Value, "tcp-ka-enabled") if err != nil { - err := errors.New("'tcp-ka-enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } diff --git a/pkg/commands/dashboard/list.go b/pkg/commands/dashboard/list.go index 575023b4c..678c12986 100644 --- a/pkg/commands/dashboard/list.go +++ b/pkg/commands/dashboard/list.go @@ -2,7 +2,6 @@ package dashboard import ( "context" - "errors" "io" "github.com/fastly/go-fastly/v12/fastly" @@ -123,9 +122,8 @@ func (c *ListCommand) constructInput() (*fastly.ListObservabilityCustomDashboard var sign string var err error if c.order.WasSet { - sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value) + sign, err = argparser.ConvertOrderFromStringFlag(c.order.Value, "order") if err != nil { - err := errors.New("'order' flag must be one of the following [asc, desc]") c.Globals.ErrLog.Add(err) return nil, err } diff --git a/pkg/commands/imageoptimizerdefaults/update.go b/pkg/commands/imageoptimizerdefaults/update.go index d2c868f96..5df3bc5b4 100644 --- a/pkg/commands/imageoptimizerdefaults/update.go +++ b/pkg/commands/imageoptimizerdefaults/update.go @@ -2,7 +2,6 @@ package imageoptimizerdefaults import ( "context" - "errors" "fmt" "io" @@ -160,9 +159,8 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { } } if c.webp.WasSet { - webp, err := argparser.ConvertBoolFromStringFlag(c.webp.Value) + webp, err := argparser.ConvertBoolFromStringFlag(c.webp.Value, "webp") if err != nil { - err := errors.New("'webp' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } @@ -191,18 +189,16 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { c.Input.JpegQuality = &c.jpegQuality.Value } if c.upscale.WasSet { - upscale, err := argparser.ConvertBoolFromStringFlag(c.upscale.Value) + upscale, err := argparser.ConvertBoolFromStringFlag(c.upscale.Value, "upscale") if err != nil { - err := errors.New("'upscale' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } c.Input.Upscale = upscale } if c.allowVideo.WasSet { - allowVideo, err := argparser.ConvertBoolFromStringFlag(c.allowVideo.Value) + allowVideo, err := argparser.ConvertBoolFromStringFlag(c.allowVideo.Value, "allow-video") if err != nil { - err := errors.New("'allow-video' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } diff --git a/pkg/commands/ngwaf/workspace/threshold/create.go b/pkg/commands/ngwaf/workspace/threshold/create.go index 26c8d188e..798b41d75 100644 --- a/pkg/commands/ngwaf/workspace/threshold/create.go +++ b/pkg/commands/ngwaf/workspace/threshold/create.go @@ -75,16 +75,14 @@ func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { return err } - enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value) + enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value, "enabled") if err != nil { - err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } - dontNotify, err := argparser.ConvertBoolFromStringFlag(c.dontNotify.Value) + dontNotify, err := argparser.ConvertBoolFromStringFlag(c.dontNotify.Value, "do-not-notify") if err != nil { - err := errors.New("'do-not-notify' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } diff --git a/pkg/commands/ngwaf/workspace/threshold/update.go b/pkg/commands/ngwaf/workspace/threshold/update.go index be4e51bd8..451d669a1 100644 --- a/pkg/commands/ngwaf/workspace/threshold/update.go +++ b/pkg/commands/ngwaf/workspace/threshold/update.go @@ -84,9 +84,8 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { input.Action = &c.action.Value } if c.dontNotify.WasSet { - dontNotify, err := argparser.ConvertBoolFromStringFlag(c.dontNotify.Value) + dontNotify, err := argparser.ConvertBoolFromStringFlag(c.dontNotify.Value, "do-not-notify") if err != nil { - err := errors.New("'do-not-notify' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } @@ -96,9 +95,8 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { input.Duration = &c.duration.Value } if c.enabled.WasSet { - enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value) + enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value, "enabled") if err != nil { - err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } diff --git a/pkg/commands/ngwaf/workspace/virtualpatch/update.go b/pkg/commands/ngwaf/workspace/virtualpatch/update.go index ca9cc478c..d4d334c4f 100644 --- a/pkg/commands/ngwaf/workspace/virtualpatch/update.go +++ b/pkg/commands/ngwaf/workspace/virtualpatch/update.go @@ -66,9 +66,8 @@ func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { WorkspaceID: &c.workspaceID, } if c.enabled.WasSet { - enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value) + enabled, err := argparser.ConvertBoolFromStringFlag(c.enabled.Value, "enabled") if err != nil { - err := errors.New("'enabled' flag must be one of the following [true, false]") c.Globals.ErrLog.Add(err) return err } From ab0b23b0ac8c7284ef8d9e638d821e1dfc86dd21 Mon Sep 17 00:00:00 2001 From: Anthony Gomez Date: Mon, 12 Jan 2026 12:55:31 -0500 Subject: [PATCH 5/5] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c6d71668..feae4bb22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ - feat(compute/hashfiles): remove hashsum subcommand ([#1608](https://github.com/fastly/cli/pull/1608)) - feat(commands/ngwaf/rules): add support for CRUD operations for NGWAF rules ([#1578](https://github.com/fastly/cli/pull/1605)) - feat(compute/deploy): added the `--no-default-domain` flag to allow for the skipping of automatic domain creation when deploying a Compute service([#1610](https://github.com/fastly/cli/pull/1610)) -- refactor(flag_conversion.go): add flag conversion utilities for converting string flags to bools and checking ascending and desecnding flags ([#1611](https://github.com/fastly/cli/pull/1611)) +- refactor(argparser/flags.go): add flag conversion utilities for converting string flags to bools and checking ascending and desecnding flags ([#1611](https://github.com/fastly/cli/pull/1611)) ### Bug fixes: