schematic-0.1.1.0: src/Data/Schematic.hs
module Data.Schematic
( module Data.Schematic.Schema
, module Data.Schematic.Utils
, decodeAndValidateJson
, parseAndValidateJson
, isValid
, isDecodingError
, isValidationError
, ParseResult(..)
) where
import Control.Monad.Validation
import Data.Aeson as J
import Data.Aeson.Types as J
import Data.ByteString.Lazy as BL
import Data.Functor.Identity
import Data.Schematic.Schema
import Data.Schematic.Utils
import Data.Schematic.Validation
import Data.Text as T
parseAndValidateJson
:: forall schema
. (J.FromJSON (JsonRepr schema), TopLevel schema, Known (Sing schema))
=> J.Value
-> ParseResult (JsonRepr schema)
parseAndValidateJson v =
case parseEither parseJSON v of
Left s -> DecodingError $ T.pack s
Right jsonRepr ->
let
validate = validateJsonRepr (known :: Sing schema) [] jsonRepr
res = runIdentity . runValidationTEither $ validate
in case res of
Left em -> ValidationError em
Right () -> Valid jsonRepr
decodeAndValidateJson
:: forall schema
. (J.FromJSON (JsonRepr schema), TopLevel schema, Known (Sing schema))
=> BL.ByteString
-> ParseResult (JsonRepr schema)
decodeAndValidateJson bs = case decode bs of
Nothing -> DecodingError "invalid json"
Just x -> parseAndValidateJson x