github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/service/update.go (about)

     1  package service
     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/global"
    11  	"github.com/fastly/cli/pkg/text"
    12  )
    13  
    14  // UpdateCommand calls the Fastly API to create services.
    15  type UpdateCommand struct {
    16  	argparser.Base
    17  
    18  	comment     argparser.OptionalString
    19  	input       fastly.UpdateServiceInput
    20  	name        argparser.OptionalString
    21  	serviceName argparser.OptionalServiceNameID
    22  }
    23  
    24  // NewUpdateCommand returns a usable command registered under the parent.
    25  func NewUpdateCommand(parent argparser.Registerer, g *global.Data) *UpdateCommand {
    26  	c := UpdateCommand{
    27  		Base: argparser.Base{
    28  			Globals: g,
    29  		},
    30  	}
    31  	c.CmdClause = parent.Command("update", "Update a Fastly service")
    32  
    33  	// Optional.
    34  	c.CmdClause.Flag("comment", "Human-readable comment").Action(c.comment.Set).StringVar(&c.comment.Value)
    35  	c.CmdClause.Flag("name", "Service name").Short('n').Action(c.name.Set).StringVar(&c.name.Value)
    36  	c.RegisterFlag(argparser.StringFlagOpts{
    37  		Name:        argparser.FlagServiceIDName,
    38  		Description: argparser.FlagServiceIDDesc,
    39  		Dst:         &g.Manifest.Flag.ServiceID,
    40  		Short:       's',
    41  	})
    42  	c.RegisterFlag(argparser.StringFlagOpts{
    43  		Action:      c.serviceName.Set,
    44  		Name:        argparser.FlagServiceName,
    45  		Description: argparser.FlagServiceDesc,
    46  		Dst:         &c.serviceName.Value,
    47  	})
    48  	return &c
    49  }
    50  
    51  // Exec invokes the application logic for the command.
    52  func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error {
    53  	serviceID, source, flag, err := argparser.ServiceID(c.serviceName, *c.Globals.Manifest, c.Globals.APIClient, c.Globals.ErrLog)
    54  	if err != nil {
    55  		return err
    56  	}
    57  	if c.Globals.Verbose() {
    58  		argparser.DisplayServiceID(serviceID, flag, source, out)
    59  	}
    60  
    61  	c.input.ServiceID = serviceID
    62  
    63  	if !c.name.WasSet && !c.comment.WasSet {
    64  		return fmt.Errorf("error parsing arguments: must provide either --name or --comment to update service")
    65  	}
    66  
    67  	if c.name.WasSet {
    68  		c.input.Name = &c.name.Value
    69  	}
    70  	if c.comment.WasSet {
    71  		c.input.Comment = &c.comment.Value
    72  	}
    73  
    74  	s, err := c.Globals.APIClient.UpdateService(&c.input)
    75  	if err != nil {
    76  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    77  			"Service ID":   serviceID,
    78  			"Service Name": c.name.Value,
    79  			"Comment":      c.comment.Value,
    80  		})
    81  		return err
    82  	}
    83  
    84  	text.Success(out, "Updated service %s", fastly.ToValue(s.ServiceID))
    85  	return nil
    86  }