github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/domain/update.go (about) 1 package domain 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/fastly/go-fastly/v9/fastly" 8 9 "github.com/fastly/cli/pkg/argparser" 10 "github.com/fastly/cli/pkg/errors" 11 "github.com/fastly/cli/pkg/global" 12 "github.com/fastly/cli/pkg/text" 13 ) 14 15 // UpdateCommand calls the Fastly API to update domains. 16 type UpdateCommand struct { 17 argparser.Base 18 input fastly.UpdateDomainInput 19 serviceName argparser.OptionalServiceNameID 20 serviceVersion argparser.OptionalServiceVersion 21 autoClone argparser.OptionalAutoClone 22 23 NewName argparser.OptionalString 24 Comment argparser.OptionalString 25 } 26 27 // NewUpdateCommand returns a usable command registered under the parent. 28 func NewUpdateCommand(parent argparser.Registerer, g *global.Data) *UpdateCommand { 29 c := UpdateCommand{ 30 Base: argparser.Base{ 31 Globals: g, 32 }, 33 } 34 c.CmdClause = parent.Command("update", "Update a domain on a Fastly service version") 35 36 // Required. 37 c.CmdClause.Flag("name", "Domain name").Short('n').Required().StringVar(&c.input.Name) 38 c.RegisterFlag(argparser.StringFlagOpts{ 39 Name: argparser.FlagVersionName, 40 Description: argparser.FlagVersionDesc, 41 Dst: &c.serviceVersion.Value, 42 Required: true, 43 }) 44 45 // Optional. 46 c.RegisterAutoCloneFlag(argparser.AutoCloneFlagOpts{ 47 Action: c.autoClone.Set, 48 Dst: &c.autoClone.Value, 49 }) 50 c.CmdClause.Flag("comment", "A descriptive note").Action(c.Comment.Set).StringVar(&c.Comment.Value) 51 c.CmdClause.Flag("new-name", "New domain name").Action(c.NewName.Set).StringVar(&c.NewName.Value) 52 c.RegisterFlag(argparser.StringFlagOpts{ 53 Name: argparser.FlagServiceIDName, 54 Description: argparser.FlagServiceIDDesc, 55 Dst: &g.Manifest.Flag.ServiceID, 56 Short: 's', 57 }) 58 c.RegisterFlag(argparser.StringFlagOpts{ 59 Action: c.serviceName.Set, 60 Name: argparser.FlagServiceName, 61 Description: argparser.FlagServiceDesc, 62 Dst: &c.serviceName.Value, 63 }) 64 return &c 65 } 66 67 // Exec invokes the application logic for the command. 68 func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error { 69 serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{ 70 AutoCloneFlag: c.autoClone, 71 APIClient: c.Globals.APIClient, 72 Manifest: *c.Globals.Manifest, 73 Out: out, 74 ServiceNameFlag: c.serviceName, 75 ServiceVersionFlag: c.serviceVersion, 76 VerboseMode: c.Globals.Flags.Verbose, 77 }) 78 if err != nil { 79 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 80 "Service ID": serviceID, 81 "Service Version": errors.ServiceVersion(serviceVersion), 82 }) 83 return err 84 } 85 86 c.input.ServiceID = serviceID 87 c.input.ServiceVersion = fastly.ToValue(serviceVersion.Number) 88 89 // If neither arguments are provided, error with useful message. 90 if !c.NewName.WasSet && !c.Comment.WasSet { 91 return fmt.Errorf("error parsing arguments: must provide either --new-name or --comment to update domain") 92 } 93 94 if c.NewName.WasSet { 95 c.input.NewName = &c.NewName.Value 96 } 97 if c.Comment.WasSet { 98 c.input.Comment = &c.Comment.Value 99 } 100 101 d, err := c.Globals.APIClient.UpdateDomain(&c.input) 102 if err != nil { 103 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 104 "Service ID": serviceID, 105 "Service Version": fastly.ToValue(serviceVersion.Number), 106 "New Name": c.NewName.Value, 107 "Comment": c.Comment.Value, 108 }) 109 return err 110 } 111 112 text.Success(out, "Updated domain %s (service %s version %d)", fastly.ToValue(d.Name), fastly.ToValue(d.ServiceID), fastly.ToValue(d.ServiceVersion)) 113 return nil 114 }