Skip to content

Pagination ​

Example showing how to walk paginated results using the Tokens helper.

go
package main

import (
	"context"
	"fmt"
	"log"

	blogger "github.com/itokun99/blogger-go"
	"github.com/itokun99/blogger-go/gen/services"
)

func main() {
	ctx := context.Background()
	client := blogger.NewRawClient(nil)

	blogId := "1234567890"

	// Walk all pages (up to 100)
	allPosts, err := blogger.Tokens(100, func(token blogger.Token) (*blogger.PaginationResult, error) {
		opts := []services.PostOption{}
		if !token.IsZero() {
			opts = append(opts, services.WithPageToken(token.String()))
		}
		opts = append(opts, services.WithMaxResults(10))

		result, err := client.Posts().List(ctx, blogId, opts...)
		if err != nil {
			return nil, err
		}
		return blogger.ParsePaginationResult(result), nil
	})
	if err != nil {
		log.Fatal(err)
	}

	total := 0
	for _, page := range allPosts {
		var items []map[string]string
		if err := page.Decode(&items); err != nil {
			log.Fatal(err)
		}
		fmt.Printf("Page: %d items, total: %d\n", len(items), page.TotalItems)
		total += len(items)
	}
	fmt.Printf("Total posts: %d\n", total)
}

Manual Pagination ​

For more control, paginate manually:

go
var allItems []MyType
token := blogger.Token("")

for {
	result, err := client.Posts().List(ctx, blogId,
		services.WithMaxResults(10),
	)
	if err != nil {
		log.Fatal(err)
	}

	var items []MyType
	if err := blogger.ParsePaginationResult(result).Decode(&items); err != nil {
		log.Fatal(err)
	}
	allItems = append(allItems, items...)

	next := blogger.NewPageToken(result.NextPageToken)
	if next.IsZero() {
		break
	}
	token = next
}

Parsing Raw Response ​

go
payload, _ := httpClient.Get("/v3/blogs/..." + ...)
result, err := blogger.ParsePaginationResult(payload)
if err != nil {
    log.Fatal(err)
}

var posts []*schemas.Post
err = result.Decode(&posts)