github.com/aavshr/aws-sdk-go@v1.41.3/private/model/api/pagination.go (about)

     1  //go:build codegen
     2  // +build codegen
     3  
     4  package api
     5  
     6  import (
     7  	"encoding/json"
     8  	"fmt"
     9  	"os"
    10  )
    11  
    12  // Paginator keeps track of pagination configuration for an API operation.
    13  type Paginator struct {
    14  	InputTokens  interface{} `json:"input_token"`
    15  	OutputTokens interface{} `json:"output_token"`
    16  	LimitKey     string      `json:"limit_key"`
    17  	MoreResults  string      `json:"more_results"`
    18  }
    19  
    20  // InputTokensString returns output tokens formatted as a list
    21  func (p *Paginator) InputTokensString() string {
    22  	str := p.InputTokens.([]string)
    23  	return fmt.Sprintf("%#v", str)
    24  }
    25  
    26  // OutputTokensString returns output tokens formatted as a list
    27  func (p *Paginator) OutputTokensString() string {
    28  	str := p.OutputTokens.([]string)
    29  	return fmt.Sprintf("%#v", str)
    30  }
    31  
    32  // used for unmarshaling from the paginators JSON file
    33  type paginationDefinitions struct {
    34  	*API
    35  	Pagination map[string]Paginator
    36  }
    37  
    38  // AttachPaginators attaches pagination configuration from filename to the API.
    39  func (a *API) AttachPaginators(filename string) error {
    40  	p := paginationDefinitions{API: a}
    41  
    42  	f, err := os.Open(filename)
    43  	defer f.Close()
    44  	if err != nil {
    45  		return err
    46  	}
    47  	err = json.NewDecoder(f).Decode(&p)
    48  	if err != nil {
    49  		return fmt.Errorf("failed to decode %s, err: %v", filename, err)
    50  	}
    51  
    52  	return p.setup()
    53  }
    54  
    55  // setup runs post-processing on the paginator configuration.
    56  func (p *paginationDefinitions) setup() error {
    57  	for n, e := range p.Pagination {
    58  		if e.InputTokens == nil || e.OutputTokens == nil {
    59  			continue
    60  		}
    61  		paginator := e
    62  
    63  		switch t := paginator.InputTokens.(type) {
    64  		case string:
    65  			paginator.InputTokens = []string{t}
    66  		case []interface{}:
    67  			toks := []string{}
    68  			for _, e := range t {
    69  				s := e.(string)
    70  				toks = append(toks, s)
    71  			}
    72  			paginator.InputTokens = toks
    73  		}
    74  		switch t := paginator.OutputTokens.(type) {
    75  		case string:
    76  			paginator.OutputTokens = []string{t}
    77  		case []interface{}:
    78  			toks := []string{}
    79  			for _, e := range t {
    80  				s := e.(string)
    81  				toks = append(toks, s)
    82  			}
    83  			paginator.OutputTokens = toks
    84  		}
    85  
    86  		if o, ok := p.Operations[n]; ok {
    87  			o.Paginator = &paginator
    88  		} else {
    89  			return fmt.Errorf("unknown operation for paginator, %s", n)
    90  		}
    91  	}
    92  
    93  	return nil
    94  }
    95  
    96  func enableStopOnSameToken(service string) bool {
    97  	switch service {
    98  	case "cloudwatchlogs":
    99  		return true
   100  	default:
   101  		return false
   102  	}
   103  }