blob: 30b3f5cb2b9a40380a0efc88028d838c2ae830f7 [file] [log] [blame]
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package iterator_test
import (
"bytes"
"fmt"
"html/template"
"log"
"net/http"
"golang.org/x/net/context"
"google.golang.org/api/iterator"
)
var (
client *Client
ctx = context.Background()
)
var pageTemplate = template.Must(template.New("").Parse(`
<table>
{{range .Entries}}
<tr><td>{{.}}</td></tr>
{{end}}
</table>
{{with .Next}}
<a href="/entries?pageToken={{.}}">Next Page</a>
{{end}}
`))
// This example demonstrates how to use Pager to support
// pagination on a web site.
func Example_webHandler(w http.ResponseWriter, r *http.Request) {
const pageSize = 25
it := client.Items(ctx)
var items []int
pageToken, err := iterator.NewPager(it, pageSize, r.URL.Query().Get("pageToken")).NextPage(&items)
if err != nil {
http.Error(w, fmt.Sprintf("getting next page: %v", err), http.StatusInternalServerError)
}
data := struct {
Items []int
Next string
}{
items,
pageToken,
}
var buf bytes.Buffer
if err := pageTemplate.Execute(&buf, data); err != nil {
http.Error(w, fmt.Sprintf("executing page template: %v", err), http.StatusInternalServerError)
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
if _, err := buf.WriteTo(w); err != nil {
log.Printf("writing response: %v", err)
}
}
// This example demonstrates how to use a Pager to page through an iterator in a loop.
func Example_pageLoop() {
const pageSize = 25
ctx := context.Background()
p := iterator.NewPager(client.Items(ctx), pageSize, "" /* start from the beginning */)
for {
var items []int
pageToken, err := p.NextPage(&items)
if err != nil {
// TODO: handle error.
}
fmt.Println(items)
if pageToken == "" {
break
}
}
}
// This example demonstrates how to get exactly the items in the buffer, without
// triggering an extra RPC.
func Example_serverPages() {
it := client.Items(ctx)
var items []int
for {
item, err := it.Next()
if err != nil && err != iterator.Done {
log.Fatal(err)
}
if err == iterator.Done {
break
}
items = append(items, item)
if it.PageInfo().Remaining() == 0 {
break
}
}
fmt.Println(items)
}