...
1 package pagination
2
3 import (
4 "fmt"
5 )
6
7
8 type PageToken struct {
9
10 Offset int64
11
12 RequestChecksum uint32
13 }
14
15
16
17
18 const pageTokenChecksumMask uint32 = 0x9acb0442
19
20
21
22
23 func ParsePageToken(request Request) (_ PageToken, err error) {
24 defer func() {
25 if err != nil {
26 err = fmt.Errorf("parse offset page token: %w", err)
27 }
28 }()
29 requestChecksum, err := calculateRequestChecksum(request)
30 if err != nil {
31 return PageToken{}, err
32 }
33 requestChecksum ^= pageTokenChecksumMask
34 if request.GetPageToken() == "" {
35 offset := int64(0)
36 if s, ok := request.(skipRequest); ok {
37 offset += int64(s.GetSkip())
38 }
39 return PageToken{
40 Offset: offset,
41 RequestChecksum: requestChecksum,
42 }, nil
43 }
44 var pageToken PageToken
45 if err := DecodePageTokenStruct(request.GetPageToken(), &pageToken); err != nil {
46 return PageToken{}, err
47 }
48 if pageToken.RequestChecksum != requestChecksum {
49 return PageToken{}, fmt.Errorf(
50 "checksum mismatch (got 0x%x but expected 0x%x)", pageToken.RequestChecksum, requestChecksum,
51 )
52 }
53 if s, ok := request.(skipRequest); ok {
54 pageToken.Offset += int64(s.GetSkip())
55 }
56 return pageToken, nil
57 }
58
59
60 func (p PageToken) Next(request Request) PageToken {
61 p.Offset += int64(request.GetPageSize())
62 return p
63 }
64
65
66 func (p PageToken) String() string {
67 return EncodePageTokenStruct(&p)
68 }
69
View as plain text