diff options
Diffstat (limited to '')
-rw-r--r-- | internal/feed/state.go | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/internal/feed/state.go b/internal/feed/state.go new file mode 100644 index 0000000..9a6f836 --- /dev/null +++ b/internal/feed/state.go @@ -0,0 +1,76 @@ +package feed + +import ( + "sync" + + "github.com/Necoro/feed2imap-go/pkg/config" +) + +type State struct { + feeds map[string]*Feed + cache Cache + cfg *config.Config +} + +func (state *State) Foreach(f func(*Feed)) { + for _, feed := range state.feeds { + f(feed) + } +} + +func (state *State) ForeachGo(goFunc func(*Feed, *sync.WaitGroup)) { + var wg sync.WaitGroup + wg.Add(len(state.feeds)) + + for _, feed := range state.feeds { + go goFunc(feed, &wg) + } + wg.Wait() +} + +func (state *State) LoadCache(fileName string) error { + cache, err := loadCache(fileName) + if err != nil { + return err + } + state.cache = cache + + for _, feed := range state.feeds { + feed.cached = cache.findItem(feed) + } + return nil +} + +func (state *State) StoreCache(fileName string) error { + return storeCache(state.cache, fileName) +} + +func (state *State) Fetch() int { + state.ForeachGo(handleFeed) + + ctr := 0 + for _, feed := range state.feeds { + success := feed.Success() + feed.cached.Checked(!success) + + if success { + ctr++ + } + } + + return ctr +} + +func NewState(cfg *config.Config) *State { + state := State{ + feeds: map[string]*Feed{}, + cache: nil, // loaded later on + cfg: cfg, + } + + for name, parsedFeed := range cfg.Feeds { + state.feeds[name] = &Feed{Feed: parsedFeed} + } + + return &state +} |