{-# LANGUAGE DeriveAnyClass #-}
module Follow.Fetchers.Feed.Internal
( feedToEntries
, parseFeed
, FeedError(..)
) where
import Control.Monad.Catch (Exception, MonadThrow, throwM)
import qualified Data.ByteString.Lazy as BL (ByteString)
import Data.Time (UTCTime)
import Data.Time.Follow (parseTimeGuess)
import Follow.Types (Entry (..))
import Text.Feed.Import as F (parseFeedSource)
import Text.Feed.Query as F (feedItems, getItemAuthor,
getItemDescription, getItemId,
getItemLink,
getItemPublishDateString,
getItemTitle)
import Text.Feed.Types as F (Feed, Item)
data FeedError =
FeedWrongFormat
deriving (Show, Eq, Exception)
parseFeed :: MonadThrow m => BL.ByteString -> m F.Feed
parseFeed body = maybe (throwM FeedWrongFormat) return (F.parseFeedSource body)
feedToEntries :: F.Feed -> [Entry]
feedToEntries feed = itemToEntry <$> F.feedItems feed
where
itemToEntry :: F.Item -> Entry
itemToEntry item =
Entry
(F.getItemLink item)
(snd <$> F.getItemId item)
(F.getItemTitle item)
(F.getItemDescription item)
(F.getItemAuthor item)
(parseTimeGuess =<< F.getItemPublishDateString item)