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 }