pagination.go 2.0 KB

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