...
1 package pagination
2
3 import (
4 "fmt"
5 "hash/crc32"
6
7 "google.golang.org/protobuf/proto"
8 )
9
10
11
12
13 type Request interface {
14 proto.Message
15
16 GetPageToken() string
17
18 GetPageSize() int32
19 }
20
21 type skipRequest interface {
22 proto.Message
23
24
25 GetSkip() int32
26 }
27
28
29 func calculateRequestChecksum(request Request) (uint32, error) {
30
31 clonedRequest := proto.Clone(request)
32 r := clonedRequest.ProtoReflect()
33 r.Clear(r.Descriptor().Fields().ByName("page_token"))
34 r.Clear(r.Descriptor().Fields().ByName("page_size"))
35 if _, ok := request.(skipRequest); ok {
36 r.Clear(r.Descriptor().Fields().ByName("skip"))
37 }
38 data, err := proto.Marshal(clonedRequest)
39 if err != nil {
40 return 0, fmt.Errorf("calculate request checksum: %w", err)
41 }
42 return crc32.ChecksumIEEE(data), nil
43 }
44
View as plain text