func findEndCursor()

in commands/api/pagination.go [25:88]


func findEndCursor(r io.Reader) string {
	dec := json.NewDecoder(r)

	var idx int
	var stack []json.Delim
	var lastKey string
	var contextKey string

	var endCursor string
	var hasNextPage bool
	var foundEndCursor bool
	var foundNextPage bool
	var isKey bool

loop:
	for {
		t, err := dec.Token()
		if errors.Is(err, io.EOF) {
			break
		}
		if err != nil {
			return ""
		}
		isKey = len(stack) > 0 && stack[len(stack)-1] == '{' && idx%2 == 0
		switch tt := t.(type) {
		case json.Delim:
			switch tt {
			case '{', '[':
				stack = append(stack, tt)
				contextKey = lastKey
				idx = 0
			case '}', ']':
				stack = stack[:len(stack)-1]
				contextKey = ""
				idx = 0
			}
		case string:
			if isKey {
				lastKey = tt
			} else if contextKey == "pageInfo" && lastKey == "endCursor" {
				endCursor = tt
				foundEndCursor = true
				if foundNextPage {
					break loop
				}
			}
			idx++
		case bool:
			if contextKey == "pageInfo" && lastKey == "hasNextPage" {
				hasNextPage = tt
				foundNextPage = true
				if foundEndCursor {
					break loop
				}
			}
			idx++
		}
	}

	if hasNextPage {
		return endCursor
	}
	return ""
}