@@ -39,22 +39,27 @@ var PagerFlag = &cli.Flag{Category: "caller",
3939 {Key : "PageNumber" , DefaultValue : "PageNumber" , Short : i18n .T (" PageNumber" , "指定PageNumber的属性" )},
4040 {Key : "PageSize" , DefaultValue : "PageSize" , Short : i18n .T ("PageSize" , "" )},
4141 {Key : "TotalCount" , DefaultValue : "TotalCount" , Short : i18n .T ("TotalCount" , "" )},
42+ {Key : "NextToken" , DefaultValue : "NextToken" , Short : i18n .T ("NextToken" , "" )},
4243 },
4344 ExcludeWith : []string {WaiterFlag .Name },
4445}
4546
4647type Pager struct {
4748 PageNumberFlag string
4849 PageSizeFlag string
50+ NextTokenFlag string
4951
5052 PageNumberExpr string
5153 PageSizeExpr string
5254 TotalCountExpr string
55+ NextTokenExpr string
5356
5457 PageSize int
5558
5659 totalCount int
5760 currentPageNumber int
61+ nextTokenMode bool
62+ nextToken string
5863 collectionPath string
5964
6065 results []interface {}
@@ -75,6 +80,11 @@ func GetPager() *Pager {
7580 pager .PageSizeExpr , _ = PagerFlag .GetFieldValue ("PageSize" )
7681 pager .TotalCountExpr , _ = PagerFlag .GetFieldValue ("TotalCount" )
7782
83+ nextTokenFlagTemp , _ := PagerFlag .GetFieldValue ("NextToken" )
84+ tempStr = strings .Split (nextTokenFlagTemp , "." )
85+ pager .NextTokenFlag = tempStr [len (tempStr )- 1 ]
86+ pager .NextTokenExpr = nextTokenFlagTemp
87+
7888 pager .collectionPath , _ = PagerFlag .GetFieldValue ("path" )
7989 return pager
8090}
@@ -101,6 +111,9 @@ func (a *Pager) CallWith(invoker Invoker) (string, error) {
101111}
102112
103113func (a * Pager ) HasMore () bool {
114+ if a .nextTokenMode {
115+ return a .nextToken != ""
116+ }
104117 pages := int (math .Ceil (float64 (a .totalCount ) / float64 (a .PageSize )))
105118 return a .currentPageNumber < pages
106119}
@@ -135,40 +148,56 @@ func (a *Pager) FeedResponse(body string) error {
135148 return fmt .Errorf ("unmarshal %s" , err .Error ())
136149 }
137150
138- if total , err := jmespath .Search (a .TotalCountExpr , j ); err == nil {
139- var totalCount float64
140- if strCount , ok := total .(string ); ok {
141- totalCount , _ = strconv .ParseFloat (strCount , 64 )
151+ if a .nextTokenMode {
152+ a .nextToken = ""
153+ }
154+ if a .NextTokenExpr != "" {
155+ // allow to ignore NextToken mode
156+ if val , err := jmespath .Search (a .NextTokenExpr , j ); err == nil {
157+ if nextToken , ok := val .(string ); ok {
158+ a .nextToken = nextToken
159+ a .nextTokenMode = true
160+ }
142161 } else {
143- totalCount = total .( float64 )
162+ return fmt . Errorf ( "jmespath: '%s' failed %s" , a . NextTokenExpr , err )
144163 }
145- a .totalCount = int (totalCount )
146- } else {
147- return fmt .Errorf ("jmespath: '%s' failed %s" , a .TotalCountExpr , err )
148164 }
165+ if ! a .nextTokenMode {
166+ if total , err := jmespath .Search (a .TotalCountExpr , j ); err == nil {
167+ var totalCount float64
168+ if strCount , ok := total .(string ); ok {
169+ totalCount , _ = strconv .ParseFloat (strCount , 64 )
170+ } else {
171+ totalCount = total .(float64 )
172+ }
173+ a .totalCount = int (totalCount )
174+ } else {
175+ return fmt .Errorf ("jmespath: '%s' failed %s" , a .TotalCountExpr , err )
176+ }
149177
150- if pageNumber , err := jmespath .Search (a .PageNumberExpr , j ); err == nil {
151- var currentPageNumber float64
152- if strpageNumber , ok := pageNumber .(string ); ok {
153- currentPageNumber , _ = strconv .ParseFloat (strpageNumber , 64 )
178+ if pageNumber , err := jmespath .Search (a .PageNumberExpr , j ); err == nil {
179+ var currentPageNumber float64
180+ if strpageNumber , ok := pageNumber .(string ); ok {
181+ currentPageNumber , _ = strconv .ParseFloat (strpageNumber , 64 )
182+ } else {
183+ currentPageNumber = pageNumber .(float64 )
184+ }
185+ a .currentPageNumber = int (currentPageNumber )
154186 } else {
155- currentPageNumber = pageNumber .( float64 )
187+ return fmt . Errorf ( "jmespath: '%s' failed %s" , a . PageNumberExpr , err )
156188 }
157- a .currentPageNumber = int (currentPageNumber )
158- } else {
159- return fmt .Errorf ("jmespath: '%s' failed %s" , a .PageNumberExpr , err )
160- }
161189
162- if pageSize , err := jmespath .Search (a .PageSizeExpr , j ); err == nil {
163- var PageSize float64
164- if strpageSize , ok := pageSize .(string ); ok {
165- PageSize , _ = strconv .ParseFloat (strpageSize , 64 )
190+ if pageSize , err := jmespath .Search (a .PageSizeExpr , j ); err == nil {
191+ var PageSize float64
192+ if strpageSize , ok := pageSize .(string ); ok {
193+ PageSize , _ = strconv .ParseFloat (strpageSize , 64 )
194+ } else {
195+ PageSize = pageSize .(float64 )
196+ }
197+ a .PageSize = int (PageSize )
166198 } else {
167- PageSize = pageSize .( float64 )
199+ return fmt . Errorf ( "jmespath: '%s' failed %s" , a . PageSizeExpr , err )
168200 }
169- a .PageSize = int (PageSize )
170- } else {
171- return fmt .Errorf ("jmespath: '%s' failed %s" , a .PageSizeExpr , err )
172201 }
173202
174203 if a .collectionPath == "" {
@@ -183,10 +212,13 @@ func (a *Pager) FeedResponse(body string) error {
183212}
184213
185214func (a * Pager ) MoveNextPage (request * requests.CommonRequest ) {
186- a .currentPageNumber = a .currentPageNumber + 1
187- // cli.Printf("Move to page %d", a.currentPageNumber)
188-
189- request .QueryParams [a .PageNumberFlag ] = strconv .Itoa (a .currentPageNumber )
215+ if a .nextTokenMode {
216+ request .QueryParams [a .NextTokenFlag ] = a .nextToken
217+ } else {
218+ a .currentPageNumber = a .currentPageNumber + 1
219+ // cli.Printf("Move to page %d", a.currentPageNumber)
220+ request .QueryParams [a .PageNumberFlag ] = strconv .Itoa (a .currentPageNumber )
221+ }
190222}
191223
192224func (a * Pager ) mergeCollections (body interface {}) error {
0 commit comments