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

     1  package domain
     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  // CreateCommand calls the Fastly API to create domains.
    15  type CreateCommand struct {
    16  	argparser.Base
    17  
    18  	// Required.
    19  	serviceVersion argparser.OptionalServiceVersion
    20  
    21  	// Optional.
    22  	autoClone   argparser.OptionalAutoClone
    23  	comment     argparser.OptionalString
    24  	name        argparser.OptionalString
    25  	serviceName argparser.OptionalServiceNameID
    26  }
    27  
    28  // NewCreateCommand returns a usable command registered under the parent.
    29  func NewCreateCommand(parent argparser.Registerer, g *global.Data) *CreateCommand {
    30  	c := CreateCommand{
    31  		Base: argparser.Base{
    32  			Globals: g,
    33  		},
    34  	}
    35  	c.CmdClause = parent.Command("create", "Create a domain on a Fastly service version").Alias("add")
    36  
    37  	// Required.
    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("name", "Domain name").Short('n').Action(c.name.Set).StringVar(&c.name.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 *CreateCommand) 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  	input := fastly.CreateDomainInput{
    86  		ServiceID:      serviceID,
    87  		ServiceVersion: fastly.ToValue(serviceVersion.Number),
    88  	}
    89  	if c.name.WasSet {
    90  		input.Name = &c.name.Value
    91  	}
    92  	if c.comment.WasSet {
    93  		input.Comment = &c.comment.Value
    94  	}
    95  	d, err := c.Globals.APIClient.CreateDomain(&input)
    96  	if err != nil {
    97  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    98  			"Service ID":      serviceID,
    99  			"Service Version": fastly.ToValue(serviceVersion.Number),
   100  		})
   101  		return err
   102  	}
   103  
   104  	text.Success(out, "Created domain %s (service %s version %d)", fastly.ToValue(d.Name), fastly.ToValue(d.ServiceID), fastly.ToValue(d.ServiceVersion))
   105  	return nil
   106  }