Use multierr

This commit is contained in:
sentriz
2021-02-03 20:26:24 +00:00
committed by Senan Kelly
parent da48668a8d
commit 30958cd1fa
2 changed files with 35 additions and 8 deletions

24
multierr/multierr.go Normal file
View File

@@ -0,0 +1,24 @@
package multierr
import (
"strings"
)
type Err []error
func (me Err) Error() string {
var s strings.Builder
for _, err := range me {
s.WriteString("\n")
s.WriteString(err.Error())
}
return s.String()
}
func (me Err) Len() int {
return len(me)
}
func (me *Err) Add(err error) {
*me = append(*me, err)
}

View File

@@ -18,6 +18,7 @@ import (
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
"github.com/mmcdole/gofeed" "github.com/mmcdole/gofeed"
"go.senan.xyz/gonic/multierr"
"go.senan.xyz/gonic/server/db" "go.senan.xyz/gonic/server/db"
"go.senan.xyz/gonic/server/scanner/tags" "go.senan.xyz/gonic/server/scanner/tags"
) )
@@ -196,8 +197,9 @@ func (p *Podcasts) RefreshPodcasts() error {
if err := p.DB.Find(&podcasts).Error; err != nil { if err := p.DB.Find(&podcasts).Error; err != nil {
return fmt.Errorf("find podcasts: %w", err) return fmt.Errorf("find podcasts: %w", err)
} }
if errs := p.refreshPodcasts(podcasts); len(errs) > 0 { var errs *multierr.Err
return fmt.Errorf("refresh podcasts: %v", errs) if errors.As(p.refreshPodcasts(podcasts), &errs) && errs.Len() > 0 {
return fmt.Errorf("refresh podcasts: %w", errs)
} }
return nil return nil
} }
@@ -211,23 +213,24 @@ func (p *Podcasts) RefreshPodcastsForUser(userID int) error {
if err != nil { if err != nil {
return fmt.Errorf("find podcasts: %w", err) return fmt.Errorf("find podcasts: %w", err)
} }
if errs := p.refreshPodcasts(podcasts); len(errs) > 0 { var errs *multierr.Err
return fmt.Errorf("refresh podcasts: %v", errs) if errors.As(p.refreshPodcasts(podcasts), &errs) && errs.Len() > 0 {
return fmt.Errorf("refresh podcasts: %w", errs)
} }
return nil return nil
} }
func (p *Podcasts) refreshPodcasts(podcasts []*db.Podcast) []error { func (p *Podcasts) refreshPodcasts(podcasts []*db.Podcast) error {
var errs []error var errs multierr.Err
for _, podcast := range podcasts { for _, podcast := range podcasts {
fp := gofeed.NewParser() fp := gofeed.NewParser()
feed, err := fp.ParseURL(podcast.URL) feed, err := fp.ParseURL(podcast.URL)
if err != nil { if err != nil {
errs = append(errs, fmt.Errorf("refreshing podcast with url %q: %w", podcast.URL, err)) errs.Add(fmt.Errorf("refreshing podcast with url %q: %w", podcast.URL, err))
continue continue
} }
if err = p.AddNewEpisodes(podcast.ID, feed.Items); err != nil { if err = p.AddNewEpisodes(podcast.ID, feed.Items); err != nil {
errs = append(errs, fmt.Errorf("adding episodes: %w", err)) errs.Add(fmt.Errorf("adding episodes: %w", err))
continue continue
} }
} }