github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/vcl/condition/create.go (about) 1 package condition 2 3 import ( 4 "io" 5 6 "github.com/fastly/go-fastly/v9/fastly" 7 8 "github.com/fastly/cli/pkg/argparser" 9 "github.com/fastly/cli/pkg/errors" 10 "github.com/fastly/cli/pkg/global" 11 "github.com/fastly/cli/pkg/text" 12 ) 13 14 // ConditionTypes are the allowed input values for the --type flag. 15 // Reference: https://developer.fastly.com/reference/api/vcl-services/condition/ 16 var ConditionTypes = []string{"REQUEST", "CACHE", "RESPONSE", "PREFETCH"} 17 18 // CreateCommand calls the Fastly API to create an appropriate resource. 19 type CreateCommand struct { 20 argparser.Base 21 22 // Required. 23 serviceVersion argparser.OptionalServiceVersion 24 25 // Optional. 26 autoClone argparser.OptionalAutoClone 27 conditionType argparser.OptionalString 28 name argparser.OptionalString 29 priority argparser.OptionalInt 30 serviceName argparser.OptionalServiceNameID 31 statement argparser.OptionalString 32 } 33 34 // NewCreateCommand returns a usable command registered under the parent. 35 func NewCreateCommand(parent argparser.Registerer, g *global.Data) *CreateCommand { 36 c := CreateCommand{ 37 Base: argparser.Base{ 38 Globals: g, 39 }, 40 } 41 c.CmdClause = parent.Command("create", "Create a condition on a Fastly service version").Alias("add") 42 43 // Required flags 44 c.RegisterFlag(argparser.StringFlagOpts{ 45 Name: argparser.FlagVersionName, 46 Description: argparser.FlagVersionDesc, 47 Dst: &c.serviceVersion.Value, 48 Required: true, 49 }) 50 51 // Optional flags 52 c.RegisterAutoCloneFlag(argparser.AutoCloneFlagOpts{ 53 Action: c.autoClone.Set, 54 Dst: &c.autoClone.Value, 55 }) 56 c.CmdClause.Flag("name", "Condition name").Short('n').Action(c.name.Set).StringVar(&c.name.Value) 57 c.CmdClause.Flag("priority", "Condition priority").Action(c.priority.Set).IntVar(&c.priority.Value) 58 c.CmdClause.Flag("statement", "Condition statement").Action(c.statement.Set).StringVar(&c.statement.Value) 59 c.CmdClause.Flag("type", "Condition type").HintOptions(ConditionTypes...).Action(c.conditionType.Set).EnumVar(&c.conditionType.Value, ConditionTypes...) 60 c.RegisterFlag(argparser.StringFlagOpts{ 61 Name: argparser.FlagServiceIDName, 62 Description: argparser.FlagServiceIDDesc, 63 Dst: &g.Manifest.Flag.ServiceID, 64 Short: 's', 65 }) 66 c.RegisterFlag(argparser.StringFlagOpts{ 67 Action: c.serviceName.Set, 68 Name: argparser.FlagServiceName, 69 Description: argparser.FlagServiceDesc, 70 Dst: &c.serviceName.Value, 71 }) 72 73 return &c 74 } 75 76 // Exec invokes the application logic for the command. 77 func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error { 78 serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{ 79 AutoCloneFlag: c.autoClone, 80 APIClient: c.Globals.APIClient, 81 Manifest: *c.Globals.Manifest, 82 Out: out, 83 ServiceNameFlag: c.serviceName, 84 ServiceVersionFlag: c.serviceVersion, 85 VerboseMode: c.Globals.Flags.Verbose, 86 }) 87 if err != nil { 88 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 89 "Service ID": serviceID, 90 "Service Version": errors.ServiceVersion(serviceVersion), 91 }) 92 return err 93 } 94 95 input := fastly.CreateConditionInput{ 96 ServiceID: serviceID, 97 ServiceVersion: fastly.ToValue(serviceVersion.Number), 98 } 99 100 if c.name.WasSet { 101 input.Name = &c.name.Value 102 } 103 if c.statement.WasSet { 104 input.Statement = &c.statement.Value 105 } 106 if c.conditionType.WasSet { 107 input.Type = &c.conditionType.Value 108 } 109 if c.priority.WasSet { 110 input.Priority = &c.priority.Value 111 } 112 r, err := c.Globals.APIClient.CreateCondition(&input) 113 if err != nil { 114 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 115 "Service ID": serviceID, 116 "Service Version": fastly.ToValue(serviceVersion.Number), 117 }) 118 return err 119 } 120 121 text.Success(out, 122 "Created condition %s (service %s version %d)", 123 fastly.ToValue(r.Name), 124 fastly.ToValue(r.ServiceID), 125 fastly.ToValue(r.ServiceVersion), 126 ) 127 return nil 128 }