...

Source file src/go.einride.tech/aip/pagination/pagetoken.go

Documentation: go.einride.tech/aip/pagination

     1  package pagination
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // PageToken is a page token that uses an offset to delineate which page to fetch.
     8  type PageToken struct {
     9  	// Offset of the page.
    10  	Offset int64
    11  	// RequestChecksum is the checksum of the request that generated the page token.
    12  	RequestChecksum uint32
    13  }
    14  
    15  // pageTokenChecksumMask is a random bitmask applied to offset-based page token checksums.
    16  //
    17  // Change the bitmask to force checksum failures when changing the page token implementation.
    18  const pageTokenChecksumMask uint32 = 0x9acb0442
    19  
    20  // ParsePageToken parses an offset-based page token from the provided Request.
    21  //
    22  // If the request does not have a page token, a page token with offset 0 will be returned.
    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 // apply checksum mask for PageToken
    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  // Next returns the next page token for the provided Request.
    60  func (p PageToken) Next(request Request) PageToken {
    61  	p.Offset += int64(request.GetPageSize())
    62  	return p
    63  }
    64  
    65  // String returns a string representation of the page token.
    66  func (p PageToken) String() string {
    67  	return EncodePageTokenStruct(&p)
    68  }
    69  

View as plain text