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  }