GitRoot

Craft your forge, Build your project, Grow your community freely
 1// SPDX-FileCopyrightText: 2026 Romain Maneschi <romain@gitroot.dev>
 2//
 3// SPDX-License-Identifier: EUPL-1.2
 4
 5package iterator
 6
 7import (
 8	"errors"
 9
10	"gitroot.dev/libs/golang/plugin/model"
11	plugin "gitroot.dev/libs/golang/plugin/model"
12	"gitroot.dev/server/logger"
13)
14
15type Manager struct {
16	logger    logger.Logger
17	iterators map[string]*pullIterator
18}
19
20func NewManager() *Manager {
21	return &Manager{
22		logger:    *logger.NewLogger(logger.ITERATOR),
23		iterators: map[string]*pullIterator{},
24	}
25}
26
27func (m *Manager) Add(name string, slice []any) *pullIterator {
28	m.iterators[name] = NewPullIterator(slice)
29	return m.iterators[name]
30}
31
32// TODO: WTH!? go refuse a []model.Report as a []any
33func (m *Manager) AddReports(name string, slice []model.Report) *pullIterator {
34	sliceAny := make([]any, len(slice))
35	for i, s := range slice {
36		sliceAny[i] = s
37	}
38	m.iterators[name] = NewPullIterator(sliceAny)
39	return m.iterators[name]
40}
41
42func (m *Manager) Next(name string) plugin.IteratorItem {
43	if it, ok := m.iterators[name]; ok {
44		item, ok := it.Next()
45		return plugin.IteratorItem{Item: item, Exist: ok}
46	}
47	m.logger.Error("can't next", errors.New("iterator don't found"), logger.NewLoggerPair("name", name))
48	return plugin.IteratorItem{Item: "", Exist: false}
49}
50
51func (m *Manager) Reset(name string) {
52	if it, ok := m.iterators[name]; ok {
53		it.Reset()
54		return
55	}
56	m.logger.Error("can't reset", errors.New("iterator don't found"), logger.NewLoggerPair("name", name))
57}
58
59func (m *Manager) DeleteReports(name string) {
60	delete(m.iterators, name)
61}