module Data.JsonSchema.Core where
import qualified Data.HashMap.Strict as H
import Data.Maybe
import Data.JsonSchema.Reference
import Import
import Prelude hiding (concat, sequence)
compile :: forall err. Spec err -> SchemaGraph -> RawSchema -> Schema err
compile spec g (RawSchema t o) =
let maybeValidators = H.intersectionWith f (_unSpec spec) o
in Schema . catMaybes . H.elems $ maybeValidators
where
f :: ValSpec err -> Value -> Maybe (Value -> [ValidationFailure err])
f (ValSpec _ construct) valJSON = construct spec g (RawSchema (newResolutionScope t o) o) valJSON
validate :: Schema err -> Value -> [ValidationFailure err]
validate schema x = concat . fmap ($ x) . _unSchema $ schema
newtype Spec err = Spec { _unSpec :: HashMap Text (ValSpec err) }
newtype Schema err = Schema { _unSchema :: [Value -> [ValidationFailure err]] }
data RawSchema = RawSchema
{ _rsURI :: !(Maybe Text)
, _rsData :: !(HashMap Text Value)
} deriving (Show)
type SchemaCache = HashMap Text (HashMap Text Value)
data SchemaGraph = SchemaGraph
{ _startingSchema :: !RawSchema
, _cachedSchemas :: !SchemaCache
} deriving (Show)
data ValSpec err = ValSpec EmbeddedSchemas (ValidatorConstructor err [ValidationFailure err])
type EmbeddedSchemas = Maybe Text -> Value -> [RawSchema]
type ValidatorConstructor schemaErr valErr
= Spec schemaErr
-> SchemaGraph
-> RawSchema
-> Value
-> Maybe (Value -> valErr)
data ValidationFailure err = ValidationFailure
{ _failureName :: !err
, _failureInfo :: !FailureInfo
} deriving (Show)
data FailureInfo = FailureInfo
{ _validatingData :: !Value
, _offendingData :: !Value
} deriving (Show)