pager_operation.go

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