Skip to content

Commit

Permalink
Add initial implementation of pagination
Browse files Browse the repository at this point in the history
This change adds a <Operation>Pages() operation to each operation
with pagination configuration to return an iterator that can be
used like slice iteration:

	db := dynamodb.New(nil)
	for resp := range db.ListTablesPages() {
		fmt.Println(resp)
	}

References #58
  • Loading branch information
lsegal committed May 26, 2015
1 parent d7bec60 commit 3664ecc
Show file tree
Hide file tree
Showing 30 changed files with 3,337 additions and 129 deletions.
54 changes: 54 additions & 0 deletions aws/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"reflect"
"strings"
"time"

"github.com/awslabs/aws-sdk-go/aws/awsutil"
)

// A Request is the service request to be made.
Expand Down Expand Up @@ -225,3 +227,55 @@ func (r *Request) Send() error {

return nil
}

func (r *Request) HasNextPage() bool {
return r.nextPageToken() != nil
}

func (r *Request) nextPageToken() interface{} {
if r.Operation.Paginator == nil {
return nil
}
return awsutil.ValueAtPath(r.Data, r.Operation.OutputToken)
}

func (r *Request) NextPage() *Request {
token := r.nextPageToken()
if token == nil {
return nil
}

if r.Operation.TruncationToken != "" {
tr := awsutil.ValueAtPath(r.Data, r.Operation.TruncationToken)
if tr == nil {
return nil
} else {
switch v := tr.(type) {
case bool:
if v == false {
return nil
}
}
}
}

data := reflect.New(reflect.TypeOf(r.Data).Elem()).Interface()
nr := NewRequest(r.Service, r.Operation, r.Params, data)

awsutil.SetValueAtPath(nr.Params, nr.Operation.InputToken, token)
return nr
}

func (r *Request) Pages() <-chan interface{} {
page := r
ch := make(chan interface{})
go func() {
for page != nil {
page.Send()
ch <- page.Data
page = page.NextPage()
}
close(ch)
}()
return ch
}
120 changes: 120 additions & 0 deletions service/autoscaling/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,21 @@ func (c *AutoScaling) DescribeAutoScalingGroups(input *DescribeAutoScalingGroups
return out, err
}

func (c *AutoScaling) DescribeAutoScalingGroupsPages(input *DescribeAutoScalingGroupsInput) <-chan *DescribeAutoScalingGroupsOutput {
page, _ := c.DescribeAutoScalingGroupsRequest(input)
ch := make(chan *DescribeAutoScalingGroupsOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeAutoScalingGroupsOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeAutoScalingGroups *aws.Operation

// DescribeAutoScalingInstancesRequest generates a request for the DescribeAutoScalingInstances operation.
Expand Down Expand Up @@ -593,6 +608,21 @@ func (c *AutoScaling) DescribeAutoScalingInstances(input *DescribeAutoScalingIns
return out, err
}

func (c *AutoScaling) DescribeAutoScalingInstancesPages(input *DescribeAutoScalingInstancesInput) <-chan *DescribeAutoScalingInstancesOutput {
page, _ := c.DescribeAutoScalingInstancesRequest(input)
ch := make(chan *DescribeAutoScalingInstancesOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeAutoScalingInstancesOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeAutoScalingInstances *aws.Operation

// DescribeAutoScalingNotificationTypesRequest generates a request for the DescribeAutoScalingNotificationTypes operation.
Expand Down Expand Up @@ -668,6 +698,21 @@ func (c *AutoScaling) DescribeLaunchConfigurations(input *DescribeLaunchConfigur
return out, err
}

func (c *AutoScaling) DescribeLaunchConfigurationsPages(input *DescribeLaunchConfigurationsInput) <-chan *DescribeLaunchConfigurationsOutput {
page, _ := c.DescribeLaunchConfigurationsRequest(input)
ch := make(chan *DescribeLaunchConfigurationsOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeLaunchConfigurationsOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeLaunchConfigurations *aws.Operation

// DescribeLifecycleHookTypesRequest generates a request for the DescribeLifecycleHookTypes operation.
Expand Down Expand Up @@ -807,6 +852,21 @@ func (c *AutoScaling) DescribeNotificationConfigurations(input *DescribeNotifica
return out, err
}

func (c *AutoScaling) DescribeNotificationConfigurationsPages(input *DescribeNotificationConfigurationsInput) <-chan *DescribeNotificationConfigurationsOutput {
page, _ := c.DescribeNotificationConfigurationsRequest(input)
ch := make(chan *DescribeNotificationConfigurationsOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeNotificationConfigurationsOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeNotificationConfigurations *aws.Operation

// DescribePoliciesRequest generates a request for the DescribePolicies operation.
Expand Down Expand Up @@ -849,6 +909,21 @@ func (c *AutoScaling) DescribePolicies(input *DescribePoliciesInput) (*DescribeP
return out, err
}

func (c *AutoScaling) DescribePoliciesPages(input *DescribePoliciesInput) <-chan *DescribePoliciesOutput {
page, _ := c.DescribePoliciesRequest(input)
ch := make(chan *DescribePoliciesOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribePoliciesOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribePolicies *aws.Operation

// DescribeScalingActivitiesRequest generates a request for the DescribeScalingActivities operation.
Expand Down Expand Up @@ -894,6 +969,21 @@ func (c *AutoScaling) DescribeScalingActivities(input *DescribeScalingActivities
return out, err
}

func (c *AutoScaling) DescribeScalingActivitiesPages(input *DescribeScalingActivitiesInput) <-chan *DescribeScalingActivitiesOutput {
page, _ := c.DescribeScalingActivitiesRequest(input)
ch := make(chan *DescribeScalingActivitiesOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeScalingActivitiesOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeScalingActivities *aws.Operation

// DescribeScalingProcessTypesRequest generates a request for the DescribeScalingProcessTypes operation.
Expand Down Expand Up @@ -966,6 +1056,21 @@ func (c *AutoScaling) DescribeScheduledActions(input *DescribeScheduledActionsIn
return out, err
}

func (c *AutoScaling) DescribeScheduledActionsPages(input *DescribeScheduledActionsInput) <-chan *DescribeScheduledActionsOutput {
page, _ := c.DescribeScheduledActionsRequest(input)
ch := make(chan *DescribeScheduledActionsOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeScheduledActionsOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeScheduledActions *aws.Operation

// DescribeTagsRequest generates a request for the DescribeTags operation.
Expand Down Expand Up @@ -1013,6 +1118,21 @@ func (c *AutoScaling) DescribeTags(input *DescribeTagsInput) (*DescribeTagsOutpu
return out, err
}

func (c *AutoScaling) DescribeTagsPages(input *DescribeTagsInput) <-chan *DescribeTagsOutput {
page, _ := c.DescribeTagsRequest(input)
ch := make(chan *DescribeTagsOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeTagsOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeTags *aws.Operation

// DescribeTerminationPolicyTypesRequest generates a request for the DescribeTerminationPolicyTypes operation.
Expand Down
79 changes: 77 additions & 2 deletions service/cloudformation/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,21 @@ func (c *CloudFormation) DescribeStackEvents(input *DescribeStackEventsInput) (*
return out, err
}

func (c *CloudFormation) DescribeStackEventsPages(input *DescribeStackEventsInput) <-chan *DescribeStackEventsOutput {
page, _ := c.DescribeStackEventsRequest(input)
ch := make(chan *DescribeStackEventsOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeStackEventsOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeStackEvents *aws.Operation

// DescribeStackResourceRequest generates a request for the DescribeStackResource operation.
Expand Down Expand Up @@ -204,8 +219,8 @@ func (c *CloudFormation) DescribeStackResourcesRequest(input *DescribeStackResou
HTTPMethod: "POST",
HTTPPath: "/",
Paginator: &aws.Paginator{
InputToken: "NextToken",
OutputToken: "NextToken",
InputToken: "",
OutputToken: "",
LimitToken: "",
TruncationToken: "",
},
Expand Down Expand Up @@ -245,6 +260,21 @@ func (c *CloudFormation) DescribeStackResources(input *DescribeStackResourcesInp
return out, err
}

func (c *CloudFormation) DescribeStackResourcesPages(input *DescribeStackResourcesInput) <-chan *DescribeStackResourcesOutput {
page, _ := c.DescribeStackResourcesRequest(input)
ch := make(chan *DescribeStackResourcesOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeStackResourcesOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeStackResources *aws.Operation

// DescribeStacksRequest generates a request for the DescribeStacks operation.
Expand Down Expand Up @@ -284,6 +314,21 @@ func (c *CloudFormation) DescribeStacks(input *DescribeStacksInput) (*DescribeSt
return out, err
}

func (c *CloudFormation) DescribeStacksPages(input *DescribeStacksInput) <-chan *DescribeStacksOutput {
page, _ := c.DescribeStacksRequest(input)
ch := make(chan *DescribeStacksOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*DescribeStacksOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opDescribeStacks *aws.Operation

// EstimateTemplateCostRequest generates a request for the EstimateTemplateCost operation.
Expand Down Expand Up @@ -471,6 +516,21 @@ func (c *CloudFormation) ListStackResources(input *ListStackResourcesInput) (*Li
return out, err
}

func (c *CloudFormation) ListStackResourcesPages(input *ListStackResourcesInput) <-chan *ListStackResourcesOutput {
page, _ := c.ListStackResourcesRequest(input)
ch := make(chan *ListStackResourcesOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*ListStackResourcesOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opListStackResources *aws.Operation

// ListStacksRequest generates a request for the ListStacks operation.
Expand Down Expand Up @@ -513,6 +573,21 @@ func (c *CloudFormation) ListStacks(input *ListStacksInput) (*ListStacksOutput,
return out, err
}

func (c *CloudFormation) ListStacksPages(input *ListStacksInput) <-chan *ListStacksOutput {
page, _ := c.ListStacksRequest(input)
ch := make(chan *ListStacksOutput)
go func() {
for page != nil {
page.Send()
out := page.Data.(*ListStacksOutput)
ch <- out
page = page.NextPage()
}
close(ch)
}()
return ch
}

var opListStacks *aws.Operation

// SetStackPolicyRequest generates a request for the SetStackPolicy operation.
Expand Down
Loading

0 comments on commit 3664ecc

Please sign in to comment.