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 }