{- |
Module : Composite.Aeson.Throw
License : MIT
Stability : experimental
MonadThrow behaviour for composite-aeson.
-}
module Composite.Aeson.Throw (
CompositeAesonParseException
, parseValue'
) where
import Composite.Aeson
import Control.Monad.Catch
import Data.Aeson
import Data.Aeson.BetterErrors
import Data.Typeable
-- | Simple exception type for composite-aeson.
newtype CompositeAesonParseException a = CompositeAesonParseException a
deriving (Eq, Show, Ord)
instance (Typeable a, Show a) => Exception (CompositeAesonParseException a)
-- | Parse a value according to the provided `JsonFormat` and throw to `MonadThrow` on exception.
parseValue' :: (Typeable e, Show e, MonadThrow m) => JsonFormat e x -> Value -> m x
parseValue' f v = do
let a = parseValue (fromJsonWithFormat f) v
either (throwM . CompositeAesonParseException) return a