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

     1  package condition
     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 an appropriate resource.
    16  type UpdateCommand struct {
    17  	argparser.Base
    18  	input          fastly.UpdateConditionInput
    19  	serviceName    argparser.OptionalServiceNameID
    20  	serviceVersion argparser.OptionalServiceVersion
    21  	autoClone      argparser.OptionalAutoClone
    22  
    23  	newName       argparser.OptionalString
    24  	statement     argparser.OptionalString
    25  	conditionType argparser.OptionalString
    26  	priority      argparser.OptionalInt
    27  	comment       argparser.OptionalString
    28  }
    29  
    30  // NewUpdateCommand returns a usable command registered under the parent.
    31  func NewUpdateCommand(parent argparser.Registerer, g *global.Data) *UpdateCommand {
    32  	var c UpdateCommand
    33  	c.CmdClause = parent.Command("update", "Update a condition on a Fastly service version")
    34  	c.Globals = g
    35  
    36  	// Required flags
    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 flags
    46  	c.RegisterAutoCloneFlag(argparser.AutoCloneFlagOpts{
    47  		Action: c.autoClone.Set,
    48  		Dst:    &c.autoClone.Value,
    49  	})
    50  	c.CmdClause.Flag("new-name", "New condition name").Action(c.newName.Set).StringVar(&c.newName.Value)
    51  	c.CmdClause.Flag("priority", "Condition priority").Action(c.priority.Set).IntVar(&c.priority.Value)
    52  	c.CmdClause.Flag("statement", "Condition statement").Action(c.statement.Set).StringVar(&c.statement.Value)
    53  	c.CmdClause.Flag("type", "Condition type").Action(c.conditionType.Set).StringVar(&c.conditionType.Value)
    54  	c.CmdClause.Flag("comment", "Condition comment").Action(c.comment.Set).StringVar(&c.comment.Value)
    55  
    56  	c.RegisterFlag(argparser.StringFlagOpts{
    57  		Name:        argparser.FlagServiceIDName,
    58  		Description: argparser.FlagServiceIDDesc,
    59  		Dst:         &g.Manifest.Flag.ServiceID,
    60  		Short:       's',
    61  	})
    62  	c.RegisterFlag(argparser.StringFlagOpts{
    63  		Action:      c.serviceName.Set,
    64  		Name:        argparser.FlagServiceName,
    65  		Description: argparser.FlagServiceDesc,
    66  		Dst:         &c.serviceName.Value,
    67  	})
    68  
    69  	return &c
    70  }
    71  
    72  // Exec invokes the application logic for the command.
    73  func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error {
    74  	serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{
    75  		AutoCloneFlag:      c.autoClone,
    76  		APIClient:          c.Globals.APIClient,
    77  		Manifest:           *c.Globals.Manifest,
    78  		Out:                out,
    79  		ServiceNameFlag:    c.serviceName,
    80  		ServiceVersionFlag: c.serviceVersion,
    81  		VerboseMode:        c.Globals.Flags.Verbose,
    82  	})
    83  	if err != nil {
    84  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    85  			"Service ID":      serviceID,
    86  			"Service Version": errors.ServiceVersion(serviceVersion),
    87  		})
    88  		return err
    89  	}
    90  
    91  	c.input.ServiceID = serviceID
    92  	c.input.ServiceVersion = fastly.ToValue(serviceVersion.Number)
    93  
    94  	// If no argument are provided, error with useful message.
    95  	if !c.newName.WasSet && !c.priority.WasSet && !c.statement.WasSet && !c.conditionType.WasSet {
    96  		return fmt.Errorf("error parsing arguments: must provide either --new-name, --statement, --type or --priority to update condition")
    97  	}
    98  
    99  	if c.newName.WasSet {
   100  		c.input.Name = c.newName.Value
   101  	}
   102  	if c.priority.WasSet {
   103  		c.input.Priority = &c.priority.Value
   104  	}
   105  	if c.conditionType.WasSet {
   106  		c.input.Type = &c.conditionType.Value
   107  	}
   108  	if c.statement.WasSet {
   109  		c.input.Statement = &c.statement.Value
   110  	}
   111  	if c.comment.WasSet {
   112  		c.input.Statement = &c.comment.Value
   113  	}
   114  
   115  	r, err := c.Globals.APIClient.UpdateCondition(&c.input)
   116  	if err != nil {
   117  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
   118  			"Service ID":      serviceID,
   119  			"Service Version": fastly.ToValue(serviceVersion.Number),
   120  		})
   121  		return err
   122  	}
   123  
   124  	text.Success(out,
   125  		"Updated condition %s (service %s version %d)",
   126  		fastly.ToValue(r.Name),
   127  		fastly.ToValue(r.ServiceID),
   128  		fastly.ToValue(r.ServiceVersion),
   129  	)
   130  	return nil
   131  }