diff --git a/api/audit_trail/v1alpha1/custom.go b/api/audit_trail/v1alpha1/custom.go new file mode 100644 index 00000000..e0c88178 --- /dev/null +++ b/api/audit_trail/v1alpha1/custom.go @@ -0,0 +1,16 @@ +package audit_trail + +import ( + "github.com/scaleway/scaleway-sdk-go/errors" +) + +func (r *ListEventsResponse) UnsafeAppend(res interface{}) (*string, error) { + results, ok := res.(*ListEventsResponse) + if !ok { + return nil, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Events = append(r.Events, results.Events...) + + return results.NextPageToken, nil +} diff --git a/scw/client.go b/scw/client.go index d2e01082..1d6dd67c 100644 --- a/scw/client.go +++ b/scw/client.go @@ -264,6 +264,10 @@ func (c *Client) do(req *ScalewayRequest, res interface{}) (sdkErr error) { return nil } +type listerWithToken interface { + UnsafeAppend(interface{}) (*string, error) +} + type lister interface { UnsafeGetTotalCount() uint64 UnsafeAppend(interface{}) (uint64, error) @@ -301,6 +305,14 @@ func listerAppend(recv interface{}, elems interface{}) (uint64, error) { panic(fmt.Errorf("%T does not support pagination but checks failed, should not happen", recv)) } +func listerTokenAppend(recv interface{}, elems interface{}) (*string, error) { + if l, isLister := recv.(listerWithToken); isLister { + return l.UnsafeAppend(elems) + } + + panic(fmt.Errorf("%T does not support token pagination but checks failed, should not happen", recv)) +} + func isLister(i interface{}) bool { switch i.(type) { case lister: @@ -312,6 +324,15 @@ func isLister(i interface{}) bool { } } +func isListerWithToken(i interface{}) bool { + switch i.(type) { + case listerWithToken: + return true + default: + return false + } +} + const maxPageCount uint64 = math.MaxUint32 // doListAll collects all pages of a List request and aggregate all results on a single response. @@ -348,6 +369,31 @@ func (c *Client) doListAll(req *ScalewayRequest, res interface{}) (err error) { } return nil } + if isListerWithToken(res) { + var nextPageToken *string + + for { + if nextPageToken != nil { + req.Query.Set("page_token", *nextPageToken) + } + + nextPage := newVariableFromType(res) + err := c.do(req, nextPage) + if err != nil { + return err + } + + // append results + nextPageToken, err = listerTokenAppend(res, nextPage) + if err != nil { + return err + } + + if nextPageToken == nil { + return nil + } + } + } return errors.New("%T does not support pagination", res) }