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  }