github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/dictionaryentry/list.go (about) 1 package dictionaryentry 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 fsterr "github.com/fastly/cli/pkg/errors" 11 "github.com/fastly/cli/pkg/global" 12 "github.com/fastly/cli/pkg/text" 13 ) 14 15 // ListCommand calls the Fastly API to list dictionary items. 16 type ListCommand struct { 17 argparser.Base 18 argparser.JSONOutput 19 20 direction string 21 input fastly.GetDictionaryItemsInput 22 page, perPage int 23 serviceName argparser.OptionalServiceNameID 24 sort string 25 } 26 27 // NewListCommand returns a usable command registered under the parent. 28 func NewListCommand(parent argparser.Registerer, g *global.Data) *ListCommand { 29 c := ListCommand{ 30 Base: argparser.Base{ 31 Globals: g, 32 }, 33 } 34 c.CmdClause = parent.Command("list", "List items in a Fastly edge dictionary") 35 36 // Required. 37 c.CmdClause.Flag("dictionary-id", "Dictionary ID").Required().StringVar(&c.input.DictionaryID) 38 39 // Optional. 40 c.CmdClause.Flag("direction", "Direction in which to sort results").Default(argparser.PaginationDirection[0]).HintOptions(argparser.PaginationDirection...).EnumVar(&c.direction, argparser.PaginationDirection...) 41 c.RegisterFlagBool(c.JSONFlag()) // --json 42 c.CmdClause.Flag("page", "Page number of data set to fetch").IntVar(&c.page) 43 c.CmdClause.Flag("per-page", "Number of records per page").IntVar(&c.perPage) 44 c.RegisterFlag(argparser.StringFlagOpts{ 45 Name: argparser.FlagServiceIDName, 46 Description: argparser.FlagServiceIDDesc, 47 Dst: &g.Manifest.Flag.ServiceID, 48 Short: 's', 49 }) 50 c.RegisterFlag(argparser.StringFlagOpts{ 51 Action: c.serviceName.Set, 52 Name: argparser.FlagServiceName, 53 Description: argparser.FlagServiceDesc, 54 Dst: &c.serviceName.Value, 55 }) 56 c.CmdClause.Flag("sort", "Field on which to sort").Default("created").StringVar(&c.sort) 57 return &c 58 } 59 60 // Exec invokes the application logic for the command. 61 func (c *ListCommand) Exec(_ io.Reader, out io.Writer) error { 62 if c.Globals.Verbose() && c.JSONOutput.Enabled { 63 return fsterr.ErrInvalidVerboseJSONCombo 64 } 65 66 serviceID, source, flag, err := argparser.ServiceID(c.serviceName, *c.Globals.Manifest, c.Globals.APIClient, c.Globals.ErrLog) 67 if err != nil { 68 return err 69 } 70 if c.Globals.Verbose() { 71 argparser.DisplayServiceID(serviceID, flag, source, out) 72 } 73 74 c.input.Direction = &c.direction 75 c.input.Page = &c.page 76 c.input.PerPage = &c.perPage 77 c.input.ServiceID = serviceID 78 c.input.Sort = &c.sort 79 paginator := c.Globals.APIClient.GetDictionaryItems(&c.input) 80 81 var o []*fastly.DictionaryItem 82 for paginator.HasNext() { 83 data, err := paginator.GetNext() 84 if err != nil { 85 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 86 "Dictionary ID": c.input.DictionaryID, 87 "Service ID": serviceID, 88 "Remaining Pages": paginator.Remaining(), 89 }) 90 return err 91 } 92 o = append(o, data...) 93 } 94 95 if ok, err := c.WriteJSON(out, o); ok { 96 return err 97 } 98 99 if !c.Globals.Verbose() { 100 fmt.Fprintf(out, "\nService ID: %s\n", c.input.ServiceID) 101 } 102 for i, dictionary := range o { 103 text.Output(out, "Item: %d/%d", i+1, len(o)) 104 text.PrintDictionaryItem(out, "\t", dictionary) 105 text.Break(out) 106 } 107 108 return nil 109 }