pagers_template.go

  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//}