aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/parse/parse.go49
-rw-r--r--internal/util/util.go17
2 files changed, 66 insertions, 0 deletions
diff --git a/internal/parse/parse.go b/internal/parse/parse.go
new file mode 100644
index 0000000..a4112d9
--- /dev/null
+++ b/internal/parse/parse.go
@@ -0,0 +1,49 @@
+package parse
+
+import (
+ ctxt "context"
+ "fmt"
+ "log"
+ "sync"
+ "time"
+
+ "github.com/mmcdole/gofeed"
+
+ "github.com/Necoro/feed2imap-go/internal/config"
+ "github.com/Necoro/feed2imap-go/internal/util"
+)
+
+func context() (ctxt.Context, ctxt.CancelFunc) {
+ return ctxt.WithTimeout(ctxt.Background(), 60*time.Second)
+}
+
+func parseFeed(feed *config.Feed) error {
+ ctx, cancel := context()
+ defer cancel()
+ fp := gofeed.NewParser()
+ if _, err := fp.ParseURLWithContext(feed.Url, ctx); err != nil {
+ return fmt.Errorf("while fetching %s from %s: %w", feed.Name, feed.Url, err)
+ }
+
+ return nil
+}
+
+func handleFeed(feed *config.Feed, wg *sync.WaitGroup) {
+ defer wg.Done()
+ log.Printf("Fetching %s from %s", feed.Name, feed.Url)
+
+ if err := parseFeed(feed); err != nil {
+ util.Error(err)
+ }
+}
+
+func Parse(feeds config.Feeds) {
+ var wg sync.WaitGroup
+ wg.Add(len(feeds))
+
+ for _, feed := range feeds {
+ go handleFeed(feed, &wg)
+ }
+
+ wg.Wait()
+}
diff --git a/internal/util/util.go b/internal/util/util.go
new file mode 100644
index 0000000..54a0805
--- /dev/null
+++ b/internal/util/util.go
@@ -0,0 +1,17 @@
+package util
+
+import (
+ "log"
+ "os"
+)
+
+var errorLogger = log.New(os.Stderr, "ERROR ", log.LstdFlags|log.Lmsgprefix)
+
+func Error(v ...interface{}) {
+ errorLogger.Print(v...)
+}
+
+//noinspection GoUnusedExportedFunction
+func Errorf(format string, a ...interface{}) {
+ errorLogger.Printf(format, a...)
+}