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}