1// This file was automatically generated by genny.
2// Any changes will be lost if this file is regenerated.
3// see https://github.com/cheekybits/genny
4
5package connections
6
7import (
8 "fmt"
9
10 "github.com/git-bug/git-bug/api/graphql/models"
11)
12
13// IdentityEdgeMaker define a function that take a models.IdentityWrapper and an offset and
14// create an Edge.
15type IdentityEdgeMaker func(value models.IdentityWrapper, offset int) Edge
16
17// IdentityConMaker define a function that create a models.IdentityConnection
18type IdentityConMaker func(
19 edges []*models.IdentityEdge,
20 nodes []models.IdentityWrapper,
21 info *models.PageInfo,
22 totalCount int) (*models.IdentityConnection, error)
23
24// IdentityCon will paginate a source according to the input of a relay connection
25func IdentityCon(source []models.IdentityWrapper, edgeMaker IdentityEdgeMaker, conMaker IdentityConMaker, input models.ConnectionInput) (*models.IdentityConnection, error) {
26 var nodes []models.IdentityWrapper
27 var edges []*models.IdentityEdge
28 var cursors []string
29 var pageInfo = &models.PageInfo{}
30 var totalCount = len(source)
31
32 emptyCon, _ := conMaker(edges, nodes, pageInfo, 0)
33
34 offset := 0
35
36 if input.After != nil {
37 for i, value := range source {
38 edge := edgeMaker(value, i)
39 if edge.GetCursor() == *input.After {
40 // remove all previous element including the "after" one
41 source = source[i+1:]
42 offset = i + 1
43 pageInfo.HasPreviousPage = true
44 break
45 }
46 }
47 }
48
49 if input.Before != nil {
50 for i, value := range source {
51 edge := edgeMaker(value, i+offset)
52
53 if edge.GetCursor() == *input.Before {
54 // remove all after element including the "before" one
55 pageInfo.HasNextPage = true
56 break
57 }
58
59 e := edge.(models.IdentityEdge)
60 edges = append(edges, &e)
61 cursors = append(cursors, edge.GetCursor())
62 nodes = append(nodes, value)
63 }
64 } else {
65 edges = make([]*models.IdentityEdge, len(source))
66 cursors = make([]string, len(source))
67 nodes = source
68
69 for i, value := range source {
70 edge := edgeMaker(value, i+offset)
71 e := edge.(models.IdentityEdge)
72 edges[i] = &e
73 cursors[i] = edge.GetCursor()
74 }
75 }
76
77 if input.First != nil {
78 if *input.First < 0 {
79 return emptyCon, fmt.Errorf("first less than zero")
80 }
81
82 if len(edges) > *input.First {
83 // Slice result to be of length first by removing edges from the end
84 edges = edges[:*input.First]
85 cursors = cursors[:*input.First]
86 nodes = nodes[:*input.First]
87 pageInfo.HasNextPage = true
88 }
89 }
90
91 if input.Last != nil {
92 if *input.Last < 0 {
93 return emptyCon, fmt.Errorf("last less than zero")
94 }
95
96 if len(edges) > *input.Last {
97 // Slice result to be of length last by removing edges from the start
98 edges = edges[len(edges)-*input.Last:]
99 cursors = cursors[len(cursors)-*input.Last:]
100 nodes = nodes[len(nodes)-*input.Last:]
101 pageInfo.HasPreviousPage = true
102 }
103 }
104
105 // Fill up pageInfo cursors
106 if len(cursors) > 0 {
107 pageInfo.StartCursor = cursors[0]
108 pageInfo.EndCursor = cursors[len(cursors)-1]
109 }
110
111 return conMaker(edges, nodes, pageInfo, totalCount)
112}