From 573ce1982da2e754947453fdaf0d50204873acb4 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Sat, 25 Apr 2020 17:00:57 +0200 Subject: Larger restructuring --- internal/feed/state.go | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 internal/feed/state.go (limited to 'internal/feed/state.go') 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 +} -- cgit v1.2.3-70-g09d2