package iterator import ( "context" "github.com/xanzy/go-gitlab" ) type noteIterator struct { issue int page int lastPage bool index int cache []*gitlab.Note } func newNoteIterator() *noteIterator { in := ¬eIterator{} in.Reset(-1) return in } func (in *noteIterator) Next(ctx context.Context, conf config) (bool, error) { // first query if in.cache == nil { return in.getNext(ctx, conf) } // move cursor index if in.index < len(in.cache)-1 { in.index++ return true, nil } return in.getNext(ctx, conf) } func (in *noteIterator) Value() *gitlab.Note { return in.cache[in.index] } func (in *noteIterator) getNext(ctx context.Context, conf config) (bool, error) { if in.lastPage { return false, nil } ctx, cancel := context.WithTimeout(ctx, conf.timeout) defer cancel() notes, resp, err := conf.gc.Notes.ListIssueNotes( conf.project, in.issue, &gitlab.ListIssueNotesOptions{ ListOptions: gitlab.ListOptions{ Page: in.page, PerPage: conf.capacity, }, Sort: gitlab.String("asc"), OrderBy: gitlab.String("created_at"), }, gitlab.WithContext(ctx), ) if err != nil { in.Reset(-1) return false, err } if resp.TotalPages == in.page { in.lastPage = true } if len(notes) == 0 { return false, nil } in.cache = notes in.index = 0 in.page++ return true, nil } func (in *noteIterator) Reset(issue int) { in.issue = issue in.index = -1 in.page = 1 in.lastPage = false in.cache = nil }