1package resolvers
2
3import (
4 "fmt"
5 "github.com/cheekybits/genny/generic"
6)
7
8type NodeType generic.Type
9type EdgeType generic.Type
10
11type NodeTypeEdger func(value NodeType, offset int) Edge
12
13func NodeTypePaginate(source []NodeType, edger NodeTypeEdger, input ConnectionInput) ([]EdgeType, PageInfo, error) {
14 var result []EdgeType
15 var pageInfo PageInfo
16
17 offset := 0
18
19 if input.After != nil {
20 for i, value := range source {
21 edge := edger(value, i)
22 if edge.GetCursor() == *input.After {
23 // remove all previous element including the "after" one
24 source = source[i+1:]
25 offset = i + 1
26 break
27 }
28 }
29 }
30
31 if input.Before != nil {
32 for i, value := range source {
33 edge := edger(value, i+offset)
34
35 if edge.GetCursor() == *input.Before {
36 // remove all after element including the "before" one
37 break
38 }
39
40 result = append(result, edge.(EdgeType))
41 }
42 } else {
43 result = make([]EdgeType, len(source))
44
45 for i, value := range source {
46 result[i] = edger(value, i+offset).(EdgeType)
47 }
48 }
49
50 if input.First != nil {
51 if *input.First < 0 {
52 return nil, PageInfo{}, fmt.Errorf("first less than zero")
53 }
54
55 if len(result) > *input.First {
56 // Slice result to be of length first by removing edges from the end
57 result = result[:*input.First]
58 pageInfo.HasNextPage = true
59 }
60 }
61
62 if input.Last != nil {
63 if *input.Last < 0 {
64 return nil, PageInfo{}, fmt.Errorf("last less than zero")
65 }
66
67 if len(result) > *input.Last {
68 // Slice result to be of length last by removing edges from the start
69 result = result[len(result)-*input.Last:]
70 pageInfo.HasPreviousPage = true
71 }
72 }
73
74 return result, pageInfo, nil
75}
76
77// Apply the before/after cursor params to the source and return an array of edges
78//func ApplyCursorToEdges(source []interface{}, edger Edger, input ConnectionInput) []Edge {
79// var result []Edge
80//
81// if input.After != nil {
82// for i, value := range source {
83// edge := edger(value)
84// if edge.Cursor() == *input.After {
85// // remove all previous element including the "after" one
86// source = source[i+1:]
87// break
88// }
89// }
90// }
91//
92// if input.Before != nil {
93// for _, value := range source {
94// edge := edger(value)
95//
96// if edge.Cursor() == *input.Before {
97// // remove all after element including the "before" one
98// break
99// }
100//
101// result = append(result, edge)
102// }
103// } else {
104// result = make([]Edge, len(source))
105//
106// for i, value := range source {
107// result[i] = edger(value)
108// }
109// }
110//
111// return result
112//}
113
114// Apply the first/last cursor params to the edges
115//func EdgesToReturn(edges []Edge, input ConnectionInput) ([]Edge, PageInfo, error) {
116// hasPreviousPage := false
117// hasNextPage := false
118//
119// if input.First != nil {
120// if *input.First < 0 {
121// return nil, nil, fmt.Errorf("first less than zero")
122// }
123//
124// if len(edges) > *input.First {
125// // Slice result to be of length first by removing edges from the end
126// edges = edges[:*input.First]
127// hasNextPage = true
128// }
129// }
130//
131// if input.Last != nil {
132// if *input.Last < 0 {
133// return nil, nil, fmt.Errorf("last less than zero")
134// }
135//
136// if len(edges) > *input.Last {
137// // Slice result to be of length last by removing edges from the start
138// edges = edges[len(edges)-*input.Last:]
139// hasPreviousPage = true
140// }
141// }
142//
143// pageInfo := PageInfo{
144// HasNextPage: hasNextPage,
145// HasPreviousPage: hasPreviousPage,
146// }
147//
148// return edges, pageInfo, nil
149//}
150
151//func EdgesToReturn(allEdges []Edge, before *cursor, after *cursor, first *int, last *int) ([]Edge, error) {
152// result := ApplyCursorToEdges(allEdges, before, after)
153//
154// if first != nil {
155// if *first < 0 {
156// return nil, fmt.Errorf("first less than zero")
157// }
158//
159// if len(result) > *first {
160// // Slice result to be of length first by removing edges from the end
161// result = result[:*first]
162// }
163// }
164//
165// if last != nil {
166// if *last < 0 {
167// return nil, fmt.Errorf("last less than zero")
168// }
169//
170// if len(result) > *last {
171// // Slice result to be of length last by removing edges from the start
172// result = result[len(result)-*last:]
173// }
174// }
175//
176// return result, nil
177//}
178
179//func ApplyCursorToEdges(allEdges []Edge, before *cursor, after *cursor) []Edge {
180// result := allEdges
181//
182// if after != nil {
183// for i, edge := range result {
184// if edge.Cursor() == *after {
185// // remove all previous element including the "after" one
186// result = result[i+1:]
187// break
188// }
189// }
190// }
191//
192// if before != nil {
193// for i, edge := range result {
194// if edge.Cursor() == *before {
195// // remove all after element including the "before" one
196// result = result[:i]
197// }
198// }
199// }
200//
201// return result
202//}
203
204//func HasPreviousPage(allEdges []Edge, before *cursor, after *cursor, last *int) bool {
205// if last != nil {
206// edges := ApplyCursorToEdges(allEdges, before, after)
207// return len(edges) > *last
208// }
209//
210// // TODO: handle "after", but according to the spec it's ok to return false
211//
212// return false
213//}
214//
215//func HasNextPage(allEdges []Edge, before *cursor, after *cursor, first *int) bool {
216// if first != nil {
217// edges := ApplyCursorToEdges(allEdges, before, after)
218// return len(edges) > *first
219// }
220//
221// // TODO: handle "before", but according to the spec it's ok to return false
222//
223// return false
224//}