{- | This Module provides the RecurringChild type with FromJSON and ToJSON instances. -} module Taskwarrior.RecurringChild ( RecurringChild (..), parseFromObjectMay, toPairs, ) where import Control.Applicative (optional) import Data.Aeson ( FromJSON, Object, ToJSON, object, pairs, withObject, (.:), (.=), ) import qualified Data.Aeson as Aeson import Data.Aeson.Types ( Pair, Parser, ) import Data.Text (Text) import Data.UUID (UUID) {- | The 'RecurringChild' type saves information about how a 'Taskwarrior.Task.Task' is child of another 'Taskwarrior.Task.Task' wich is recurring. -} data RecurringChild = RecurringChild { recur :: Text , imask :: Integer , parent :: UUID } deriving (Eq, Show, Read, Ord) -- | Gathers all fields for a 'RecurringChild' status. parseFromObjectMay :: Object -> Parser (Maybe RecurringChild) parseFromObjectMay = optional . parseFromObject parseFromObject :: Object -> Parser RecurringChild parseFromObject o = RecurringChild <$> o .: "recur" <*> o .: "imask" <*> o .: "parent" -- | Can be used to serialize 'RecurringChild' to JSON. toPairs :: RecurringChild -> [Pair] toPairs RecurringChild{..} = ["recur" .= recur, "imask" .= imask, "parent" .= parent] instance FromJSON RecurringChild where parseJSON = withObject "RecurringChild" parseFromObject instance ToJSON RecurringChild where toJSON = object . toPairs toEncoding = pairs . mconcat . map (uncurry (.=)) . toPairs