imm-1.6.0.0: src/lib/Imm/Callback.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Imm.Callback where
-- {{{ Imports
import Imm.Feed
import Data.Aeson
import Data.Aeson.Types
import Data.Text.Prettyprint.Doc
import Dhall
-- }}}
-- | External program run for each feed element.
--
-- A `Message` is passed to this program through stdin, serialized in JSON.
data Callback = Callback
{ _executable :: FilePath
, _arguments :: [Text]
} deriving (Eq, Generic, Ord, Read, Show)
instance Interpret Callback
instance Pretty Callback where
pretty (Callback executable arguments) = pretty executable <+> sep (pretty <$> arguments)
-- | All information passed to external programs about a new feed item, are stored in this structure.
data Message = Message Feed FeedElement deriving(Eq, Generic, Ord, Show)
instance ToJSON Message where
toJSON (Message feed element) = object ["feed" .= renderFeed feed, "element" .= renderFeedElement element]
instance FromJSON Message where
parseJSON = withObject "Message" $ \v -> Message
<$> (v .: "feed" >>= (liftEither . parseFeed))
<*> (v .: "element" >>= (liftEither . parseFeedElement))
where liftEither :: Either e a -> Parser a
liftEither = either (const mempty) return