@@ -2,6 +2,8 @@ module Data.Schematic.Validation where
3import Control.Monad
3import Control.Monad
4import Control.Monad.Validation
4import Control.Monad.Validation
6+import Data.Aeson.Types
5import Data.Foldable
7import Data.Foldable
6import Data.Functor.Identity
8import Data.Functor.Identity
7import Data.Monoid
9import Data.Monoid
@@ -30,6 +32,10 @@ data ParseResult a
30 | ValidationError ErrorMap -- runtime
32 | ValidationError ErrorMap -- runtime
31 deriving (Show, Eq, Functor, Foldable, Traversable)
33 deriving (Show, Eq, Functor, Foldable, Traversable)
35+instance (TopLevel a, SingI a, FromJSON (JsonRepr a))
36+ => FromJSON (ParseResult (JsonRepr a)) where
37+ parseJSON = pure . parseAndValidateJson @a
33isValid :: ParseResult a -> Bool
39isValid :: ParseResult a -> Bool
34isValid (Valid _) = True
40isValid (Valid _) = True
35isValid _ = False
41isValid _ = False
@@ -246,3 +252,26 @@ toUnion _ = ReprUnion . urelax
247umatch' :: UElem a as i => Sing a -> Union f as -> Maybe (f a)
253umatch' :: UElem a as i => Sing a -> Union f as -> Maybe (f a)
248umatch' _ u = umatch u
254umatch' _ u = umatch u
258+ . (FromJSON (JsonRepr schema), TopLevel schema, SingI schema)
260+ -> ParseResult (JsonRepr schema)
261+parseAndValidateJson v =
262+ case parseEither parseJSON v of
263+ Left s -> DecodingError $ T.pack s
266+ validate = validateJsonRepr (sing :: Sing schema) [] jsonRepr
267+ res = runIdentity . runValidationTEither $ validate
269+ Left em -> ValidationError em
270+ Right () -> Valid jsonRepr
272+parseAndValidateJsonBy
273+ :: (FromJSON (JsonRepr schema), TopLevel schema, SingI schema)
276+ -> ParseResult (JsonRepr schema)
277+parseAndValidateJsonBy _ = parseAndValidateJson