packages feed

taskwarrior-0.3.1.0: src/Taskwarrior/RecurringChild.hs

{- | 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