module Data.JsonSchema.Core where
import Data.Aeson
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as H
import Data.JsonSchema.Reference
import Data.Maybe
import Data.Text (Text)
import Data.Vector (Vector)
import qualified Data.Vector as V
newtype Spec = Spec
{ _unSpec :: HashMap Text (ValidatorGen, Text -> Value -> Vector RawSchema)
}
type Graph = HashMap Text (HashMap Text Value)
type ValErr = Text
type Validator = Value -> Vector ValErr
type ValidatorGen = Spec -> Graph -> RawSchema -> Value -> Maybe Validator
type Schema = Vector Validator
data RawSchema = RawSchema
{ _rsURI :: Text
, _rsObject :: HashMap Text Value
}
compile :: Spec -> Graph -> RawSchema -> Schema
compile spec g (RawSchema t o) =
V.fromList . catMaybes . H.elems $ H.intersectionWith f (_unSpec spec) o
where
f :: (ValidatorGen, a) -> Value -> Maybe Validator
f (vGen,_) = vGen spec g $ RawSchema (newResolutionScope t o) o
validate :: Schema -> Value -> Vector ValErr
validate s x = s >>= ($ x)