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

     1  package service
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"strconv"
     7  
     8  	"github.com/fastly/go-fastly/v9/fastly"
     9  
    10  	"github.com/fastly/cli/pkg/argparser"
    11  	fsterr "github.com/fastly/cli/pkg/errors"
    12  	"github.com/fastly/cli/pkg/global"
    13  	"github.com/fastly/cli/pkg/text"
    14  	"github.com/fastly/cli/pkg/time"
    15  )
    16  
    17  // ListCommand calls the Fastly API to list services.
    18  type ListCommand struct {
    19  	argparser.Base
    20  	argparser.JSONOutput
    21  
    22  	direction     string
    23  	page, perPage int
    24  	input         fastly.GetServicesInput
    25  	sort          string
    26  }
    27  
    28  // NewListCommand returns a usable command registered under the parent.
    29  func NewListCommand(parent argparser.Registerer, g *global.Data) *ListCommand {
    30  	c := ListCommand{
    31  		Base: argparser.Base{
    32  			Globals: g,
    33  		},
    34  	}
    35  	c.CmdClause = parent.Command("list", "List Fastly services")
    36  
    37  	// Optional.
    38  	c.CmdClause.Flag("direction", "Direction in which to sort results").Default(argparser.PaginationDirection[0]).HintOptions(argparser.PaginationDirection...).EnumVar(&c.direction, argparser.PaginationDirection...)
    39  	c.RegisterFlagBool(c.JSONFlag()) // --json
    40  	c.CmdClause.Flag("page", "Page number of data set to fetch").IntVar(&c.page)
    41  	c.CmdClause.Flag("per-page", "Number of records per page").IntVar(&c.perPage)
    42  	c.CmdClause.Flag("sort", "Field on which to sort").Default("created").StringVar(&c.sort)
    43  	return &c
    44  }
    45  
    46  // Exec invokes the application logic for the command.
    47  func (c *ListCommand) Exec(_ io.Reader, out io.Writer) error {
    48  	if c.Globals.Verbose() && c.JSONOutput.Enabled {
    49  		return fsterr.ErrInvalidVerboseJSONCombo
    50  	}
    51  
    52  	c.input.Direction = &c.direction
    53  	c.input.Page = &c.page
    54  	c.input.PerPage = &c.perPage
    55  	c.input.Sort = &c.sort
    56  	paginator := c.Globals.APIClient.GetServices(&c.input)
    57  
    58  	var o []*fastly.Service
    59  	for paginator.HasNext() {
    60  		data, err := paginator.GetNext()
    61  		if err != nil {
    62  			c.Globals.ErrLog.AddWithContext(err, map[string]any{
    63  				"Remaining Pages": paginator.Remaining(),
    64  			})
    65  			return err
    66  		}
    67  		o = append(o, data...)
    68  	}
    69  
    70  	if ok, err := c.WriteJSON(out, o); ok {
    71  		return err
    72  	}
    73  
    74  	if !c.Globals.Verbose() {
    75  		tw := text.NewTable(out)
    76  		tw.AddHeader("NAME", "ID", "TYPE", "ACTIVE VERSION", "LAST EDITED (UTC)")
    77  		for _, service := range o {
    78  			updatedAt := "n/a"
    79  			if service.UpdatedAt != nil {
    80  				updatedAt = service.UpdatedAt.UTC().Format(time.Format)
    81  			}
    82  
    83  			activeVersion := strconv.Itoa(fastly.ToValue(service.ActiveVersion))
    84  			for _, v := range service.Versions {
    85  				if fastly.ToValue(v.Number) == fastly.ToValue(service.ActiveVersion) && !fastly.ToValue(v.Active) {
    86  					activeVersion = "n/a"
    87  				}
    88  			}
    89  
    90  			tw.AddLine(
    91  				fastly.ToValue(service.Name),
    92  				fastly.ToValue(service.ServiceID),
    93  				fastly.ToValue(service.Type),
    94  				activeVersion,
    95  				updatedAt,
    96  			)
    97  		}
    98  		tw.Print()
    99  		return nil
   100  	}
   101  
   102  	for i, service := range o {
   103  		fmt.Fprintf(out, "Service %d/%d\n", i+1, len(o))
   104  		text.PrintService(out, "\t", service)
   105  		fmt.Fprintln(out)
   106  	}
   107  
   108  	return nil
   109  }