issue.go

 1package iterator
 2
 3import (
 4	"context"
 5
 6	"github.com/xanzy/go-gitlab"
 7)
 8
 9type issueIterator struct {
10	page  int
11	index int
12	cache []*gitlab.Issue
13}
14
15func newIssueIterator() *issueIterator {
16	ii := &issueIterator{}
17	ii.Reset()
18	return ii
19}
20
21func (ii *issueIterator) Next(ctx context.Context, conf config) (bool, error) {
22	// first query
23	if ii.cache == nil {
24		return ii.getNext(ctx, conf)
25	}
26
27	// move cursor index
28	if ii.index < len(ii.cache)-1 {
29		ii.index++
30		return true, nil
31	}
32
33	return ii.getNext(ctx, conf)
34}
35
36func (ii *issueIterator) Value() *gitlab.Issue {
37	return ii.cache[ii.index]
38}
39
40func (ii *issueIterator) getNext(ctx context.Context, conf config) (bool, error) {
41	ctx, cancel := context.WithTimeout(ctx, conf.timeout)
42	defer cancel()
43
44	issues, _, err := conf.gc.Issues.ListProjectIssues(
45		conf.project,
46		&gitlab.ListProjectIssuesOptions{
47			ListOptions: gitlab.ListOptions{
48				Page:    ii.page,
49				PerPage: conf.capacity,
50			},
51			Scope:        gitlab.String("all"),
52			UpdatedAfter: &conf.since,
53			Sort:         gitlab.String("asc"),
54		},
55		gitlab.WithContext(ctx),
56	)
57
58	if err != nil {
59		ii.Reset()
60		return false, err
61	}
62
63	// if repository doesn't have any issues
64	if len(issues) == 0 {
65		return false, nil
66	}
67
68	ii.cache = issues
69	ii.index = 0
70	ii.page++
71
72	return true, nil
73}
74
75func (ii *issueIterator) Reset() {
76	ii.index = -1
77	ii.page = -1
78	ii.cache = nil
79}