hjsonschema 1.3.0.1 → 1.4.0.0
raw patch · 42 files changed
+2640/−2635 lines, 42 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Data.JsonSchema.Draft4: FSParseFailure :: Text -> FilesystemFailure
- Data.JsonSchema.Draft4: FSReadFailure :: IOException -> FilesystemFailure
- Data.JsonSchema.Draft4: FVData :: Invalid -> FilesystemValidationFailure
- Data.JsonSchema.Draft4: FVRead :: FilesystemFailure -> FilesystemValidationFailure
- Data.JsonSchema.Draft4: FVSchema :: SchemaInvalid -> FilesystemValidationFailure
- Data.JsonSchema.Draft4: FailureAdditionalItems :: (AdditionalItemsInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureAllOf :: (AllOfInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureAnyOf :: (AnyOfInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureDependencies :: (DependenciesInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureEnum :: EnumInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureItems :: (ItemsInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMaxItems :: MaxItemsInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMaxLength :: MaxLengthInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMaxProperties :: MaxPropertiesInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMaximum :: MaximumInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMinItems :: MinItemsInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMinLength :: MinLengthInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMinProperties :: MinPropertiesInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMinimum :: MinimumInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureMultipleOf :: MultipleOfInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureNot :: NotValidatorInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureOneOf :: (OneOfInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailurePattern :: PatternInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailurePropertiesRelated :: (PropertiesRelatedInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureRef :: (RefInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureRequired :: () -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureType :: TypeValidatorInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: FailureUniqueItems :: UniqueItemsInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4: HTTPParseFailure :: Text -> HTTPFailure
- Data.JsonSchema.Draft4: HTTPRequestFailure :: HttpException -> HTTPFailure
- Data.JsonSchema.Draft4: HVData :: Invalid -> HTTPValidationFailure
- Data.JsonSchema.Draft4: HVRequest :: HTTPFailure -> HTTPValidationFailure
- Data.JsonSchema.Draft4: HVSchema :: SchemaInvalid -> HTTPValidationFailure
- Data.JsonSchema.Draft4: Invalid :: Schema -> Value -> NonEmpty ValidatorFailure -> Invalid
- Data.JsonSchema.Draft4: ReferencedSchemas :: !schema -> !(HashMap Text schema) -> ReferencedSchemas schema
- Data.JsonSchema.Draft4: Schema :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe (HashMap Text Schema) -> HashMap Text Value -> Maybe Scientific -> Maybe Scientific -> Maybe Bool -> Maybe Scientific -> Maybe Bool -> Maybe Int -> Maybe Int -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Bool -> Maybe (Items Schema) -> Maybe (AdditionalItems Schema) -> Maybe Int -> Maybe Int -> Maybe (Set Text) -> Maybe (HashMap Text (Dependency Schema)) -> Maybe (HashMap Text Schema) -> Maybe (HashMap Text Schema) -> Maybe (AdditionalProperties Schema) -> Maybe (NonEmpty Value) -> Maybe TypeValidator -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe Schema -> Schema
- Data.JsonSchema.Draft4: SchemaInvalid :: NonEmpty (Maybe Text, NonEmpty ValidatorFailure) -> SchemaInvalid
- Data.JsonSchema.Draft4: SchemaWithURI :: !schema -> !(Maybe Text) -> SchemaWithURI schema
- Data.JsonSchema.Draft4: URISchemaMap :: HashMap Text schema -> URISchemaMap schema
- Data.JsonSchema.Draft4: [_invalidFailures] :: Invalid -> NonEmpty ValidatorFailure
- Data.JsonSchema.Draft4: [_invalidInstance] :: Invalid -> Value
- Data.JsonSchema.Draft4: [_invalidSchema] :: Invalid -> Schema
- Data.JsonSchema.Draft4: [_rsSchemaMap] :: ReferencedSchemas schema -> !(HashMap Text schema)
- Data.JsonSchema.Draft4: [_rsStarting] :: ReferencedSchemas schema -> !schema
- Data.JsonSchema.Draft4: [_schemaAdditionalItems] :: Schema -> Maybe (AdditionalItems Schema)
- Data.JsonSchema.Draft4: [_schemaAdditionalProperties] :: Schema -> Maybe (AdditionalProperties Schema)
- Data.JsonSchema.Draft4: [_schemaAllOf] :: Schema -> Maybe (NonEmpty Schema)
- Data.JsonSchema.Draft4: [_schemaAnyOf] :: Schema -> Maybe (NonEmpty Schema)
- Data.JsonSchema.Draft4: [_schemaDefinitions] :: Schema -> Maybe (HashMap Text Schema)
- Data.JsonSchema.Draft4: [_schemaDependencies] :: Schema -> Maybe (HashMap Text (Dependency Schema))
- Data.JsonSchema.Draft4: [_schemaEnum] :: Schema -> Maybe (NonEmpty Value)
- Data.JsonSchema.Draft4: [_schemaExclusiveMaximum] :: Schema -> Maybe Bool
- Data.JsonSchema.Draft4: [_schemaExclusiveMinimum] :: Schema -> Maybe Bool
- Data.JsonSchema.Draft4: [_schemaId] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4: [_schemaItems] :: Schema -> Maybe (Items Schema)
- Data.JsonSchema.Draft4: [_schemaMaxItems] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4: [_schemaMaxLength] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4: [_schemaMaxProperties] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4: [_schemaMaximum] :: Schema -> Maybe Scientific
- Data.JsonSchema.Draft4: [_schemaMinItems] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4: [_schemaMinLength] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4: [_schemaMinProperties] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4: [_schemaMinimum] :: Schema -> Maybe Scientific
- Data.JsonSchema.Draft4: [_schemaMultipleOf] :: Schema -> Maybe Scientific
- Data.JsonSchema.Draft4: [_schemaNot] :: Schema -> Maybe Schema
- Data.JsonSchema.Draft4: [_schemaOneOf] :: Schema -> Maybe (NonEmpty Schema)
- Data.JsonSchema.Draft4: [_schemaOther] :: Schema -> HashMap Text Value
- Data.JsonSchema.Draft4: [_schemaPatternProperties] :: Schema -> Maybe (HashMap Text Schema)
- Data.JsonSchema.Draft4: [_schemaPattern] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4: [_schemaProperties] :: Schema -> Maybe (HashMap Text Schema)
- Data.JsonSchema.Draft4: [_schemaRef] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4: [_schemaRequired] :: Schema -> Maybe (Set Text)
- Data.JsonSchema.Draft4: [_schemaType] :: Schema -> Maybe TypeValidator
- Data.JsonSchema.Draft4: [_schemaUniqueItems] :: Schema -> Maybe Bool
- Data.JsonSchema.Draft4: [_schemaVersion] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4: [_swSchema] :: SchemaWithURI schema -> !schema
- Data.JsonSchema.Draft4: [_swURI] :: SchemaWithURI schema -> !(Maybe Text)
- Data.JsonSchema.Draft4: [_unSchemaInvalid] :: SchemaInvalid -> NonEmpty (Maybe Text, NonEmpty ValidatorFailure)
- Data.JsonSchema.Draft4: [_unURISchemaMap] :: URISchemaMap schema -> HashMap Text schema
- Data.JsonSchema.Draft4: checkSchema :: URISchemaMap Schema -> SchemaWithURI Schema -> Either SchemaInvalid (Value -> [ValidatorFailure])
- Data.JsonSchema.Draft4: data FilesystemFailure
- Data.JsonSchema.Draft4: data FilesystemValidationFailure
- Data.JsonSchema.Draft4: data HTTPFailure
- Data.JsonSchema.Draft4: data HTTPValidationFailure
- Data.JsonSchema.Draft4: data Invalid
- Data.JsonSchema.Draft4: data ReferencedSchemas schema
- Data.JsonSchema.Draft4: data Schema
- Data.JsonSchema.Draft4: data SchemaWithURI schema
- Data.JsonSchema.Draft4: data ValidatorFailure
- Data.JsonSchema.Draft4: draft4FetchInfo :: FetchInfo Schema
- Data.JsonSchema.Draft4: emptySchema :: Schema
- Data.JsonSchema.Draft4: fetchFilesystemAndValidate :: SchemaWithURI Schema -> Value -> IO (Either FilesystemValidationFailure ())
- Data.JsonSchema.Draft4: fetchHTTPAndValidate :: SchemaWithURI Schema -> Value -> IO (Either HTTPValidationFailure ())
- Data.JsonSchema.Draft4: instance GHC.Classes.Eq Data.JsonSchema.Draft4.FilesystemValidationFailure
- Data.JsonSchema.Draft4: instance GHC.Show.Show Data.JsonSchema.Draft4.FilesystemValidationFailure
- Data.JsonSchema.Draft4: instance GHC.Show.Show Data.JsonSchema.Draft4.HTTPValidationFailure
- Data.JsonSchema.Draft4: metaSchema :: Schema
- Data.JsonSchema.Draft4: metaSchemaBytes :: ByteString
- Data.JsonSchema.Draft4: newtype SchemaInvalid
- Data.JsonSchema.Draft4: newtype URISchemaMap schema
- Data.JsonSchema.Draft4: referencesValidity :: URISchemaMap Schema -> [(Text, NonEmpty ValidatorFailure)]
- Data.JsonSchema.Draft4: referencesViaFilesystem :: SchemaWithURI Schema -> IO (Either FilesystemFailure (URISchemaMap Schema))
- Data.JsonSchema.Draft4: referencesViaHTTP :: SchemaWithURI Schema -> IO (Either HTTPFailure (URISchemaMap Schema))
- Data.JsonSchema.Draft4: schemaValidity :: Schema -> [ValidatorFailure]
- Data.JsonSchema.Draft4.Failure: FailureAdditionalItems :: (AdditionalItemsInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureAllOf :: (AllOfInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureAnyOf :: (AnyOfInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureDependencies :: (DependenciesInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureEnum :: EnumInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureItems :: (ItemsInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMaxItems :: MaxItemsInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMaxLength :: MaxLengthInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMaxProperties :: MaxPropertiesInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMaximum :: MaximumInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMinItems :: MinItemsInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMinLength :: MinLengthInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMinProperties :: MinPropertiesInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMinimum :: MinimumInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureMultipleOf :: MultipleOfInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureNot :: NotValidatorInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureOneOf :: (OneOfInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailurePattern :: PatternInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailurePropertiesRelated :: (PropertiesRelatedInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureRef :: (RefInvalid ValidatorFailure) -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureRequired :: () -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureType :: TypeValidatorInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: FailureUniqueItems :: UniqueItemsInvalid -> ValidatorFailure
- Data.JsonSchema.Draft4.Failure: Invalid :: Schema -> Value -> NonEmpty ValidatorFailure -> Invalid
- Data.JsonSchema.Draft4.Failure: SchemaInvalid :: NonEmpty (Maybe Text, NonEmpty ValidatorFailure) -> SchemaInvalid
- Data.JsonSchema.Draft4.Failure: [_invalidFailures] :: Invalid -> NonEmpty ValidatorFailure
- Data.JsonSchema.Draft4.Failure: [_invalidInstance] :: Invalid -> Value
- Data.JsonSchema.Draft4.Failure: [_invalidSchema] :: Invalid -> Schema
- Data.JsonSchema.Draft4.Failure: [_unSchemaInvalid] :: SchemaInvalid -> NonEmpty (Maybe Text, NonEmpty ValidatorFailure)
- Data.JsonSchema.Draft4.Failure: data Invalid
- Data.JsonSchema.Draft4.Failure: data ValidatorFailure
- Data.JsonSchema.Draft4.Failure: instance GHC.Classes.Eq Data.JsonSchema.Draft4.Failure.Invalid
- Data.JsonSchema.Draft4.Failure: instance GHC.Classes.Eq Data.JsonSchema.Draft4.Failure.SchemaInvalid
- Data.JsonSchema.Draft4.Failure: instance GHC.Classes.Eq Data.JsonSchema.Draft4.Failure.ValidatorFailure
- Data.JsonSchema.Draft4.Failure: instance GHC.Show.Show Data.JsonSchema.Draft4.Failure.Invalid
- Data.JsonSchema.Draft4.Failure: instance GHC.Show.Show Data.JsonSchema.Draft4.Failure.SchemaInvalid
- Data.JsonSchema.Draft4.Failure: instance GHC.Show.Show Data.JsonSchema.Draft4.Failure.ValidatorFailure
- Data.JsonSchema.Draft4.Failure: newtype SchemaInvalid
- Data.JsonSchema.Draft4.Schema: Schema :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe (HashMap Text Schema) -> HashMap Text Value -> Maybe Scientific -> Maybe Scientific -> Maybe Bool -> Maybe Scientific -> Maybe Bool -> Maybe Int -> Maybe Int -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Bool -> Maybe (Items Schema) -> Maybe (AdditionalItems Schema) -> Maybe Int -> Maybe Int -> Maybe (Set Text) -> Maybe (HashMap Text (Dependency Schema)) -> Maybe (HashMap Text Schema) -> Maybe (HashMap Text Schema) -> Maybe (AdditionalProperties Schema) -> Maybe (NonEmpty Value) -> Maybe TypeValidator -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe Schema -> Schema
- Data.JsonSchema.Draft4.Schema: [_schemaAdditionalItems] :: Schema -> Maybe (AdditionalItems Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaAdditionalProperties] :: Schema -> Maybe (AdditionalProperties Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaAllOf] :: Schema -> Maybe (NonEmpty Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaAnyOf] :: Schema -> Maybe (NonEmpty Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaDefinitions] :: Schema -> Maybe (HashMap Text Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaDependencies] :: Schema -> Maybe (HashMap Text (Dependency Schema))
- Data.JsonSchema.Draft4.Schema: [_schemaEnum] :: Schema -> Maybe (NonEmpty Value)
- Data.JsonSchema.Draft4.Schema: [_schemaExclusiveMaximum] :: Schema -> Maybe Bool
- Data.JsonSchema.Draft4.Schema: [_schemaExclusiveMinimum] :: Schema -> Maybe Bool
- Data.JsonSchema.Draft4.Schema: [_schemaId] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4.Schema: [_schemaItems] :: Schema -> Maybe (Items Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaMaxItems] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4.Schema: [_schemaMaxLength] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4.Schema: [_schemaMaxProperties] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4.Schema: [_schemaMaximum] :: Schema -> Maybe Scientific
- Data.JsonSchema.Draft4.Schema: [_schemaMinItems] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4.Schema: [_schemaMinLength] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4.Schema: [_schemaMinProperties] :: Schema -> Maybe Int
- Data.JsonSchema.Draft4.Schema: [_schemaMinimum] :: Schema -> Maybe Scientific
- Data.JsonSchema.Draft4.Schema: [_schemaMultipleOf] :: Schema -> Maybe Scientific
- Data.JsonSchema.Draft4.Schema: [_schemaNot] :: Schema -> Maybe Schema
- Data.JsonSchema.Draft4.Schema: [_schemaOneOf] :: Schema -> Maybe (NonEmpty Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaOther] :: Schema -> HashMap Text Value
- Data.JsonSchema.Draft4.Schema: [_schemaPatternProperties] :: Schema -> Maybe (HashMap Text Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaPattern] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4.Schema: [_schemaProperties] :: Schema -> Maybe (HashMap Text Schema)
- Data.JsonSchema.Draft4.Schema: [_schemaRef] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4.Schema: [_schemaRequired] :: Schema -> Maybe (Set Text)
- Data.JsonSchema.Draft4.Schema: [_schemaType] :: Schema -> Maybe TypeValidator
- Data.JsonSchema.Draft4.Schema: [_schemaUniqueItems] :: Schema -> Maybe Bool
- Data.JsonSchema.Draft4.Schema: [_schemaVersion] :: Schema -> Maybe Text
- Data.JsonSchema.Draft4.Schema: data Schema
- Data.JsonSchema.Draft4.Schema: emptySchema :: Schema
- Data.JsonSchema.Draft4.Schema: instance Data.Aeson.Types.FromJSON.FromJSON Data.JsonSchema.Draft4.Schema.Schema
- Data.JsonSchema.Draft4.Schema: instance Data.Aeson.Types.ToJSON.ToJSON Data.JsonSchema.Draft4.Schema.Schema
- Data.JsonSchema.Draft4.Schema: instance GHC.Classes.Eq Data.JsonSchema.Draft4.Schema.Schema
- Data.JsonSchema.Draft4.Schema: instance GHC.Show.Show Data.JsonSchema.Draft4.Schema.Schema
- Data.JsonSchema.Draft4.Schema: instance Test.QuickCheck.Arbitrary.Arbitrary Data.JsonSchema.Draft4.Schema.Schema
- Data.JsonSchema.Draft4.Schema: internalSchemaHashMap :: HashMap Text (Schema -> Maybe Value)
- Data.JsonSchema.Draft4.Spec: continueValidating :: ReferencedSchemas Schema -> VisitedSchemas -> SchemaWithURI Schema -> Value -> [ValidatorFailure]
- Data.JsonSchema.Draft4.Spec: d4Spec :: ReferencedSchemas Schema -> VisitedSchemas -> Maybe Text -> Spec Schema ValidatorFailure
- Data.JsonSchema.Draft4.Spec: embedded :: Schema -> ([Schema], [Schema])
- Data.JsonSchema.Draft4.Spec: specValidate :: ReferencedSchemas Schema -> SchemaWithURI Schema -> Value -> [ValidatorFailure]
- Data.JsonSchema.Fetch: FSParseFailure :: Text -> FilesystemFailure
- Data.JsonSchema.Fetch: FSReadFailure :: IOException -> FilesystemFailure
- Data.JsonSchema.Fetch: FetchInfo :: (schema -> ([schema], [schema])) -> (schema -> Maybe Text) -> (schema -> Maybe Text) -> FetchInfo schema
- Data.JsonSchema.Fetch: HTTPParseFailure :: Text -> HTTPFailure
- Data.JsonSchema.Fetch: HTTPRequestFailure :: HttpException -> HTTPFailure
- Data.JsonSchema.Fetch: ReferencedSchemas :: !schema -> !(HashMap Text schema) -> ReferencedSchemas schema
- Data.JsonSchema.Fetch: SchemaWithURI :: !schema -> !(Maybe Text) -> SchemaWithURI schema
- Data.JsonSchema.Fetch: URISchemaMap :: HashMap Text schema -> URISchemaMap schema
- Data.JsonSchema.Fetch: [_fiEmbedded] :: FetchInfo schema -> schema -> ([schema], [schema])
- Data.JsonSchema.Fetch: [_fiId] :: FetchInfo schema -> schema -> Maybe Text
- Data.JsonSchema.Fetch: [_fiRef] :: FetchInfo schema -> schema -> Maybe Text
- Data.JsonSchema.Fetch: [_rsSchemaMap] :: ReferencedSchemas schema -> !(HashMap Text schema)
- Data.JsonSchema.Fetch: [_rsStarting] :: ReferencedSchemas schema -> !schema
- Data.JsonSchema.Fetch: [_swSchema] :: SchemaWithURI schema -> !schema
- Data.JsonSchema.Fetch: [_swURI] :: SchemaWithURI schema -> !(Maybe Text)
- Data.JsonSchema.Fetch: [_unURISchemaMap] :: URISchemaMap schema -> HashMap Text schema
- Data.JsonSchema.Fetch: data FetchInfo schema
- Data.JsonSchema.Fetch: data FilesystemFailure
- Data.JsonSchema.Fetch: data HTTPFailure
- Data.JsonSchema.Fetch: data ReferencedSchemas schema
- Data.JsonSchema.Fetch: data SchemaWithURI schema
- Data.JsonSchema.Fetch: getRecursiveReferences :: forall schema. FromJSON schema => (Text -> IO ByteString) -> FetchInfo schema -> URISchemaMap schema -> SchemaWithURI schema -> IO (Either Text (URISchemaMap schema))
- Data.JsonSchema.Fetch: getReference :: ReferencedSchemas schema -> Maybe Text -> Maybe schema
- Data.JsonSchema.Fetch: includeSubschemas :: forall schema. FetchInfo schema -> SchemaWithURI schema -> [SchemaWithURI schema]
- Data.JsonSchema.Fetch: instance GHC.Classes.Eq Data.JsonSchema.Fetch.FilesystemFailure
- Data.JsonSchema.Fetch: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.JsonSchema.Fetch.ReferencedSchemas schema)
- Data.JsonSchema.Fetch: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.JsonSchema.Fetch.SchemaWithURI schema)
- Data.JsonSchema.Fetch: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.JsonSchema.Fetch.URISchemaMap schema)
- Data.JsonSchema.Fetch: instance GHC.Show.Show Data.JsonSchema.Fetch.FilesystemFailure
- Data.JsonSchema.Fetch: instance GHC.Show.Show Data.JsonSchema.Fetch.HTTPFailure
- Data.JsonSchema.Fetch: instance GHC.Show.Show schema => GHC.Show.Show (Data.JsonSchema.Fetch.ReferencedSchemas schema)
- Data.JsonSchema.Fetch: instance GHC.Show.Show schema => GHC.Show.Show (Data.JsonSchema.Fetch.SchemaWithURI schema)
- Data.JsonSchema.Fetch: instance GHC.Show.Show schema => GHC.Show.Show (Data.JsonSchema.Fetch.URISchemaMap schema)
- Data.JsonSchema.Fetch: newtype URISchemaMap schema
- Data.JsonSchema.Fetch: referencesMethodAgnostic :: forall schema. FromJSON schema => (Text -> IO ByteString) -> FetchInfo schema -> SchemaWithURI schema -> IO (Either Text (URISchemaMap schema))
- Data.JsonSchema.Fetch: referencesViaFilesystem' :: forall schema. FromJSON schema => FetchInfo schema -> SchemaWithURI schema -> IO (Either FilesystemFailure (URISchemaMap schema))
- Data.JsonSchema.Fetch: referencesViaHTTP' :: forall schema. FromJSON schema => FetchInfo schema -> SchemaWithURI schema -> IO (Either HTTPFailure (URISchemaMap schema))
- Data.JsonSchema.Types: Schema :: HashMap Text Value -> Schema
- Data.JsonSchema.Types: Spec :: [Validator schema schema err] -> Spec schema err
- Data.JsonSchema.Types: [_unSchema] :: Schema -> HashMap Text Value
- Data.JsonSchema.Types: [_unSpec] :: Spec schema err -> [Validator schema schema err]
- Data.JsonSchema.Types: embedded :: Spec schema a -> schema -> ([schema], [schema])
- Data.JsonSchema.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.JsonSchema.Types.Schema
- Data.JsonSchema.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.JsonSchema.Types.Schema
- Data.JsonSchema.Types: instance GHC.Classes.Eq Data.JsonSchema.Types.Schema
- Data.JsonSchema.Types: instance GHC.Show.Show Data.JsonSchema.Types.Schema
- Data.JsonSchema.Types: newtype Schema
- Data.JsonSchema.Types: newtype Spec schema err
- Data.JsonSchema.Types: validate :: Spec schema err -> schema -> Value -> [err]
- Data.Validator.Draft4: Definitions :: HashMap Text schema -> Definitions schema
- Data.Validator.Draft4: [_unDefinitions] :: Definitions schema -> HashMap Text schema
- Data.Validator.Draft4: allOfValidator :: (schema -> Value -> [err]) -> Validator schema (Maybe (AllOf schema)) (AllOfInvalid err)
- Data.Validator.Draft4: anyOfValidator :: (schema -> Value -> [err]) -> Validator schema (Maybe (AnyOf schema)) (AnyOfInvalid err)
- Data.Validator.Draft4: definitionsEmbedded :: Validator schema (Maybe (Definitions schema)) err
- Data.Validator.Draft4: dependenciesValidator :: (schema -> Value -> [err]) -> Validator schema (Maybe (DependenciesValidator schema)) (DependenciesInvalid err)
- Data.Validator.Draft4: enumValidator :: Validator a (Maybe EnumValidator) EnumInvalid
- Data.Validator.Draft4: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Definitions schema)
- Data.Validator.Draft4: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Definitions schema)
- Data.Validator.Draft4: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Definitions schema)
- Data.Validator.Draft4: itemsRelatedValidator :: (schema -> Value -> [err]) -> Validator schema (ItemsRelated schema) (ItemsRelatedInvalid err)
- Data.Validator.Draft4: maxItemsValidator :: Validator a (Maybe MaxItems) MaxItemsInvalid
- Data.Validator.Draft4: maxLengthValidator :: Validator a (Maybe MaxLength) MaxLengthInvalid
- Data.Validator.Draft4: maxPropertiesValidator :: Validator a (Maybe MaxProperties) MaxPropertiesInvalid
- Data.Validator.Draft4: maximumValidator :: Validator a (Maybe Maximum) MaximumInvalid
- Data.Validator.Draft4: minItemsValidator :: Validator a (Maybe MinItems) MinItemsInvalid
- Data.Validator.Draft4: minLengthValidator :: Validator a (Maybe MinLength) MinLengthInvalid
- Data.Validator.Draft4: minPropertiesValidator :: Validator a (Maybe MinProperties) MinPropertiesInvalid
- Data.Validator.Draft4: minimumValidator :: Validator a (Maybe Minimum) MinimumInvalid
- Data.Validator.Draft4: multipleOfValidator :: Validator a (Maybe MultipleOf) MultipleOfInvalid
- Data.Validator.Draft4: newtype Definitions schema
- Data.Validator.Draft4: noEmbedded :: a -> ([b], [b])
- Data.Validator.Draft4: notValidator :: ToJSON schema => (schema -> Value -> [err]) -> Validator schema (Maybe (NotValidator schema)) NotValidatorInvalid
- Data.Validator.Draft4: oneOfValidator :: ToJSON schema => (schema -> Value -> [err]) -> Validator schema (Maybe (OneOf schema)) (OneOfInvalid err)
- Data.Validator.Draft4: patternValidator :: Validator a (Maybe PatternValidator) PatternInvalid
- Data.Validator.Draft4: propertiesRelatedValidator :: (schema -> Value -> [err]) -> Validator schema (PropertiesRelated schema) (PropertiesRelatedInvalid err)
- Data.Validator.Draft4: refValidator :: (FromJSON schema, ToJSON schema) => VisitedSchemas -> Maybe Text -> (Maybe Text -> Maybe schema) -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err]) -> Validator a (Maybe Ref) (RefInvalid err)
- Data.Validator.Draft4: requiredValidator :: Validator a (Maybe Required) ()
- Data.Validator.Draft4: run :: FromJSON b => (a -> b -> Maybe c) -> Maybe a -> Value -> [c]
- Data.Validator.Draft4: typeValidator :: Validator a (Maybe TypeContext) TypeValidatorInvalid
- Data.Validator.Draft4: uniqueItemsValidator :: Validator a (Maybe UniqueItems) UniqueItemsInvalid
- Data.Validator.Draft4.Any: AllOf :: NonEmpty schema -> AllOf schema
- Data.Validator.Draft4.Any: AllOfInvalid :: (NonEmpty (Index, NonEmpty err)) -> AllOfInvalid err
- Data.Validator.Draft4.Any: AnyOf :: NonEmpty schema -> AnyOf schema
- Data.Validator.Draft4.Any: AnyOfInvalid :: (NonEmpty (Index, NonEmpty err)) -> AnyOfInvalid err
- Data.Validator.Draft4.Any: EnumInvalid :: EnumValidator -> Value -> EnumInvalid
- Data.Validator.Draft4.Any: EnumValidator :: NonEmpty Value -> EnumValidator
- Data.Validator.Draft4.Any: NoSuccesses :: (NonEmpty (Index, NonEmpty err)) -> Value -> OneOfInvalid err
- Data.Validator.Draft4.Any: NotValidator :: schema -> NotValidator schema
- Data.Validator.Draft4.Any: NotValidatorInvalid :: Value -> Value -> NotValidatorInvalid
- Data.Validator.Draft4.Any: OneOf :: NonEmpty schema -> OneOf schema
- Data.Validator.Draft4.Any: Ref :: Text -> Ref
- Data.Validator.Draft4.Any: RefInvalid :: Text -> Value -> (NonEmpty err) -> RefInvalid err
- Data.Validator.Draft4.Any: RefLoop :: Text -> VisitedSchemas -> URIBaseAndFragment -> RefInvalid err
- Data.Validator.Draft4.Any: RefPointerResolution :: Text -> RefInvalid err
- Data.Validator.Draft4.Any: RefResolution :: Text -> RefInvalid err
- Data.Validator.Draft4.Any: TooManySuccesses :: (NonEmpty (Index, Value)) -> Value -> OneOfInvalid err
- Data.Validator.Draft4.Any: TypeContext :: TypeValidator -> TypeContext
- Data.Validator.Draft4.Any: TypeValidatorArray :: (Set Text) -> TypeValidator
- Data.Validator.Draft4.Any: TypeValidatorInvalid :: TypeValidator -> Value -> TypeValidatorInvalid
- Data.Validator.Draft4.Any: TypeValidatorString :: Text -> TypeValidator
- Data.Validator.Draft4.Any: VisitedSchemas :: [URIBaseAndFragment] -> VisitedSchemas
- Data.Validator.Draft4.Any: [_unAllOf] :: AllOf schema -> NonEmpty schema
- Data.Validator.Draft4.Any: [_unAnyOf] :: AnyOf schema -> NonEmpty schema
- Data.Validator.Draft4.Any: [_unEnumValidator] :: EnumValidator -> NonEmpty Value
- Data.Validator.Draft4.Any: [_unNotValidator] :: NotValidator schema -> schema
- Data.Validator.Draft4.Any: [_unOneOf] :: OneOf schema -> NonEmpty schema
- Data.Validator.Draft4.Any: [_unRef] :: Ref -> Text
- Data.Validator.Draft4.Any: [_unTypeContext] :: TypeContext -> TypeValidator
- Data.Validator.Draft4.Any: [_unVisited] :: VisitedSchemas -> [URIBaseAndFragment]
- Data.Validator.Draft4.Any: allOfVal :: forall err schema. (schema -> Value -> [err]) -> AllOf schema -> Value -> Maybe (AllOfInvalid err)
- Data.Validator.Draft4.Any: anyOfVal :: forall err schema. (schema -> Value -> [err]) -> AnyOf schema -> Value -> Maybe (AnyOfInvalid err)
- Data.Validator.Draft4.Any: data EnumInvalid
- Data.Validator.Draft4.Any: data NotValidatorInvalid
- Data.Validator.Draft4.Any: data OneOfInvalid err
- Data.Validator.Draft4.Any: data RefInvalid err
- Data.Validator.Draft4.Any: data TypeValidator
- Data.Validator.Draft4.Any: data TypeValidatorInvalid
- Data.Validator.Draft4.Any: enumVal :: EnumValidator -> Value -> Maybe EnumInvalid
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Any.EnumValidator
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Any.Ref
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Any.TypeContext
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Any.TypeValidator
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Any.AllOf schema)
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Any.AnyOf schema)
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Any.NotValidator schema)
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Any.OneOf schema)
- Data.Validator.Draft4.Any: instance Data.Aeson.Types.ToJSON.ToJSON Data.Validator.Draft4.Any.TypeValidator
- Data.Validator.Draft4.Any: instance Data.Semigroup.Semigroup Data.Validator.Draft4.Any.VisitedSchemas
- Data.Validator.Draft4.Any: instance GHC.Base.Monoid Data.Validator.Draft4.Any.VisitedSchemas
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.EnumInvalid
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.EnumValidator
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.NotValidatorInvalid
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.Ref
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.TypeContext
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.TypeValidator
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.TypeValidatorInvalid
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq Data.Validator.Draft4.Any.VisitedSchemas
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Any.AllOfInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Any.AnyOfInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Any.OneOfInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Any.RefInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Any.AllOf schema)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Any.AnyOf schema)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Any.NotValidator schema)
- Data.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Any.OneOf schema)
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.EnumInvalid
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.EnumValidator
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.NotValidatorInvalid
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.Ref
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.TypeContext
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.TypeValidator
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.TypeValidatorInvalid
- Data.Validator.Draft4.Any: instance GHC.Show.Show Data.Validator.Draft4.Any.VisitedSchemas
- Data.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Any.AllOfInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Any.AnyOfInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Any.OneOfInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Any.RefInvalid err)
- Data.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Any.AllOf schema)
- Data.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Any.AnyOf schema)
- Data.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Any.NotValidator schema)
- Data.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Any.OneOf schema)
- Data.Validator.Draft4.Any: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Validator.Draft4.Any.EnumValidator
- Data.Validator.Draft4.Any: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Validator.Draft4.Any.TypeValidator
- Data.Validator.Draft4.Any: newtype AllOf schema
- Data.Validator.Draft4.Any: newtype AllOfInvalid err
- Data.Validator.Draft4.Any: newtype AnyOf schema
- Data.Validator.Draft4.Any: newtype AnyOfInvalid err
- Data.Validator.Draft4.Any: newtype EnumValidator
- Data.Validator.Draft4.Any: newtype NotValidator schema
- Data.Validator.Draft4.Any: newtype OneOf schema
- Data.Validator.Draft4.Any: newtype Ref
- Data.Validator.Draft4.Any: newtype TypeContext
- Data.Validator.Draft4.Any: newtype VisitedSchemas
- Data.Validator.Draft4.Any: notVal :: ToJSON schema => (schema -> Value -> [err]) -> NotValidator schema -> Value -> Maybe NotValidatorInvalid
- Data.Validator.Draft4.Any: oneOfVal :: forall err schema. ToJSON schema => (schema -> Value -> [err]) -> OneOf schema -> Value -> Maybe (OneOfInvalid err)
- Data.Validator.Draft4.Any: refVal :: forall err schema. (FromJSON schema, ToJSON schema) => VisitedSchemas -> Maybe Text -> (Maybe Text -> Maybe schema) -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err]) -> Ref -> Value -> Maybe (RefInvalid err)
- Data.Validator.Draft4.Any: setFromTypeValidator :: TypeValidator -> Set Text
- Data.Validator.Draft4.Any: typeVal :: TypeContext -> Value -> Maybe TypeValidatorInvalid
- Data.Validator.Draft4.Array: AdditionalBool :: Bool -> AdditionalItems schema
- Data.Validator.Draft4.Array: AdditionalItemsBoolInvalid :: (NonEmpty (Index, Value)) -> AdditionalItemsInvalid err
- Data.Validator.Draft4.Array: AdditionalItemsObjectInvalid :: (NonEmpty (Index, NonEmpty err)) -> AdditionalItemsInvalid err
- Data.Validator.Draft4.Array: AdditionalObject :: schema -> AdditionalItems schema
- Data.Validator.Draft4.Array: IRInvalidAdditional :: (AdditionalItemsInvalid err) -> ItemsRelatedInvalid err
- Data.Validator.Draft4.Array: IRInvalidItems :: (ItemsInvalid err) -> ItemsRelatedInvalid err
- Data.Validator.Draft4.Array: ItemsArray :: [schema] -> Items schema
- Data.Validator.Draft4.Array: ItemsArrayInvalid :: (NonEmpty (Index, NonEmpty err)) -> ItemsInvalid err
- Data.Validator.Draft4.Array: ItemsObject :: schema -> Items schema
- Data.Validator.Draft4.Array: ItemsObjectInvalid :: (NonEmpty (Index, NonEmpty err)) -> ItemsInvalid err
- Data.Validator.Draft4.Array: ItemsRelated :: Maybe (Items schema) -> Maybe (AdditionalItems schema) -> ItemsRelated schema
- Data.Validator.Draft4.Array: MaxItems :: Int -> MaxItems
- Data.Validator.Draft4.Array: MaxItemsInvalid :: MaxItems -> (Vector Value) -> MaxItemsInvalid
- Data.Validator.Draft4.Array: MinItems :: Int -> MinItems
- Data.Validator.Draft4.Array: MinItemsInvalid :: MinItems -> (Vector Value) -> MinItemsInvalid
- Data.Validator.Draft4.Array: UniqueItems :: Bool -> UniqueItems
- Data.Validator.Draft4.Array: UniqueItemsInvalid :: (Vector Value) -> UniqueItemsInvalid
- Data.Validator.Draft4.Array: [_irAdditional] :: ItemsRelated schema -> Maybe (AdditionalItems schema)
- Data.Validator.Draft4.Array: [_irItems] :: ItemsRelated schema -> Maybe (Items schema)
- Data.Validator.Draft4.Array: [_unMaxItems] :: MaxItems -> Int
- Data.Validator.Draft4.Array: [_unMinItems] :: MinItems -> Int
- Data.Validator.Draft4.Array: [_unUniqueItems] :: UniqueItems -> Bool
- Data.Validator.Draft4.Array: additionalItemsVal :: forall err schema. (schema -> Value -> [err]) -> AdditionalItems schema -> [(Index, Value)] -> Maybe (AdditionalItemsInvalid err)
- Data.Validator.Draft4.Array: data AdditionalItems schema
- Data.Validator.Draft4.Array: data AdditionalItemsInvalid err
- Data.Validator.Draft4.Array: data Items schema
- Data.Validator.Draft4.Array: data ItemsInvalid err
- Data.Validator.Draft4.Array: data ItemsRelated schema
- Data.Validator.Draft4.Array: data ItemsRelatedInvalid err
- Data.Validator.Draft4.Array: data MaxItemsInvalid
- Data.Validator.Draft4.Array: data MinItemsInvalid
- Data.Validator.Draft4.Array: data UniqueItemsInvalid
- Data.Validator.Draft4.Array: emptyItems :: ItemsRelated schema
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Array.MaxItems
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Array.MinItems
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Array.UniqueItems
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Array.AdditionalItems schema)
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Array.Items schema)
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Array.ItemsRelated schema)
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (Data.Validator.Draft4.Array.AdditionalItems schema)
- Data.Validator.Draft4.Array: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (Data.Validator.Draft4.Array.Items schema)
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq Data.Validator.Draft4.Array.MaxItems
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq Data.Validator.Draft4.Array.MaxItemsInvalid
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq Data.Validator.Draft4.Array.MinItems
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq Data.Validator.Draft4.Array.MinItemsInvalid
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq Data.Validator.Draft4.Array.UniqueItems
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq Data.Validator.Draft4.Array.UniqueItemsInvalid
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Array.AdditionalItemsInvalid err)
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Array.ItemsInvalid err)
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Array.ItemsRelatedInvalid err)
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Array.AdditionalItems schema)
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Array.Items schema)
- Data.Validator.Draft4.Array: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Array.ItemsRelated schema)
- Data.Validator.Draft4.Array: instance GHC.Show.Show Data.Validator.Draft4.Array.MaxItems
- Data.Validator.Draft4.Array: instance GHC.Show.Show Data.Validator.Draft4.Array.MaxItemsInvalid
- Data.Validator.Draft4.Array: instance GHC.Show.Show Data.Validator.Draft4.Array.MinItems
- Data.Validator.Draft4.Array: instance GHC.Show.Show Data.Validator.Draft4.Array.MinItemsInvalid
- Data.Validator.Draft4.Array: instance GHC.Show.Show Data.Validator.Draft4.Array.UniqueItems
- Data.Validator.Draft4.Array: instance GHC.Show.Show Data.Validator.Draft4.Array.UniqueItemsInvalid
- Data.Validator.Draft4.Array: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Array.AdditionalItemsInvalid err)
- Data.Validator.Draft4.Array: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Array.ItemsInvalid err)
- Data.Validator.Draft4.Array: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Array.ItemsRelatedInvalid err)
- Data.Validator.Draft4.Array: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Array.AdditionalItems schema)
- Data.Validator.Draft4.Array: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Array.Items schema)
- Data.Validator.Draft4.Array: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Array.ItemsRelated schema)
- Data.Validator.Draft4.Array: instance Test.QuickCheck.Arbitrary.Arbitrary schema => Test.QuickCheck.Arbitrary.Arbitrary (Data.Validator.Draft4.Array.AdditionalItems schema)
- Data.Validator.Draft4.Array: instance Test.QuickCheck.Arbitrary.Arbitrary schema => Test.QuickCheck.Arbitrary.Arbitrary (Data.Validator.Draft4.Array.Items schema)
- Data.Validator.Draft4.Array: itemsRelatedVal :: forall err schema. (schema -> Value -> [err]) -> ItemsRelated schema -> Vector Value -> [ItemsRelatedInvalid err]
- Data.Validator.Draft4.Array: itemsVal :: forall err schema. (schema -> Value -> [err]) -> Items schema -> Vector Value -> (Maybe (ItemsInvalid err), [(Index, Value)])
- Data.Validator.Draft4.Array: maxItemsVal :: MaxItems -> Vector Value -> Maybe MaxItemsInvalid
- Data.Validator.Draft4.Array: minItemsVal :: MinItems -> Vector Value -> Maybe MinItemsInvalid
- Data.Validator.Draft4.Array: newtype MaxItems
- Data.Validator.Draft4.Array: newtype MinItems
- Data.Validator.Draft4.Array: newtype UniqueItems
- Data.Validator.Draft4.Array: uniqueItemsVal :: UniqueItems -> Vector Value -> Maybe UniqueItemsInvalid
- Data.Validator.Draft4.Number: Maximum :: Bool -> Scientific -> Maximum
- Data.Validator.Draft4.Number: MaximumInvalid :: Maximum -> Scientific -> MaximumInvalid
- Data.Validator.Draft4.Number: Minimum :: Bool -> Scientific -> Minimum
- Data.Validator.Draft4.Number: MinimumInvalid :: Minimum -> Scientific -> MinimumInvalid
- Data.Validator.Draft4.Number: MultipleOf :: Scientific -> MultipleOf
- Data.Validator.Draft4.Number: MultipleOfInvalid :: MultipleOf -> Scientific -> MultipleOfInvalid
- Data.Validator.Draft4.Number: [_maximumExclusive] :: Maximum -> Bool
- Data.Validator.Draft4.Number: [_maximumValue] :: Maximum -> Scientific
- Data.Validator.Draft4.Number: [_minimumExclusive] :: Minimum -> Bool
- Data.Validator.Draft4.Number: [_minimumValue] :: Minimum -> Scientific
- Data.Validator.Draft4.Number: [_unMultipleOf] :: MultipleOf -> Scientific
- Data.Validator.Draft4.Number: data Maximum
- Data.Validator.Draft4.Number: data MaximumInvalid
- Data.Validator.Draft4.Number: data Minimum
- Data.Validator.Draft4.Number: data MinimumInvalid
- Data.Validator.Draft4.Number: data MultipleOfInvalid
- Data.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Number.Maximum
- Data.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Number.Minimum
- Data.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Number.MultipleOf
- Data.Validator.Draft4.Number: instance GHC.Classes.Eq Data.Validator.Draft4.Number.Maximum
- Data.Validator.Draft4.Number: instance GHC.Classes.Eq Data.Validator.Draft4.Number.MaximumInvalid
- Data.Validator.Draft4.Number: instance GHC.Classes.Eq Data.Validator.Draft4.Number.Minimum
- Data.Validator.Draft4.Number: instance GHC.Classes.Eq Data.Validator.Draft4.Number.MinimumInvalid
- Data.Validator.Draft4.Number: instance GHC.Classes.Eq Data.Validator.Draft4.Number.MultipleOf
- Data.Validator.Draft4.Number: instance GHC.Classes.Eq Data.Validator.Draft4.Number.MultipleOfInvalid
- Data.Validator.Draft4.Number: instance GHC.Show.Show Data.Validator.Draft4.Number.Maximum
- Data.Validator.Draft4.Number: instance GHC.Show.Show Data.Validator.Draft4.Number.MaximumInvalid
- Data.Validator.Draft4.Number: instance GHC.Show.Show Data.Validator.Draft4.Number.Minimum
- Data.Validator.Draft4.Number: instance GHC.Show.Show Data.Validator.Draft4.Number.MinimumInvalid
- Data.Validator.Draft4.Number: instance GHC.Show.Show Data.Validator.Draft4.Number.MultipleOf
- Data.Validator.Draft4.Number: instance GHC.Show.Show Data.Validator.Draft4.Number.MultipleOfInvalid
- Data.Validator.Draft4.Number: maximumVal :: Maximum -> Scientific -> Maybe MaximumInvalid
- Data.Validator.Draft4.Number: minimumVal :: Minimum -> Scientific -> Maybe MinimumInvalid
- Data.Validator.Draft4.Number: multipleOfVal :: MultipleOf -> Scientific -> Maybe MultipleOfInvalid
- Data.Validator.Draft4.Number: newtype MultipleOf
- Data.Validator.Draft4.Object: APBoolInvalid :: (HashMap Text Value) -> APInvalid err
- Data.Validator.Draft4.Object: APObjectInvalid :: (HashMap Text (NonEmpty err)) -> APInvalid err
- Data.Validator.Draft4.Object: AdditionalPropertiesBool :: Bool -> AdditionalProperties schema
- Data.Validator.Draft4.Object: AdditionalPropertiesObject :: schema -> AdditionalProperties schema
- Data.Validator.Draft4.Object: DependenciesInvalid :: (HashMap Text (DependencyMemberInvalid err)) -> DependenciesInvalid err
- Data.Validator.Draft4.Object: DependenciesValidator :: HashMap Text (Dependency schema) -> DependenciesValidator schema
- Data.Validator.Draft4.Object: MaxProperties :: Int -> MaxProperties
- Data.Validator.Draft4.Object: MaxPropertiesInvalid :: MaxProperties -> (HashMap Text Value) -> MaxPropertiesInvalid
- Data.Validator.Draft4.Object: MinProperties :: Int -> MinProperties
- Data.Validator.Draft4.Object: MinPropertiesInvalid :: MinProperties -> (HashMap Text Value) -> MinPropertiesInvalid
- Data.Validator.Draft4.Object: PropertiesRelated :: Maybe (HashMap Text schema) -> Maybe (HashMap Text schema) -> Maybe (AdditionalProperties schema) -> PropertiesRelated schema
- Data.Validator.Draft4.Object: PropertiesRelatedInvalid :: HashMap Text [err] -> HashMap (Regex, Key) [err] -> Maybe (APInvalid err) -> PropertiesRelatedInvalid err
- Data.Validator.Draft4.Object: PropertyDepInvalid :: (Set Text) -> (HashMap Text Value) -> DependencyMemberInvalid err
- Data.Validator.Draft4.Object: PropertyDependency :: (Set Text) -> Dependency schema
- Data.Validator.Draft4.Object: Regex :: Text -> Regex
- Data.Validator.Draft4.Object: Remaining :: HashMap Text Value -> Remaining
- Data.Validator.Draft4.Object: Required :: Set Text -> Required
- Data.Validator.Draft4.Object: SchemaDepInvalid :: (NonEmpty err) -> DependencyMemberInvalid err
- Data.Validator.Draft4.Object: SchemaDependency :: schema -> Dependency schema
- Data.Validator.Draft4.Object: [_prInvalidAdditional] :: PropertiesRelatedInvalid err -> Maybe (APInvalid err)
- Data.Validator.Draft4.Object: [_prInvalidPattern] :: PropertiesRelatedInvalid err -> HashMap (Regex, Key) [err]
- Data.Validator.Draft4.Object: [_prInvalidProperties] :: PropertiesRelatedInvalid err -> HashMap Text [err]
- Data.Validator.Draft4.Object: [_propAdditional] :: PropertiesRelated schema -> Maybe (AdditionalProperties schema)
- Data.Validator.Draft4.Object: [_propPattern] :: PropertiesRelated schema -> Maybe (HashMap Text schema)
- Data.Validator.Draft4.Object: [_propProperties] :: PropertiesRelated schema -> Maybe (HashMap Text schema)
- Data.Validator.Draft4.Object: [_unDependenciesValidator] :: DependenciesValidator schema -> HashMap Text (Dependency schema)
- Data.Validator.Draft4.Object: [_unMaxProperties] :: MaxProperties -> Int
- Data.Validator.Draft4.Object: [_unMinProperties] :: MinProperties -> Int
- Data.Validator.Draft4.Object: [_unRegex] :: Regex -> Text
- Data.Validator.Draft4.Object: [_unRemaining] :: Remaining -> HashMap Text Value
- Data.Validator.Draft4.Object: [_unRequired] :: Required -> Set Text
- Data.Validator.Draft4.Object: additionalProperties :: forall err schema. (schema -> Value -> [err]) -> AdditionalProperties schema -> Remaining -> Maybe (APInvalid err)
- Data.Validator.Draft4.Object: additionalPropertiesBool :: Bool -> Remaining -> Maybe (HashMap Text Value)
- Data.Validator.Draft4.Object: additionalPropertiesObject :: forall err schema. (schema -> Value -> [err]) -> schema -> Remaining -> Maybe (HashMap Text (NonEmpty err))
- Data.Validator.Draft4.Object: data APInvalid err
- Data.Validator.Draft4.Object: data AdditionalProperties schema
- Data.Validator.Draft4.Object: data DependenciesInvalid err
- Data.Validator.Draft4.Object: data Dependency schema
- Data.Validator.Draft4.Object: data DependencyMemberInvalid err
- Data.Validator.Draft4.Object: data MaxPropertiesInvalid
- Data.Validator.Draft4.Object: data MinPropertiesInvalid
- Data.Validator.Draft4.Object: data PropertiesRelated schema
- Data.Validator.Draft4.Object: data PropertiesRelatedInvalid err
- Data.Validator.Draft4.Object: dependenciesVal :: forall err schema. (schema -> Value -> [err]) -> DependenciesValidator schema -> HashMap Text Value -> Maybe (DependenciesInvalid err)
- Data.Validator.Draft4.Object: emptyProperties :: PropertiesRelated schema
- Data.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Object.MaxProperties
- Data.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Object.MinProperties
- Data.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.Object.Required
- Data.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Object.DependenciesValidator schema)
- Data.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Draft4.Object.Dependency schema)
- Data.Validator.Draft4.Object: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (Data.Validator.Draft4.Object.Dependency schema)
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq Data.Validator.Draft4.Object.MaxProperties
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq Data.Validator.Draft4.Object.MaxPropertiesInvalid
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq Data.Validator.Draft4.Object.MinProperties
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq Data.Validator.Draft4.Object.MinPropertiesInvalid
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq Data.Validator.Draft4.Object.Required
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Object.DependenciesInvalid err)
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq err => GHC.Classes.Eq (Data.Validator.Draft4.Object.DependencyMemberInvalid err)
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Object.DependenciesValidator schema)
- Data.Validator.Draft4.Object: instance GHC.Classes.Eq schema => GHC.Classes.Eq (Data.Validator.Draft4.Object.Dependency schema)
- Data.Validator.Draft4.Object: instance GHC.Show.Show Data.Validator.Draft4.Object.MaxProperties
- Data.Validator.Draft4.Object: instance GHC.Show.Show Data.Validator.Draft4.Object.MaxPropertiesInvalid
- Data.Validator.Draft4.Object: instance GHC.Show.Show Data.Validator.Draft4.Object.MinProperties
- Data.Validator.Draft4.Object: instance GHC.Show.Show Data.Validator.Draft4.Object.MinPropertiesInvalid
- Data.Validator.Draft4.Object: instance GHC.Show.Show Data.Validator.Draft4.Object.Required
- Data.Validator.Draft4.Object: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Object.DependenciesInvalid err)
- Data.Validator.Draft4.Object: instance GHC.Show.Show err => GHC.Show.Show (Data.Validator.Draft4.Object.DependencyMemberInvalid err)
- Data.Validator.Draft4.Object: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Object.DependenciesValidator schema)
- Data.Validator.Draft4.Object: instance GHC.Show.Show schema => GHC.Show.Show (Data.Validator.Draft4.Object.Dependency schema)
- Data.Validator.Draft4.Object: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Validator.Draft4.Object.Required
- Data.Validator.Draft4.Object: instance Test.QuickCheck.Arbitrary.Arbitrary schema => Test.QuickCheck.Arbitrary.Arbitrary (Data.Validator.Draft4.Object.Dependency schema)
- Data.Validator.Draft4.Object: maxPropertiesVal :: MaxProperties -> HashMap Text Value -> Maybe MaxPropertiesInvalid
- Data.Validator.Draft4.Object: minPropertiesVal :: MinProperties -> HashMap Text Value -> Maybe MinPropertiesInvalid
- Data.Validator.Draft4.Object: newtype DependenciesValidator schema
- Data.Validator.Draft4.Object: newtype MaxProperties
- Data.Validator.Draft4.Object: newtype MinProperties
- Data.Validator.Draft4.Object: newtype Regex
- Data.Validator.Draft4.Object: newtype Remaining
- Data.Validator.Draft4.Object: newtype Required
- Data.Validator.Draft4.Object: patternAndUnmatched :: forall err schema. (schema -> Value -> [err]) -> HashMap Text schema -> HashMap Text Value -> (HashMap (Regex, Key) [err], Remaining)
- Data.Validator.Draft4.Object: propertiesRelatedVal :: forall err schema. (schema -> Value -> [err]) -> PropertiesRelated schema -> HashMap Text Value -> Maybe (PropertiesRelatedInvalid err)
- Data.Validator.Draft4.Object: requiredVal :: Required -> HashMap Text Value -> Maybe ()
- Data.Validator.Draft4.String: MaxLength :: Int -> MaxLength
- Data.Validator.Draft4.String: MaxLengthInvalid :: MaxLength -> Text -> MaxLengthInvalid
- Data.Validator.Draft4.String: MinLength :: Int -> MinLength
- Data.Validator.Draft4.String: MinLengthInvalid :: MinLength -> Text -> MinLengthInvalid
- Data.Validator.Draft4.String: PatternInvalid :: PatternValidator -> Text -> PatternInvalid
- Data.Validator.Draft4.String: PatternNotRegex :: PatternInvalid
- Data.Validator.Draft4.String: PatternValidator :: Text -> PatternValidator
- Data.Validator.Draft4.String: [_unMaxLength] :: MaxLength -> Int
- Data.Validator.Draft4.String: [_unMinLength] :: MinLength -> Int
- Data.Validator.Draft4.String: [_unPatternValidator] :: PatternValidator -> Text
- Data.Validator.Draft4.String: data MaxLengthInvalid
- Data.Validator.Draft4.String: data MinLengthInvalid
- Data.Validator.Draft4.String: data PatternInvalid
- Data.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.String.MaxLength
- Data.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.String.MinLength
- Data.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON Data.Validator.Draft4.String.PatternValidator
- Data.Validator.Draft4.String: instance GHC.Classes.Eq Data.Validator.Draft4.String.MaxLength
- Data.Validator.Draft4.String: instance GHC.Classes.Eq Data.Validator.Draft4.String.MaxLengthInvalid
- Data.Validator.Draft4.String: instance GHC.Classes.Eq Data.Validator.Draft4.String.MinLength
- Data.Validator.Draft4.String: instance GHC.Classes.Eq Data.Validator.Draft4.String.MinLengthInvalid
- Data.Validator.Draft4.String: instance GHC.Classes.Eq Data.Validator.Draft4.String.PatternInvalid
- Data.Validator.Draft4.String: instance GHC.Classes.Eq Data.Validator.Draft4.String.PatternValidator
- Data.Validator.Draft4.String: instance GHC.Show.Show Data.Validator.Draft4.String.MaxLength
- Data.Validator.Draft4.String: instance GHC.Show.Show Data.Validator.Draft4.String.MaxLengthInvalid
- Data.Validator.Draft4.String: instance GHC.Show.Show Data.Validator.Draft4.String.MinLength
- Data.Validator.Draft4.String: instance GHC.Show.Show Data.Validator.Draft4.String.MinLengthInvalid
- Data.Validator.Draft4.String: instance GHC.Show.Show Data.Validator.Draft4.String.PatternInvalid
- Data.Validator.Draft4.String: instance GHC.Show.Show Data.Validator.Draft4.String.PatternValidator
- Data.Validator.Draft4.String: maxLengthVal :: MaxLength -> Text -> Maybe MaxLengthInvalid
- Data.Validator.Draft4.String: minLengthVal :: MinLength -> Text -> Maybe MinLengthInvalid
- Data.Validator.Draft4.String: newtype MaxLength
- Data.Validator.Draft4.String: newtype MinLength
- Data.Validator.Draft4.String: newtype PatternValidator
- Data.Validator.Draft4.String: patternVal :: PatternValidator -> Text -> Maybe PatternInvalid
- Data.Validator.Reference: baseAndFragment :: Text -> URIBaseAndFragment
- Data.Validator.Reference: isRemoteReference :: Text -> Bool
- Data.Validator.Reference: resolveFragment :: (FromJSON schema, ToJSON schema) => Maybe Text -> schema -> Maybe schema
- Data.Validator.Reference: resolveReference :: URIBase -> Text -> URIBaseAndFragment
- Data.Validator.Reference: resolveScopeAgainst :: Maybe Text -> Text -> Text
- Data.Validator.Reference: type URIBase = Maybe Text
- Data.Validator.Reference: type URIBaseAndFragment = (Maybe Text, Maybe Text)
- Data.Validator.Reference: updateResolutionScope :: URIBase -> Maybe Text -> URIBase
- Data.Validator.Types: Validator :: (val -> ([schema], [schema])) -> (val -> Value -> [err]) -> Validator schema val err
- Data.Validator.Types: [_embedded] :: Validator schema val err -> val -> ([schema], [schema])
- Data.Validator.Types: [_validate] :: Validator schema val err -> val -> Value -> [err]
- Data.Validator.Types: data Validator schema val err
- Data.Validator.Types: instance Data.Profunctor.Unsafe.Profunctor (Data.Validator.Types.Validator schema)
- Data.Validator.Types: instance GHC.Base.Functor (Data.Validator.Types.Validator schema val)
- Data.Validator.Utils: ArbitraryValue :: Value -> ArbitraryValue
- Data.Validator.Utils: NonEmpty' :: NonEmpty a -> NonEmpty' a
- Data.Validator.Utils: OrdValue :: Value -> OrdValue
- Data.Validator.Utils: [_unArbitraryValue] :: ArbitraryValue -> Value
- Data.Validator.Utils: [_unNonEmpty'] :: NonEmpty' a -> NonEmpty a
- Data.Validator.Utils: [_unOrdValue] :: OrdValue -> Value
- Data.Validator.Utils: allUnique :: (Ord a) => [a] -> Bool
- Data.Validator.Utils: allUniqueValues :: Vector Value -> Bool
- Data.Validator.Utils: allUniqueValues' :: NonEmpty Value -> Bool
- Data.Validator.Utils: arbitraryHashMap :: Arbitrary a => Gen (HashMap Text a)
- Data.Validator.Utils: arbitraryPositiveScientific :: Gen Scientific
- Data.Validator.Utils: arbitraryScientific :: Gen Scientific
- Data.Validator.Utils: arbitrarySetOfText :: Gen (Set Text)
- Data.Validator.Utils: arbitraryText :: Gen Text
- Data.Validator.Utils: fromJSONEither :: FromJSON a => Value -> Either Text a
- Data.Validator.Utils: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Data.Validator.Utils.NonEmpty' a)
- Data.Validator.Utils: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.Validator.Utils.NonEmpty' a)
- Data.Validator.Utils: instance GHC.Classes.Eq Data.Validator.Utils.ArbitraryValue
- Data.Validator.Utils: instance GHC.Classes.Eq Data.Validator.Utils.OrdValue
- Data.Validator.Utils: instance GHC.Classes.Ord Data.Validator.Utils.OrdValue
- Data.Validator.Utils: instance GHC.Show.Show Data.Validator.Utils.ArbitraryValue
- Data.Validator.Utils: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Validator.Utils.ArbitraryValue
- Data.Validator.Utils: instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (Data.Validator.Utils.NonEmpty' a)
- Data.Validator.Utils: newtype ArbitraryValue
- Data.Validator.Utils: newtype NonEmpty' a
- Data.Validator.Utils: newtype OrdValue
+ JSONSchema.Draft4: FSParseFailure :: Text -> FilesystemFailure
+ JSONSchema.Draft4: FSReadFailure :: IOException -> FilesystemFailure
+ JSONSchema.Draft4: FVData :: Invalid -> FilesystemValidationFailure
+ JSONSchema.Draft4: FVRead :: FilesystemFailure -> FilesystemValidationFailure
+ JSONSchema.Draft4: FVSchema :: SchemaInvalid -> FilesystemValidationFailure
+ JSONSchema.Draft4: FailureAdditionalItems :: (AdditionalItemsInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureAllOf :: (AllOfInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureAnyOf :: (AnyOfInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureDependencies :: (DependenciesInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureEnum :: EnumInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureItems :: (ItemsInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureMaxItems :: MaxItemsInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMaxLength :: MaxLengthInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMaxProperties :: MaxPropertiesInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMaximum :: MaximumInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMinItems :: MinItemsInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMinLength :: MinLengthInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMinProperties :: MinPropertiesInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMinimum :: MinimumInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureMultipleOf :: MultipleOfInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureNot :: NotValidatorInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureOneOf :: (OneOfInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailurePattern :: PatternInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailurePropertiesRelated :: (PropertiesRelatedInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureRef :: (RefInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4: FailureRequired :: () -> ValidatorFailure
+ JSONSchema.Draft4: FailureType :: TypeValidatorInvalid -> ValidatorFailure
+ JSONSchema.Draft4: FailureUniqueItems :: UniqueItemsInvalid -> ValidatorFailure
+ JSONSchema.Draft4: HTTPParseFailure :: Text -> HTTPFailure
+ JSONSchema.Draft4: HTTPRequestFailure :: HttpException -> HTTPFailure
+ JSONSchema.Draft4: HVData :: Invalid -> HTTPValidationFailure
+ JSONSchema.Draft4: HVRequest :: HTTPFailure -> HTTPValidationFailure
+ JSONSchema.Draft4: HVSchema :: SchemaInvalid -> HTTPValidationFailure
+ JSONSchema.Draft4: Invalid :: Schema -> Value -> NonEmpty ValidatorFailure -> Invalid
+ JSONSchema.Draft4: ReferencedSchemas :: !schema -> !(HashMap Text schema) -> ReferencedSchemas schema
+ JSONSchema.Draft4: Schema :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe (HashMap Text Schema) -> HashMap Text Value -> Maybe Scientific -> Maybe Scientific -> Maybe Bool -> Maybe Scientific -> Maybe Bool -> Maybe Int -> Maybe Int -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Bool -> Maybe (Items Schema) -> Maybe (AdditionalItems Schema) -> Maybe Int -> Maybe Int -> Maybe (Set Text) -> Maybe (HashMap Text (Dependency Schema)) -> Maybe (HashMap Text Schema) -> Maybe (HashMap Text Schema) -> Maybe (AdditionalProperties Schema) -> Maybe (NonEmpty Value) -> Maybe TypeValidator -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe Schema -> Schema
+ JSONSchema.Draft4: SchemaInvalid :: NonEmpty (Maybe Text, NonEmpty ValidatorFailure) -> SchemaInvalid
+ JSONSchema.Draft4: SchemaWithURI :: !schema -> !(Maybe Text) -> SchemaWithURI schema
+ JSONSchema.Draft4: URISchemaMap :: HashMap Text schema -> URISchemaMap schema
+ JSONSchema.Draft4: [_invalidFailures] :: Invalid -> NonEmpty ValidatorFailure
+ JSONSchema.Draft4: [_invalidInstance] :: Invalid -> Value
+ JSONSchema.Draft4: [_invalidSchema] :: Invalid -> Schema
+ JSONSchema.Draft4: [_rsSchemaMap] :: ReferencedSchemas schema -> !(HashMap Text schema)
+ JSONSchema.Draft4: [_rsStarting] :: ReferencedSchemas schema -> !schema
+ JSONSchema.Draft4: [_schemaAdditionalItems] :: Schema -> Maybe (AdditionalItems Schema)
+ JSONSchema.Draft4: [_schemaAdditionalProperties] :: Schema -> Maybe (AdditionalProperties Schema)
+ JSONSchema.Draft4: [_schemaAllOf] :: Schema -> Maybe (NonEmpty Schema)
+ JSONSchema.Draft4: [_schemaAnyOf] :: Schema -> Maybe (NonEmpty Schema)
+ JSONSchema.Draft4: [_schemaDefinitions] :: Schema -> Maybe (HashMap Text Schema)
+ JSONSchema.Draft4: [_schemaDependencies] :: Schema -> Maybe (HashMap Text (Dependency Schema))
+ JSONSchema.Draft4: [_schemaEnum] :: Schema -> Maybe (NonEmpty Value)
+ JSONSchema.Draft4: [_schemaExclusiveMaximum] :: Schema -> Maybe Bool
+ JSONSchema.Draft4: [_schemaExclusiveMinimum] :: Schema -> Maybe Bool
+ JSONSchema.Draft4: [_schemaId] :: Schema -> Maybe Text
+ JSONSchema.Draft4: [_schemaItems] :: Schema -> Maybe (Items Schema)
+ JSONSchema.Draft4: [_schemaMaxItems] :: Schema -> Maybe Int
+ JSONSchema.Draft4: [_schemaMaxLength] :: Schema -> Maybe Int
+ JSONSchema.Draft4: [_schemaMaxProperties] :: Schema -> Maybe Int
+ JSONSchema.Draft4: [_schemaMaximum] :: Schema -> Maybe Scientific
+ JSONSchema.Draft4: [_schemaMinItems] :: Schema -> Maybe Int
+ JSONSchema.Draft4: [_schemaMinLength] :: Schema -> Maybe Int
+ JSONSchema.Draft4: [_schemaMinProperties] :: Schema -> Maybe Int
+ JSONSchema.Draft4: [_schemaMinimum] :: Schema -> Maybe Scientific
+ JSONSchema.Draft4: [_schemaMultipleOf] :: Schema -> Maybe Scientific
+ JSONSchema.Draft4: [_schemaNot] :: Schema -> Maybe Schema
+ JSONSchema.Draft4: [_schemaOneOf] :: Schema -> Maybe (NonEmpty Schema)
+ JSONSchema.Draft4: [_schemaOther] :: Schema -> HashMap Text Value
+ JSONSchema.Draft4: [_schemaPatternProperties] :: Schema -> Maybe (HashMap Text Schema)
+ JSONSchema.Draft4: [_schemaPattern] :: Schema -> Maybe Text
+ JSONSchema.Draft4: [_schemaProperties] :: Schema -> Maybe (HashMap Text Schema)
+ JSONSchema.Draft4: [_schemaRef] :: Schema -> Maybe Text
+ JSONSchema.Draft4: [_schemaRequired] :: Schema -> Maybe (Set Text)
+ JSONSchema.Draft4: [_schemaType] :: Schema -> Maybe TypeValidator
+ JSONSchema.Draft4: [_schemaUniqueItems] :: Schema -> Maybe Bool
+ JSONSchema.Draft4: [_schemaVersion] :: Schema -> Maybe Text
+ JSONSchema.Draft4: [_swSchema] :: SchemaWithURI schema -> !schema
+ JSONSchema.Draft4: [_swURI] :: SchemaWithURI schema -> !(Maybe Text)
+ JSONSchema.Draft4: [_unSchemaInvalid] :: SchemaInvalid -> NonEmpty (Maybe Text, NonEmpty ValidatorFailure)
+ JSONSchema.Draft4: [_unURISchemaMap] :: URISchemaMap schema -> HashMap Text schema
+ JSONSchema.Draft4: checkSchema :: URISchemaMap Schema -> SchemaWithURI Schema -> Either SchemaInvalid (Value -> [ValidatorFailure])
+ JSONSchema.Draft4: data FilesystemFailure
+ JSONSchema.Draft4: data FilesystemValidationFailure
+ JSONSchema.Draft4: data HTTPFailure
+ JSONSchema.Draft4: data HTTPValidationFailure
+ JSONSchema.Draft4: data Invalid
+ JSONSchema.Draft4: data ReferencedSchemas schema
+ JSONSchema.Draft4: data Schema
+ JSONSchema.Draft4: data SchemaWithURI schema
+ JSONSchema.Draft4: data ValidatorFailure
+ JSONSchema.Draft4: draft4FetchInfo :: FetchInfo Schema
+ JSONSchema.Draft4: emptySchema :: Schema
+ JSONSchema.Draft4: fetchFilesystemAndValidate :: SchemaWithURI Schema -> Value -> IO (Either FilesystemValidationFailure ())
+ JSONSchema.Draft4: fetchHTTPAndValidate :: SchemaWithURI Schema -> Value -> IO (Either HTTPValidationFailure ())
+ JSONSchema.Draft4: instance GHC.Classes.Eq JSONSchema.Draft4.FilesystemValidationFailure
+ JSONSchema.Draft4: instance GHC.Show.Show JSONSchema.Draft4.FilesystemValidationFailure
+ JSONSchema.Draft4: instance GHC.Show.Show JSONSchema.Draft4.HTTPValidationFailure
+ JSONSchema.Draft4: metaSchema :: Schema
+ JSONSchema.Draft4: metaSchemaBytes :: ByteString
+ JSONSchema.Draft4: newtype SchemaInvalid
+ JSONSchema.Draft4: newtype URISchemaMap schema
+ JSONSchema.Draft4: referencesValidity :: URISchemaMap Schema -> [(Text, NonEmpty ValidatorFailure)]
+ JSONSchema.Draft4: referencesViaFilesystem :: SchemaWithURI Schema -> IO (Either FilesystemFailure (URISchemaMap Schema))
+ JSONSchema.Draft4: referencesViaHTTP :: SchemaWithURI Schema -> IO (Either HTTPFailure (URISchemaMap Schema))
+ JSONSchema.Draft4: schemaValidity :: Schema -> [ValidatorFailure]
+ JSONSchema.Draft4.Failure: FailureAdditionalItems :: (AdditionalItemsInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureAllOf :: (AllOfInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureAnyOf :: (AnyOfInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureDependencies :: (DependenciesInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureEnum :: EnumInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureItems :: (ItemsInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMaxItems :: MaxItemsInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMaxLength :: MaxLengthInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMaxProperties :: MaxPropertiesInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMaximum :: MaximumInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMinItems :: MinItemsInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMinLength :: MinLengthInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMinProperties :: MinPropertiesInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMinimum :: MinimumInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureMultipleOf :: MultipleOfInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureNot :: NotValidatorInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureOneOf :: (OneOfInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailurePattern :: PatternInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailurePropertiesRelated :: (PropertiesRelatedInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureRef :: (RefInvalid ValidatorFailure) -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureRequired :: () -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureType :: TypeValidatorInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: FailureUniqueItems :: UniqueItemsInvalid -> ValidatorFailure
+ JSONSchema.Draft4.Failure: Invalid :: Schema -> Value -> NonEmpty ValidatorFailure -> Invalid
+ JSONSchema.Draft4.Failure: SchemaInvalid :: NonEmpty (Maybe Text, NonEmpty ValidatorFailure) -> SchemaInvalid
+ JSONSchema.Draft4.Failure: [_invalidFailures] :: Invalid -> NonEmpty ValidatorFailure
+ JSONSchema.Draft4.Failure: [_invalidInstance] :: Invalid -> Value
+ JSONSchema.Draft4.Failure: [_invalidSchema] :: Invalid -> Schema
+ JSONSchema.Draft4.Failure: [_unSchemaInvalid] :: SchemaInvalid -> NonEmpty (Maybe Text, NonEmpty ValidatorFailure)
+ JSONSchema.Draft4.Failure: data Invalid
+ JSONSchema.Draft4.Failure: data ValidatorFailure
+ JSONSchema.Draft4.Failure: instance GHC.Classes.Eq JSONSchema.Draft4.Failure.Invalid
+ JSONSchema.Draft4.Failure: instance GHC.Classes.Eq JSONSchema.Draft4.Failure.SchemaInvalid
+ JSONSchema.Draft4.Failure: instance GHC.Classes.Eq JSONSchema.Draft4.Failure.ValidatorFailure
+ JSONSchema.Draft4.Failure: instance GHC.Show.Show JSONSchema.Draft4.Failure.Invalid
+ JSONSchema.Draft4.Failure: instance GHC.Show.Show JSONSchema.Draft4.Failure.SchemaInvalid
+ JSONSchema.Draft4.Failure: instance GHC.Show.Show JSONSchema.Draft4.Failure.ValidatorFailure
+ JSONSchema.Draft4.Failure: newtype SchemaInvalid
+ JSONSchema.Draft4.Schema: Schema :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe (HashMap Text Schema) -> HashMap Text Value -> Maybe Scientific -> Maybe Scientific -> Maybe Bool -> Maybe Scientific -> Maybe Bool -> Maybe Int -> Maybe Int -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Bool -> Maybe (Items Schema) -> Maybe (AdditionalItems Schema) -> Maybe Int -> Maybe Int -> Maybe (Set Text) -> Maybe (HashMap Text (Dependency Schema)) -> Maybe (HashMap Text Schema) -> Maybe (HashMap Text Schema) -> Maybe (AdditionalProperties Schema) -> Maybe (NonEmpty Value) -> Maybe TypeValidator -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe (NonEmpty Schema) -> Maybe Schema -> Schema
+ JSONSchema.Draft4.Schema: [_schemaAdditionalItems] :: Schema -> Maybe (AdditionalItems Schema)
+ JSONSchema.Draft4.Schema: [_schemaAdditionalProperties] :: Schema -> Maybe (AdditionalProperties Schema)
+ JSONSchema.Draft4.Schema: [_schemaAllOf] :: Schema -> Maybe (NonEmpty Schema)
+ JSONSchema.Draft4.Schema: [_schemaAnyOf] :: Schema -> Maybe (NonEmpty Schema)
+ JSONSchema.Draft4.Schema: [_schemaDefinitions] :: Schema -> Maybe (HashMap Text Schema)
+ JSONSchema.Draft4.Schema: [_schemaDependencies] :: Schema -> Maybe (HashMap Text (Dependency Schema))
+ JSONSchema.Draft4.Schema: [_schemaEnum] :: Schema -> Maybe (NonEmpty Value)
+ JSONSchema.Draft4.Schema: [_schemaExclusiveMaximum] :: Schema -> Maybe Bool
+ JSONSchema.Draft4.Schema: [_schemaExclusiveMinimum] :: Schema -> Maybe Bool
+ JSONSchema.Draft4.Schema: [_schemaId] :: Schema -> Maybe Text
+ JSONSchema.Draft4.Schema: [_schemaItems] :: Schema -> Maybe (Items Schema)
+ JSONSchema.Draft4.Schema: [_schemaMaxItems] :: Schema -> Maybe Int
+ JSONSchema.Draft4.Schema: [_schemaMaxLength] :: Schema -> Maybe Int
+ JSONSchema.Draft4.Schema: [_schemaMaxProperties] :: Schema -> Maybe Int
+ JSONSchema.Draft4.Schema: [_schemaMaximum] :: Schema -> Maybe Scientific
+ JSONSchema.Draft4.Schema: [_schemaMinItems] :: Schema -> Maybe Int
+ JSONSchema.Draft4.Schema: [_schemaMinLength] :: Schema -> Maybe Int
+ JSONSchema.Draft4.Schema: [_schemaMinProperties] :: Schema -> Maybe Int
+ JSONSchema.Draft4.Schema: [_schemaMinimum] :: Schema -> Maybe Scientific
+ JSONSchema.Draft4.Schema: [_schemaMultipleOf] :: Schema -> Maybe Scientific
+ JSONSchema.Draft4.Schema: [_schemaNot] :: Schema -> Maybe Schema
+ JSONSchema.Draft4.Schema: [_schemaOneOf] :: Schema -> Maybe (NonEmpty Schema)
+ JSONSchema.Draft4.Schema: [_schemaOther] :: Schema -> HashMap Text Value
+ JSONSchema.Draft4.Schema: [_schemaPatternProperties] :: Schema -> Maybe (HashMap Text Schema)
+ JSONSchema.Draft4.Schema: [_schemaPattern] :: Schema -> Maybe Text
+ JSONSchema.Draft4.Schema: [_schemaProperties] :: Schema -> Maybe (HashMap Text Schema)
+ JSONSchema.Draft4.Schema: [_schemaRef] :: Schema -> Maybe Text
+ JSONSchema.Draft4.Schema: [_schemaRequired] :: Schema -> Maybe (Set Text)
+ JSONSchema.Draft4.Schema: [_schemaType] :: Schema -> Maybe TypeValidator
+ JSONSchema.Draft4.Schema: [_schemaUniqueItems] :: Schema -> Maybe Bool
+ JSONSchema.Draft4.Schema: [_schemaVersion] :: Schema -> Maybe Text
+ JSONSchema.Draft4.Schema: data Schema
+ JSONSchema.Draft4.Schema: emptySchema :: Schema
+ JSONSchema.Draft4.Schema: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Draft4.Schema: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Draft4.Schema: instance GHC.Classes.Eq JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Draft4.Schema: instance GHC.Show.Show JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Draft4.Schema: instance Test.QuickCheck.Arbitrary.Arbitrary JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Draft4.Schema: internalSchemaHashMap :: HashMap Text (Schema -> Maybe Value)
+ JSONSchema.Draft4.Spec: continueValidating :: ReferencedSchemas Schema -> VisitedSchemas -> SchemaWithURI Schema -> Value -> [ValidatorFailure]
+ JSONSchema.Draft4.Spec: d4Spec :: ReferencedSchemas Schema -> VisitedSchemas -> Maybe Text -> Spec Schema ValidatorFailure
+ JSONSchema.Draft4.Spec: embedded :: Schema -> ([Schema], [Schema])
+ JSONSchema.Draft4.Spec: specValidate :: ReferencedSchemas Schema -> SchemaWithURI Schema -> Value -> [ValidatorFailure]
+ JSONSchema.Fetch: FSParseFailure :: Text -> FilesystemFailure
+ JSONSchema.Fetch: FSReadFailure :: IOException -> FilesystemFailure
+ JSONSchema.Fetch: FetchInfo :: (schema -> ([schema], [schema])) -> (schema -> Maybe Text) -> (schema -> Maybe Text) -> FetchInfo schema
+ JSONSchema.Fetch: HTTPParseFailure :: Text -> HTTPFailure
+ JSONSchema.Fetch: HTTPRequestFailure :: HttpException -> HTTPFailure
+ JSONSchema.Fetch: ReferencedSchemas :: !schema -> !(HashMap Text schema) -> ReferencedSchemas schema
+ JSONSchema.Fetch: SchemaWithURI :: !schema -> !(Maybe Text) -> SchemaWithURI schema
+ JSONSchema.Fetch: URISchemaMap :: HashMap Text schema -> URISchemaMap schema
+ JSONSchema.Fetch: [_fiEmbedded] :: FetchInfo schema -> schema -> ([schema], [schema])
+ JSONSchema.Fetch: [_fiId] :: FetchInfo schema -> schema -> Maybe Text
+ JSONSchema.Fetch: [_fiRef] :: FetchInfo schema -> schema -> Maybe Text
+ JSONSchema.Fetch: [_rsSchemaMap] :: ReferencedSchemas schema -> !(HashMap Text schema)
+ JSONSchema.Fetch: [_rsStarting] :: ReferencedSchemas schema -> !schema
+ JSONSchema.Fetch: [_swSchema] :: SchemaWithURI schema -> !schema
+ JSONSchema.Fetch: [_swURI] :: SchemaWithURI schema -> !(Maybe Text)
+ JSONSchema.Fetch: [_unURISchemaMap] :: URISchemaMap schema -> HashMap Text schema
+ JSONSchema.Fetch: data FetchInfo schema
+ JSONSchema.Fetch: data FilesystemFailure
+ JSONSchema.Fetch: data HTTPFailure
+ JSONSchema.Fetch: data ReferencedSchemas schema
+ JSONSchema.Fetch: data SchemaWithURI schema
+ JSONSchema.Fetch: getRecursiveReferences :: forall schema. FromJSON schema => (Text -> IO ByteString) -> FetchInfo schema -> URISchemaMap schema -> SchemaWithURI schema -> IO (Either Text (URISchemaMap schema))
+ JSONSchema.Fetch: getReference :: ReferencedSchemas schema -> Maybe Text -> Maybe schema
+ JSONSchema.Fetch: includeSubschemas :: forall schema. FetchInfo schema -> SchemaWithURI schema -> [SchemaWithURI schema]
+ JSONSchema.Fetch: instance GHC.Classes.Eq JSONSchema.Fetch.FilesystemFailure
+ JSONSchema.Fetch: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Fetch.ReferencedSchemas schema)
+ JSONSchema.Fetch: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Fetch.SchemaWithURI schema)
+ JSONSchema.Fetch: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Fetch.URISchemaMap schema)
+ JSONSchema.Fetch: instance GHC.Show.Show JSONSchema.Fetch.FilesystemFailure
+ JSONSchema.Fetch: instance GHC.Show.Show JSONSchema.Fetch.HTTPFailure
+ JSONSchema.Fetch: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Fetch.ReferencedSchemas schema)
+ JSONSchema.Fetch: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Fetch.SchemaWithURI schema)
+ JSONSchema.Fetch: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Fetch.URISchemaMap schema)
+ JSONSchema.Fetch: newtype URISchemaMap schema
+ JSONSchema.Fetch: referencesMethodAgnostic :: forall schema. FromJSON schema => (Text -> IO ByteString) -> FetchInfo schema -> SchemaWithURI schema -> IO (Either Text (URISchemaMap schema))
+ JSONSchema.Fetch: referencesViaFilesystem' :: forall schema. FromJSON schema => FetchInfo schema -> SchemaWithURI schema -> IO (Either FilesystemFailure (URISchemaMap schema))
+ JSONSchema.Fetch: referencesViaHTTP' :: forall schema. FromJSON schema => FetchInfo schema -> SchemaWithURI schema -> IO (Either HTTPFailure (URISchemaMap schema))
+ JSONSchema.Types: Schema :: HashMap Text Value -> Schema
+ JSONSchema.Types: Spec :: [Validator schema schema err] -> Spec schema err
+ JSONSchema.Types: [_unSchema] :: Schema -> HashMap Text Value
+ JSONSchema.Types: [_unSpec] :: Spec schema err -> [Validator schema schema err]
+ JSONSchema.Types: embedded :: Spec schema a -> schema -> ([schema], [schema])
+ JSONSchema.Types: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Types.Schema
+ JSONSchema.Types: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Types.Schema
+ JSONSchema.Types: instance GHC.Classes.Eq JSONSchema.Types.Schema
+ JSONSchema.Types: instance GHC.Show.Show JSONSchema.Types.Schema
+ JSONSchema.Types: newtype Schema
+ JSONSchema.Types: newtype Spec schema err
+ JSONSchema.Types: validate :: Spec schema err -> schema -> Value -> [err]
+ JSONSchema.Validator.Draft4: Definitions :: HashMap Text schema -> Definitions schema
+ JSONSchema.Validator.Draft4: [_unDefinitions] :: Definitions schema -> HashMap Text schema
+ JSONSchema.Validator.Draft4: allOfValidator :: (schema -> Value -> [err]) -> Validator schema (Maybe (AllOf schema)) (AllOfInvalid err)
+ JSONSchema.Validator.Draft4: anyOfValidator :: (schema -> Value -> [err]) -> Validator schema (Maybe (AnyOf schema)) (AnyOfInvalid err)
+ JSONSchema.Validator.Draft4: definitionsEmbedded :: Validator schema (Maybe (Definitions schema)) err
+ JSONSchema.Validator.Draft4: dependenciesValidator :: (schema -> Value -> [err]) -> Validator schema (Maybe (DependenciesValidator schema)) (DependenciesInvalid err)
+ JSONSchema.Validator.Draft4: enumValidator :: Validator a (Maybe EnumValidator) EnumInvalid
+ JSONSchema.Validator.Draft4: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Definitions schema)
+ JSONSchema.Validator.Draft4: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Definitions schema)
+ JSONSchema.Validator.Draft4: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Definitions schema)
+ JSONSchema.Validator.Draft4: itemsRelatedValidator :: (schema -> Value -> [err]) -> Validator schema (ItemsRelated schema) (ItemsRelatedInvalid err)
+ JSONSchema.Validator.Draft4: maxItemsValidator :: Validator a (Maybe MaxItems) MaxItemsInvalid
+ JSONSchema.Validator.Draft4: maxLengthValidator :: Validator a (Maybe MaxLength) MaxLengthInvalid
+ JSONSchema.Validator.Draft4: maxPropertiesValidator :: Validator a (Maybe MaxProperties) MaxPropertiesInvalid
+ JSONSchema.Validator.Draft4: maximumValidator :: Validator a (Maybe Maximum) MaximumInvalid
+ JSONSchema.Validator.Draft4: minItemsValidator :: Validator a (Maybe MinItems) MinItemsInvalid
+ JSONSchema.Validator.Draft4: minLengthValidator :: Validator a (Maybe MinLength) MinLengthInvalid
+ JSONSchema.Validator.Draft4: minPropertiesValidator :: Validator a (Maybe MinProperties) MinPropertiesInvalid
+ JSONSchema.Validator.Draft4: minimumValidator :: Validator a (Maybe Minimum) MinimumInvalid
+ JSONSchema.Validator.Draft4: multipleOfValidator :: Validator a (Maybe MultipleOf) MultipleOfInvalid
+ JSONSchema.Validator.Draft4: newtype Definitions schema
+ JSONSchema.Validator.Draft4: noEmbedded :: a -> ([b], [b])
+ JSONSchema.Validator.Draft4: notValidator :: ToJSON schema => (schema -> Value -> [err]) -> Validator schema (Maybe (NotValidator schema)) NotValidatorInvalid
+ JSONSchema.Validator.Draft4: oneOfValidator :: ToJSON schema => (schema -> Value -> [err]) -> Validator schema (Maybe (OneOf schema)) (OneOfInvalid err)
+ JSONSchema.Validator.Draft4: patternValidator :: Validator a (Maybe PatternValidator) PatternInvalid
+ JSONSchema.Validator.Draft4: propertiesRelatedValidator :: (schema -> Value -> [err]) -> Validator schema (PropertiesRelated schema) (PropertiesRelatedInvalid err)
+ JSONSchema.Validator.Draft4: refValidator :: (FromJSON schema, ToJSON schema) => VisitedSchemas -> Maybe Text -> (Maybe Text -> Maybe schema) -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err]) -> Validator a (Maybe Ref) (RefInvalid err)
+ JSONSchema.Validator.Draft4: requiredValidator :: Validator a (Maybe Required) ()
+ JSONSchema.Validator.Draft4: run :: FromJSON b => (a -> b -> Maybe c) -> Maybe a -> Value -> [c]
+ JSONSchema.Validator.Draft4: typeValidator :: Validator a (Maybe TypeContext) TypeValidatorInvalid
+ JSONSchema.Validator.Draft4: uniqueItemsValidator :: Validator a (Maybe UniqueItems) UniqueItemsInvalid
+ JSONSchema.Validator.Draft4.Any: AllOf :: NonEmpty schema -> AllOf schema
+ JSONSchema.Validator.Draft4.Any: AllOfInvalid :: (NonEmpty (Index, NonEmpty err)) -> AllOfInvalid err
+ JSONSchema.Validator.Draft4.Any: AnyOf :: NonEmpty schema -> AnyOf schema
+ JSONSchema.Validator.Draft4.Any: AnyOfInvalid :: (NonEmpty (Index, NonEmpty err)) -> AnyOfInvalid err
+ JSONSchema.Validator.Draft4.Any: EnumInvalid :: EnumValidator -> Value -> EnumInvalid
+ JSONSchema.Validator.Draft4.Any: EnumValidator :: NonEmpty Value -> EnumValidator
+ JSONSchema.Validator.Draft4.Any: NoSuccesses :: (NonEmpty (Index, NonEmpty err)) -> Value -> OneOfInvalid err
+ JSONSchema.Validator.Draft4.Any: NotValidator :: schema -> NotValidator schema
+ JSONSchema.Validator.Draft4.Any: NotValidatorInvalid :: Value -> Value -> NotValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: OneOf :: NonEmpty schema -> OneOf schema
+ JSONSchema.Validator.Draft4.Any: Ref :: Text -> Ref
+ JSONSchema.Validator.Draft4.Any: RefInvalid :: Text -> Value -> (NonEmpty err) -> RefInvalid err
+ JSONSchema.Validator.Draft4.Any: RefLoop :: Text -> VisitedSchemas -> URIBaseAndFragment -> RefInvalid err
+ JSONSchema.Validator.Draft4.Any: RefPointerResolution :: Text -> RefInvalid err
+ JSONSchema.Validator.Draft4.Any: RefResolution :: Text -> RefInvalid err
+ JSONSchema.Validator.Draft4.Any: TooManySuccesses :: (NonEmpty (Index, Value)) -> Value -> OneOfInvalid err
+ JSONSchema.Validator.Draft4.Any: TypeContext :: TypeValidator -> TypeContext
+ JSONSchema.Validator.Draft4.Any: TypeValidatorArray :: (Set Text) -> TypeValidator
+ JSONSchema.Validator.Draft4.Any: TypeValidatorInvalid :: TypeValidator -> Value -> TypeValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: TypeValidatorString :: Text -> TypeValidator
+ JSONSchema.Validator.Draft4.Any: VisitedSchemas :: [URIBaseAndFragment] -> VisitedSchemas
+ JSONSchema.Validator.Draft4.Any: [_unAllOf] :: AllOf schema -> NonEmpty schema
+ JSONSchema.Validator.Draft4.Any: [_unAnyOf] :: AnyOf schema -> NonEmpty schema
+ JSONSchema.Validator.Draft4.Any: [_unEnumValidator] :: EnumValidator -> NonEmpty Value
+ JSONSchema.Validator.Draft4.Any: [_unNotValidator] :: NotValidator schema -> schema
+ JSONSchema.Validator.Draft4.Any: [_unOneOf] :: OneOf schema -> NonEmpty schema
+ JSONSchema.Validator.Draft4.Any: [_unRef] :: Ref -> Text
+ JSONSchema.Validator.Draft4.Any: [_unTypeContext] :: TypeContext -> TypeValidator
+ JSONSchema.Validator.Draft4.Any: [_unVisited] :: VisitedSchemas -> [URIBaseAndFragment]
+ JSONSchema.Validator.Draft4.Any: allOfVal :: forall err schema. (schema -> Value -> [err]) -> AllOf schema -> Value -> Maybe (AllOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: anyOfVal :: forall err schema. (schema -> Value -> [err]) -> AnyOf schema -> Value -> Maybe (AnyOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: data EnumInvalid
+ JSONSchema.Validator.Draft4.Any: data NotValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: data OneOfInvalid err
+ JSONSchema.Validator.Draft4.Any: data RefInvalid err
+ JSONSchema.Validator.Draft4.Any: data TypeValidator
+ JSONSchema.Validator.Draft4.Any: data TypeValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: enumVal :: EnumValidator -> Value -> Maybe EnumInvalid
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.EnumValidator
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.Ref
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.TypeContext
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.AllOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.AnyOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.NotValidator schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.OneOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: instance Data.Semigroup.Semigroup JSONSchema.Validator.Draft4.Any.VisitedSchemas
+ JSONSchema.Validator.Draft4.Any: instance GHC.Base.Monoid JSONSchema.Validator.Draft4.Any.VisitedSchemas
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.EnumInvalid
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.EnumValidator
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.NotValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.Ref
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.TypeContext
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.TypeValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Any.VisitedSchemas
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.AllOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.AnyOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.OneOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.RefInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.AllOf schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.AnyOf schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.NotValidator schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Any.OneOf schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.EnumInvalid
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.EnumValidator
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.NotValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.Ref
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.TypeContext
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.TypeValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show JSONSchema.Validator.Draft4.Any.VisitedSchemas
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.AllOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.AnyOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.OneOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.RefInvalid err)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.AllOf schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.AnyOf schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.NotValidator schema)
+ JSONSchema.Validator.Draft4.Any: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Any.OneOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Test.QuickCheck.Arbitrary.Arbitrary JSONSchema.Validator.Draft4.Any.EnumValidator
+ JSONSchema.Validator.Draft4.Any: instance Test.QuickCheck.Arbitrary.Arbitrary JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: newtype AllOf schema
+ JSONSchema.Validator.Draft4.Any: newtype AllOfInvalid err
+ JSONSchema.Validator.Draft4.Any: newtype AnyOf schema
+ JSONSchema.Validator.Draft4.Any: newtype AnyOfInvalid err
+ JSONSchema.Validator.Draft4.Any: newtype EnumValidator
+ JSONSchema.Validator.Draft4.Any: newtype NotValidator schema
+ JSONSchema.Validator.Draft4.Any: newtype OneOf schema
+ JSONSchema.Validator.Draft4.Any: newtype Ref
+ JSONSchema.Validator.Draft4.Any: newtype TypeContext
+ JSONSchema.Validator.Draft4.Any: newtype VisitedSchemas
+ JSONSchema.Validator.Draft4.Any: notVal :: ToJSON schema => (schema -> Value -> [err]) -> NotValidator schema -> Value -> Maybe NotValidatorInvalid
+ JSONSchema.Validator.Draft4.Any: oneOfVal :: forall err schema. ToJSON schema => (schema -> Value -> [err]) -> OneOf schema -> Value -> Maybe (OneOfInvalid err)
+ JSONSchema.Validator.Draft4.Any: refVal :: forall err schema. (FromJSON schema, ToJSON schema) => VisitedSchemas -> Maybe Text -> (Maybe Text -> Maybe schema) -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err]) -> Ref -> Value -> Maybe (RefInvalid err)
+ JSONSchema.Validator.Draft4.Any: setFromTypeValidator :: TypeValidator -> Set Text
+ JSONSchema.Validator.Draft4.Any: typeVal :: TypeContext -> Value -> Maybe TypeValidatorInvalid
+ JSONSchema.Validator.Draft4.Array: AdditionalBool :: Bool -> AdditionalItems schema
+ JSONSchema.Validator.Draft4.Array: AdditionalItemsBoolInvalid :: (NonEmpty (Index, Value)) -> AdditionalItemsInvalid err
+ JSONSchema.Validator.Draft4.Array: AdditionalItemsObjectInvalid :: (NonEmpty (Index, NonEmpty err)) -> AdditionalItemsInvalid err
+ JSONSchema.Validator.Draft4.Array: AdditionalObject :: schema -> AdditionalItems schema
+ JSONSchema.Validator.Draft4.Array: IRInvalidAdditional :: (AdditionalItemsInvalid err) -> ItemsRelatedInvalid err
+ JSONSchema.Validator.Draft4.Array: IRInvalidItems :: (ItemsInvalid err) -> ItemsRelatedInvalid err
+ JSONSchema.Validator.Draft4.Array: ItemsArray :: [schema] -> Items schema
+ JSONSchema.Validator.Draft4.Array: ItemsArrayInvalid :: (NonEmpty (Index, NonEmpty err)) -> ItemsInvalid err
+ JSONSchema.Validator.Draft4.Array: ItemsObject :: schema -> Items schema
+ JSONSchema.Validator.Draft4.Array: ItemsObjectInvalid :: (NonEmpty (Index, NonEmpty err)) -> ItemsInvalid err
+ JSONSchema.Validator.Draft4.Array: ItemsRelated :: Maybe (Items schema) -> Maybe (AdditionalItems schema) -> ItemsRelated schema
+ JSONSchema.Validator.Draft4.Array: MaxItems :: Int -> MaxItems
+ JSONSchema.Validator.Draft4.Array: MaxItemsInvalid :: MaxItems -> (Vector Value) -> MaxItemsInvalid
+ JSONSchema.Validator.Draft4.Array: MinItems :: Int -> MinItems
+ JSONSchema.Validator.Draft4.Array: MinItemsInvalid :: MinItems -> (Vector Value) -> MinItemsInvalid
+ JSONSchema.Validator.Draft4.Array: UniqueItems :: Bool -> UniqueItems
+ JSONSchema.Validator.Draft4.Array: UniqueItemsInvalid :: (Vector Value) -> UniqueItemsInvalid
+ JSONSchema.Validator.Draft4.Array: [_irAdditional] :: ItemsRelated schema -> Maybe (AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: [_irItems] :: ItemsRelated schema -> Maybe (Items schema)
+ JSONSchema.Validator.Draft4.Array: [_unMaxItems] :: MaxItems -> Int
+ JSONSchema.Validator.Draft4.Array: [_unMinItems] :: MinItems -> Int
+ JSONSchema.Validator.Draft4.Array: [_unUniqueItems] :: UniqueItems -> Bool
+ JSONSchema.Validator.Draft4.Array: additionalItemsVal :: forall err schema. (schema -> Value -> [err]) -> AdditionalItems schema -> [(Index, Value)] -> Maybe (AdditionalItemsInvalid err)
+ JSONSchema.Validator.Draft4.Array: data AdditionalItems schema
+ JSONSchema.Validator.Draft4.Array: data AdditionalItemsInvalid err
+ JSONSchema.Validator.Draft4.Array: data Items schema
+ JSONSchema.Validator.Draft4.Array: data ItemsInvalid err
+ JSONSchema.Validator.Draft4.Array: data ItemsRelated schema
+ JSONSchema.Validator.Draft4.Array: data ItemsRelatedInvalid err
+ JSONSchema.Validator.Draft4.Array: data MaxItemsInvalid
+ JSONSchema.Validator.Draft4.Array: data MinItemsInvalid
+ JSONSchema.Validator.Draft4.Array: data UniqueItemsInvalid
+ JSONSchema.Validator.Draft4.Array: emptyItems :: ItemsRelated schema
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Array.MaxItems
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Array.MinItems
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Array.UniqueItems
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Array.ItemsRelated schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Array.MaxItems
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Array.MaxItemsInvalid
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Array.MinItems
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Array.MinItemsInvalid
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Array.UniqueItems
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Array.UniqueItemsInvalid
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Array.AdditionalItemsInvalid err)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Array.ItemsInvalid err)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Array.ItemsRelatedInvalid err)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Array.ItemsRelated schema)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show JSONSchema.Validator.Draft4.Array.MaxItems
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show JSONSchema.Validator.Draft4.Array.MaxItemsInvalid
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show JSONSchema.Validator.Draft4.Array.MinItems
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show JSONSchema.Validator.Draft4.Array.MinItemsInvalid
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show JSONSchema.Validator.Draft4.Array.UniqueItems
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show JSONSchema.Validator.Draft4.Array.UniqueItemsInvalid
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Array.AdditionalItemsInvalid err)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Array.ItemsInvalid err)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Array.ItemsRelatedInvalid err)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Array: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Array.ItemsRelated schema)
+ JSONSchema.Validator.Draft4.Array: instance Test.QuickCheck.Arbitrary.Arbitrary schema => Test.QuickCheck.Arbitrary.Arbitrary (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance Test.QuickCheck.Arbitrary.Arbitrary schema => Test.QuickCheck.Arbitrary.Arbitrary (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Array: itemsRelatedVal :: forall err schema. (schema -> Value -> [err]) -> ItemsRelated schema -> Vector Value -> [ItemsRelatedInvalid err]
+ JSONSchema.Validator.Draft4.Array: itemsVal :: forall err schema. (schema -> Value -> [err]) -> Items schema -> Vector Value -> (Maybe (ItemsInvalid err), [(Index, Value)])
+ JSONSchema.Validator.Draft4.Array: maxItemsVal :: MaxItems -> Vector Value -> Maybe MaxItemsInvalid
+ JSONSchema.Validator.Draft4.Array: minItemsVal :: MinItems -> Vector Value -> Maybe MinItemsInvalid
+ JSONSchema.Validator.Draft4.Array: newtype MaxItems
+ JSONSchema.Validator.Draft4.Array: newtype MinItems
+ JSONSchema.Validator.Draft4.Array: newtype UniqueItems
+ JSONSchema.Validator.Draft4.Array: uniqueItemsVal :: UniqueItems -> Vector Value -> Maybe UniqueItemsInvalid
+ JSONSchema.Validator.Draft4.Number: Maximum :: Bool -> Scientific -> Maximum
+ JSONSchema.Validator.Draft4.Number: MaximumInvalid :: Maximum -> Scientific -> MaximumInvalid
+ JSONSchema.Validator.Draft4.Number: Minimum :: Bool -> Scientific -> Minimum
+ JSONSchema.Validator.Draft4.Number: MinimumInvalid :: Minimum -> Scientific -> MinimumInvalid
+ JSONSchema.Validator.Draft4.Number: MultipleOf :: Scientific -> MultipleOf
+ JSONSchema.Validator.Draft4.Number: MultipleOfInvalid :: MultipleOf -> Scientific -> MultipleOfInvalid
+ JSONSchema.Validator.Draft4.Number: [_maximumExclusive] :: Maximum -> Bool
+ JSONSchema.Validator.Draft4.Number: [_maximumValue] :: Maximum -> Scientific
+ JSONSchema.Validator.Draft4.Number: [_minimumExclusive] :: Minimum -> Bool
+ JSONSchema.Validator.Draft4.Number: [_minimumValue] :: Minimum -> Scientific
+ JSONSchema.Validator.Draft4.Number: [_unMultipleOf] :: MultipleOf -> Scientific
+ JSONSchema.Validator.Draft4.Number: data Maximum
+ JSONSchema.Validator.Draft4.Number: data MaximumInvalid
+ JSONSchema.Validator.Draft4.Number: data Minimum
+ JSONSchema.Validator.Draft4.Number: data MinimumInvalid
+ JSONSchema.Validator.Draft4.Number: data MultipleOfInvalid
+ JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Number.Maximum
+ JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Number.Minimum
+ JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Number.MultipleOf
+ JSONSchema.Validator.Draft4.Number: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Number.Maximum
+ JSONSchema.Validator.Draft4.Number: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Number.MaximumInvalid
+ JSONSchema.Validator.Draft4.Number: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Number.Minimum
+ JSONSchema.Validator.Draft4.Number: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Number.MinimumInvalid
+ JSONSchema.Validator.Draft4.Number: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Number.MultipleOf
+ JSONSchema.Validator.Draft4.Number: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Number.MultipleOfInvalid
+ JSONSchema.Validator.Draft4.Number: instance GHC.Show.Show JSONSchema.Validator.Draft4.Number.Maximum
+ JSONSchema.Validator.Draft4.Number: instance GHC.Show.Show JSONSchema.Validator.Draft4.Number.MaximumInvalid
+ JSONSchema.Validator.Draft4.Number: instance GHC.Show.Show JSONSchema.Validator.Draft4.Number.Minimum
+ JSONSchema.Validator.Draft4.Number: instance GHC.Show.Show JSONSchema.Validator.Draft4.Number.MinimumInvalid
+ JSONSchema.Validator.Draft4.Number: instance GHC.Show.Show JSONSchema.Validator.Draft4.Number.MultipleOf
+ JSONSchema.Validator.Draft4.Number: instance GHC.Show.Show JSONSchema.Validator.Draft4.Number.MultipleOfInvalid
+ JSONSchema.Validator.Draft4.Number: maximumVal :: Maximum -> Scientific -> Maybe MaximumInvalid
+ JSONSchema.Validator.Draft4.Number: minimumVal :: Minimum -> Scientific -> Maybe MinimumInvalid
+ JSONSchema.Validator.Draft4.Number: multipleOfVal :: MultipleOf -> Scientific -> Maybe MultipleOfInvalid
+ JSONSchema.Validator.Draft4.Number: newtype MultipleOf
+ JSONSchema.Validator.Draft4.Object: APBoolInvalid :: (HashMap Text Value) -> APInvalid err
+ JSONSchema.Validator.Draft4.Object: APObjectInvalid :: (HashMap Text (NonEmpty err)) -> APInvalid err
+ JSONSchema.Validator.Draft4.Object: AdditionalPropertiesBool :: Bool -> AdditionalProperties schema
+ JSONSchema.Validator.Draft4.Object: AdditionalPropertiesObject :: schema -> AdditionalProperties schema
+ JSONSchema.Validator.Draft4.Object: DependenciesInvalid :: (HashMap Text (DependencyMemberInvalid err)) -> DependenciesInvalid err
+ JSONSchema.Validator.Draft4.Object: DependenciesValidator :: HashMap Text (Dependency schema) -> DependenciesValidator schema
+ JSONSchema.Validator.Draft4.Object: MaxProperties :: Int -> MaxProperties
+ JSONSchema.Validator.Draft4.Object: MaxPropertiesInvalid :: MaxProperties -> (HashMap Text Value) -> MaxPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: MinProperties :: Int -> MinProperties
+ JSONSchema.Validator.Draft4.Object: MinPropertiesInvalid :: MinProperties -> (HashMap Text Value) -> MinPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: PropertiesRelated :: Maybe (HashMap Text schema) -> Maybe (HashMap Text schema) -> Maybe (AdditionalProperties schema) -> PropertiesRelated schema
+ JSONSchema.Validator.Draft4.Object: PropertiesRelatedInvalid :: HashMap Text [err] -> HashMap (Regex, Key) [err] -> Maybe (APInvalid err) -> PropertiesRelatedInvalid err
+ JSONSchema.Validator.Draft4.Object: PropertyDepInvalid :: (Set Text) -> (HashMap Text Value) -> DependencyMemberInvalid err
+ JSONSchema.Validator.Draft4.Object: PropertyDependency :: (Set Text) -> Dependency schema
+ JSONSchema.Validator.Draft4.Object: Regex :: Text -> Regex
+ JSONSchema.Validator.Draft4.Object: Remaining :: HashMap Text Value -> Remaining
+ JSONSchema.Validator.Draft4.Object: Required :: Set Text -> Required
+ JSONSchema.Validator.Draft4.Object: SchemaDepInvalid :: (NonEmpty err) -> DependencyMemberInvalid err
+ JSONSchema.Validator.Draft4.Object: SchemaDependency :: schema -> Dependency schema
+ JSONSchema.Validator.Draft4.Object: [_prInvalidAdditional] :: PropertiesRelatedInvalid err -> Maybe (APInvalid err)
+ JSONSchema.Validator.Draft4.Object: [_prInvalidPattern] :: PropertiesRelatedInvalid err -> HashMap (Regex, Key) [err]
+ JSONSchema.Validator.Draft4.Object: [_prInvalidProperties] :: PropertiesRelatedInvalid err -> HashMap Text [err]
+ JSONSchema.Validator.Draft4.Object: [_propAdditional] :: PropertiesRelated schema -> Maybe (AdditionalProperties schema)
+ JSONSchema.Validator.Draft4.Object: [_propPattern] :: PropertiesRelated schema -> Maybe (HashMap Text schema)
+ JSONSchema.Validator.Draft4.Object: [_propProperties] :: PropertiesRelated schema -> Maybe (HashMap Text schema)
+ JSONSchema.Validator.Draft4.Object: [_unDependenciesValidator] :: DependenciesValidator schema -> HashMap Text (Dependency schema)
+ JSONSchema.Validator.Draft4.Object: [_unMaxProperties] :: MaxProperties -> Int
+ JSONSchema.Validator.Draft4.Object: [_unMinProperties] :: MinProperties -> Int
+ JSONSchema.Validator.Draft4.Object: [_unRegex] :: Regex -> Text
+ JSONSchema.Validator.Draft4.Object: [_unRemaining] :: Remaining -> HashMap Text Value
+ JSONSchema.Validator.Draft4.Object: [_unRequired] :: Required -> Set Text
+ JSONSchema.Validator.Draft4.Object: additionalProperties :: forall err schema. (schema -> Value -> [err]) -> AdditionalProperties schema -> Remaining -> Maybe (APInvalid err)
+ JSONSchema.Validator.Draft4.Object: additionalPropertiesBool :: Bool -> Remaining -> Maybe (HashMap Text Value)
+ JSONSchema.Validator.Draft4.Object: additionalPropertiesObject :: forall err schema. (schema -> Value -> [err]) -> schema -> Remaining -> Maybe (HashMap Text (NonEmpty err))
+ JSONSchema.Validator.Draft4.Object: data APInvalid err
+ JSONSchema.Validator.Draft4.Object: data AdditionalProperties schema
+ JSONSchema.Validator.Draft4.Object: data DependenciesInvalid err
+ JSONSchema.Validator.Draft4.Object: data Dependency schema
+ JSONSchema.Validator.Draft4.Object: data DependencyMemberInvalid err
+ JSONSchema.Validator.Draft4.Object: data MaxPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: data MinPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: data PropertiesRelated schema
+ JSONSchema.Validator.Draft4.Object: data PropertiesRelatedInvalid err
+ JSONSchema.Validator.Draft4.Object: dependenciesVal :: forall err schema. (schema -> Value -> [err]) -> DependenciesValidator schema -> HashMap Text Value -> Maybe (DependenciesInvalid err)
+ JSONSchema.Validator.Draft4.Object: emptyProperties :: PropertiesRelated schema
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Object.MaxProperties
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Object.MinProperties
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Object.Required
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Object.DependenciesValidator schema)
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Object.MaxProperties
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Object.MaxPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Object.MinProperties
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Object.MinPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.Object.Required
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Object.DependenciesInvalid err)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq err => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Object.DependencyMemberInvalid err)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Object.DependenciesValidator schema)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Classes.Eq schema => GHC.Classes.Eq (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show JSONSchema.Validator.Draft4.Object.MaxProperties
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show JSONSchema.Validator.Draft4.Object.MaxPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show JSONSchema.Validator.Draft4.Object.MinProperties
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show JSONSchema.Validator.Draft4.Object.MinPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show JSONSchema.Validator.Draft4.Object.Required
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Object.DependenciesInvalid err)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show err => GHC.Show.Show (JSONSchema.Validator.Draft4.Object.DependencyMemberInvalid err)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Object.DependenciesValidator schema)
+ JSONSchema.Validator.Draft4.Object: instance GHC.Show.Show schema => GHC.Show.Show (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.Object: instance Test.QuickCheck.Arbitrary.Arbitrary JSONSchema.Validator.Draft4.Object.Required
+ JSONSchema.Validator.Draft4.Object: instance Test.QuickCheck.Arbitrary.Arbitrary schema => Test.QuickCheck.Arbitrary.Arbitrary (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.Object: maxPropertiesVal :: MaxProperties -> HashMap Text Value -> Maybe MaxPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: minPropertiesVal :: MinProperties -> HashMap Text Value -> Maybe MinPropertiesInvalid
+ JSONSchema.Validator.Draft4.Object: newtype DependenciesValidator schema
+ JSONSchema.Validator.Draft4.Object: newtype MaxProperties
+ JSONSchema.Validator.Draft4.Object: newtype MinProperties
+ JSONSchema.Validator.Draft4.Object: newtype Regex
+ JSONSchema.Validator.Draft4.Object: newtype Remaining
+ JSONSchema.Validator.Draft4.Object: newtype Required
+ JSONSchema.Validator.Draft4.Object: patternAndUnmatched :: forall err schema. (schema -> Value -> [err]) -> HashMap Text schema -> HashMap Text Value -> (HashMap (Regex, Key) [err], Remaining)
+ JSONSchema.Validator.Draft4.Object: propertiesRelatedVal :: forall err schema. (schema -> Value -> [err]) -> PropertiesRelated schema -> HashMap Text Value -> Maybe (PropertiesRelatedInvalid err)
+ JSONSchema.Validator.Draft4.Object: requiredVal :: Required -> HashMap Text Value -> Maybe ()
+ JSONSchema.Validator.Draft4.String: MaxLength :: Int -> MaxLength
+ JSONSchema.Validator.Draft4.String: MaxLengthInvalid :: MaxLength -> Text -> MaxLengthInvalid
+ JSONSchema.Validator.Draft4.String: MinLength :: Int -> MinLength
+ JSONSchema.Validator.Draft4.String: MinLengthInvalid :: MinLength -> Text -> MinLengthInvalid
+ JSONSchema.Validator.Draft4.String: PatternInvalid :: PatternValidator -> Text -> PatternInvalid
+ JSONSchema.Validator.Draft4.String: PatternNotRegex :: PatternInvalid
+ JSONSchema.Validator.Draft4.String: PatternValidator :: Text -> PatternValidator
+ JSONSchema.Validator.Draft4.String: [_unMaxLength] :: MaxLength -> Int
+ JSONSchema.Validator.Draft4.String: [_unMinLength] :: MinLength -> Int
+ JSONSchema.Validator.Draft4.String: [_unPatternValidator] :: PatternValidator -> Text
+ JSONSchema.Validator.Draft4.String: data MaxLengthInvalid
+ JSONSchema.Validator.Draft4.String: data MinLengthInvalid
+ JSONSchema.Validator.Draft4.String: data PatternInvalid
+ JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.String.MaxLength
+ JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.String.MinLength
+ JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.String.PatternValidator
+ JSONSchema.Validator.Draft4.String: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.String.MaxLength
+ JSONSchema.Validator.Draft4.String: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.String.MaxLengthInvalid
+ JSONSchema.Validator.Draft4.String: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.String.MinLength
+ JSONSchema.Validator.Draft4.String: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.String.MinLengthInvalid
+ JSONSchema.Validator.Draft4.String: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.String.PatternInvalid
+ JSONSchema.Validator.Draft4.String: instance GHC.Classes.Eq JSONSchema.Validator.Draft4.String.PatternValidator
+ JSONSchema.Validator.Draft4.String: instance GHC.Show.Show JSONSchema.Validator.Draft4.String.MaxLength
+ JSONSchema.Validator.Draft4.String: instance GHC.Show.Show JSONSchema.Validator.Draft4.String.MaxLengthInvalid
+ JSONSchema.Validator.Draft4.String: instance GHC.Show.Show JSONSchema.Validator.Draft4.String.MinLength
+ JSONSchema.Validator.Draft4.String: instance GHC.Show.Show JSONSchema.Validator.Draft4.String.MinLengthInvalid
+ JSONSchema.Validator.Draft4.String: instance GHC.Show.Show JSONSchema.Validator.Draft4.String.PatternInvalid
+ JSONSchema.Validator.Draft4.String: instance GHC.Show.Show JSONSchema.Validator.Draft4.String.PatternValidator
+ JSONSchema.Validator.Draft4.String: maxLengthVal :: MaxLength -> Text -> Maybe MaxLengthInvalid
+ JSONSchema.Validator.Draft4.String: minLengthVal :: MinLength -> Text -> Maybe MinLengthInvalid
+ JSONSchema.Validator.Draft4.String: newtype MaxLength
+ JSONSchema.Validator.Draft4.String: newtype MinLength
+ JSONSchema.Validator.Draft4.String: newtype PatternValidator
+ JSONSchema.Validator.Draft4.String: patternVal :: PatternValidator -> Text -> Maybe PatternInvalid
+ JSONSchema.Validator.Reference: baseAndFragment :: Text -> URIBaseAndFragment
+ JSONSchema.Validator.Reference: isRemoteReference :: Text -> Bool
+ JSONSchema.Validator.Reference: resolveFragment :: (FromJSON schema, ToJSON schema) => Maybe Text -> schema -> Maybe schema
+ JSONSchema.Validator.Reference: resolveReference :: URIBase -> Text -> URIBaseAndFragment
+ JSONSchema.Validator.Reference: resolveScopeAgainst :: Maybe Text -> Text -> Text
+ JSONSchema.Validator.Reference: type URIBase = Maybe Text
+ JSONSchema.Validator.Reference: type URIBaseAndFragment = (Maybe Text, Maybe Text)
+ JSONSchema.Validator.Reference: updateResolutionScope :: URIBase -> Maybe Text -> URIBase
+ JSONSchema.Validator.Types: Validator :: (val -> ([schema], [schema])) -> (val -> Value -> [err]) -> Validator schema val err
+ JSONSchema.Validator.Types: [_embedded] :: Validator schema val err -> val -> ([schema], [schema])
+ JSONSchema.Validator.Types: [_validate] :: Validator schema val err -> val -> Value -> [err]
+ JSONSchema.Validator.Types: data Validator schema val err
+ JSONSchema.Validator.Types: instance Data.Profunctor.Unsafe.Profunctor (JSONSchema.Validator.Types.Validator schema)
+ JSONSchema.Validator.Types: instance GHC.Base.Functor (JSONSchema.Validator.Types.Validator schema val)
+ JSONSchema.Validator.Utils: ArbitraryValue :: Value -> ArbitraryValue
+ JSONSchema.Validator.Utils: NonEmpty' :: NonEmpty a -> NonEmpty' a
+ JSONSchema.Validator.Utils: OrdValue :: Value -> OrdValue
+ JSONSchema.Validator.Utils: [_unArbitraryValue] :: ArbitraryValue -> Value
+ JSONSchema.Validator.Utils: [_unNonEmpty'] :: NonEmpty' a -> NonEmpty a
+ JSONSchema.Validator.Utils: [_unOrdValue] :: OrdValue -> Value
+ JSONSchema.Validator.Utils: allUnique :: (Ord a) => [a] -> Bool
+ JSONSchema.Validator.Utils: allUniqueValues :: Vector Value -> Bool
+ JSONSchema.Validator.Utils: allUniqueValues' :: NonEmpty Value -> Bool
+ JSONSchema.Validator.Utils: arbitraryHashMap :: Arbitrary a => Gen (HashMap Text a)
+ JSONSchema.Validator.Utils: arbitraryPositiveScientific :: Gen Scientific
+ JSONSchema.Validator.Utils: arbitraryScientific :: Gen Scientific
+ JSONSchema.Validator.Utils: arbitrarySetOfText :: Gen (Set Text)
+ JSONSchema.Validator.Utils: arbitraryText :: Gen Text
+ JSONSchema.Validator.Utils: fromJSONEither :: FromJSON a => Value -> Either Text a
+ JSONSchema.Validator.Utils: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Utils.NonEmpty' a)
+ JSONSchema.Validator.Utils: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Utils.NonEmpty' a)
+ JSONSchema.Validator.Utils: instance GHC.Classes.Eq JSONSchema.Validator.Utils.ArbitraryValue
+ JSONSchema.Validator.Utils: instance GHC.Classes.Eq JSONSchema.Validator.Utils.OrdValue
+ JSONSchema.Validator.Utils: instance GHC.Classes.Ord JSONSchema.Validator.Utils.OrdValue
+ JSONSchema.Validator.Utils: instance GHC.Show.Show JSONSchema.Validator.Utils.ArbitraryValue
+ JSONSchema.Validator.Utils: instance Test.QuickCheck.Arbitrary.Arbitrary JSONSchema.Validator.Utils.ArbitraryValue
+ JSONSchema.Validator.Utils: instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (JSONSchema.Validator.Utils.NonEmpty' a)
+ JSONSchema.Validator.Utils: newtype ArbitraryValue
+ JSONSchema.Validator.Utils: newtype NonEmpty' a
+ JSONSchema.Validator.Utils: newtype OrdValue
Files
- changelog.md +5/−0
- examples/AlternateSchema.hs +19/−19
- examples/Simple.hs +5/−5
- examples/TwoStep.hs +4/−4
- hjsonschema.cabal +17/−17
- src/Data/JsonSchema/Draft4.hs +0/−195
- src/Data/JsonSchema/Draft4/Failure.hs +0/−59
- src/Data/JsonSchema/Draft4/Schema.hs +0/−342
- src/Data/JsonSchema/Draft4/Spec.hs +0/−128
- src/Data/JsonSchema/Fetch.hs +0/−194
- src/Data/JsonSchema/Types.hs +0/−36
- src/Data/Validator/Draft4.hs +0/−242
- src/Data/Validator/Draft4/Any.hs +0/−350
- src/Data/Validator/Draft4/Array.hs +0/−224
- src/Data/Validator/Draft4/Number.hs +0/−84
- src/Data/Validator/Draft4/Object.hs +0/−179
- src/Data/Validator/Draft4/Object/Properties.hs +0/−209
- src/Data/Validator/Draft4/String.hs +0/−79
- src/Data/Validator/Reference.hs +0/−79
- src/Data/Validator/Types.hs +0/−23
- src/Data/Validator/Utils.hs +0/−135
- src/JSONSchema/Draft4.hs +195/−0
- src/JSONSchema/Draft4/Failure.hs +59/−0
- src/JSONSchema/Draft4/Schema.hs +342/−0
- src/JSONSchema/Draft4/Spec.hs +128/−0
- src/JSONSchema/Fetch.hs +194/−0
- src/JSONSchema/Types.hs +36/−0
- src/JSONSchema/Validator/Draft4.hs +242/−0
- src/JSONSchema/Validator/Draft4/Any.hs +351/−0
- src/JSONSchema/Validator/Draft4/Array.hs +224/−0
- src/JSONSchema/Validator/Draft4/Number.hs +84/−0
- src/JSONSchema/Validator/Draft4/Object.hs +179/−0
- src/JSONSchema/Validator/Draft4/Object/Properties.hs +209/−0
- src/JSONSchema/Validator/Draft4/String.hs +79/−0
- src/JSONSchema/Validator/Reference.hs +79/−0
- src/JSONSchema/Validator/Types.hs +23/−0
- src/JSONSchema/Validator/Utils.hs +135/−0
- test/Local.hs +8/−8
- test/Local/Failure.hs +11/−11
- test/Local/Reference.hs +1/−1
- test/Local/Validation.hs +7/−8
- test/Remote.hs +4/−4
changelog.md view
@@ -1,3 +1,8 @@+# 1.4.0.0+++ Rename `Data.JsonSchema.*` modules to `JSONSchema.*`.++ Rename `Data.Validator.*` modules to `JSONSchema.Validator.*`.+ # 1.3.0.1 + Bump `vector`.
examples/AlternateSchema.hs view
@@ -1,8 +1,8 @@ -- | An implementation of JSON Schema Draft 4 based on 'HashMap Text Value'--- instead of a custom record type like 'Data.JsonSchema.Draft4'.+-- instead of a custom record type like 'JSONSchema.Draft4'. -- -- If you're writing code for a new schema specification you probably want--- to copy this module instead of the 'Data.JsonSchema.Draft4'. While it's+-- to copy this module instead of the 'JSONSchema.Draft4'. While it's -- less convenient to write schemas in Haskell without a record type, you -- can get the implementation finished with far fewer lines of code. @@ -10,23 +10,23 @@ import Protolude -import Data.Aeson (FromJSON(..), Value(..),- decode)-import qualified Data.Aeson as AE-import qualified Data.ByteString.Lazy as LBS-import qualified Data.HashMap.Strict as HM-import Data.Maybe (fromMaybe)-import Data.Profunctor (Profunctor (..))+import Data.Aeson (FromJSON(..), Value(..),+ decode)+import qualified Data.Aeson as AE+import qualified Data.ByteString.Lazy as LBS+import qualified Data.HashMap.Strict as HM+import Data.Maybe (fromMaybe)+import Data.Profunctor (Profunctor (..)) -import Data.JsonSchema.Draft4 (ValidatorFailure(..),- metaSchemaBytes)-import Data.JsonSchema.Fetch (ReferencedSchemas(..),- SchemaWithURI(..))-import qualified Data.JsonSchema.Fetch as FE-import Data.JsonSchema.Types (Schema(..), Spec(..))-import qualified Data.JsonSchema.Types as JT-import qualified Data.Validator.Draft4 as D4-import Data.Validator.Reference (updateResolutionScope)+import JSONSchema.Draft4 (ValidatorFailure(..),+ metaSchemaBytes)+import JSONSchema.Fetch (ReferencedSchemas(..),+ SchemaWithURI(..))+import qualified JSONSchema.Fetch as FE+import JSONSchema.Types (Schema(..), Spec(..))+import qualified JSONSchema.Types as JT+import qualified JSONSchema.Validator.Draft4 as D4+import JSONSchema.Validator.Reference (updateResolutionScope) -------------------------------------------------- -- * Basic fetching tools@@ -107,7 +107,7 @@ -> Maybe Text -> Spec Schema ValidatorFailure -- ^ Here we reuses 'ValidatorFailure' from- -- 'Data.JsonSchema.Draft4.Failure'. If your validators have different+ -- 'JSONSchema.Draft4.Failure'. If your validators have different -- failure possibilities you'll need to create your own validator -- failure type. d4Spec referenced visited scope =
examples/Simple.hs view
@@ -3,12 +3,12 @@ import Protolude -import Data.Aeson (Value(..), decode, toJSON)-import qualified Data.ByteString.Lazy as LBS-import qualified Data.List.NonEmpty as NE-import Data.Maybe (fromMaybe)+import Data.Aeson (Value(..), decode, toJSON)+import qualified Data.ByteString.Lazy as LBS+import qualified Data.List.NonEmpty as NE+import Data.Maybe (fromMaybe) -import qualified Data.JsonSchema.Draft4 as D4+import qualified JSONSchema.Draft4 as D4 badData :: Value badData = toJSON [True, True]
examples/TwoStep.hs view
@@ -15,11 +15,11 @@ import Protolude -import Data.Aeson (Value (..), toJSON)-import qualified Data.List.NonEmpty as NE+import Data.Aeson (Value (..), toJSON)+import qualified Data.List.NonEmpty as NE -import qualified Data.JsonSchema.Draft4 as D4-import qualified Data.Validator.Draft4 as VAL+import qualified JSONSchema.Draft4 as D4+import qualified JSONSchema.Validator.Draft4 as VAL schema :: D4.Schema schema = D4.emptySchema { D4._schemaRef = Just "./unique.json" }
hjsonschema.cabal view
@@ -1,5 +1,5 @@ name: hjsonschema-version: 1.3.0.1+version: 1.4.0.0 synopsis: JSON Schema library homepage: https://github.com/seagreen/hjsonschema license: MIT@@ -38,23 +38,23 @@ ghc-options: -Wall exposed-modules:- Data.JsonSchema.Draft4- , Data.JsonSchema.Draft4.Failure- , Data.JsonSchema.Draft4.Schema- , Data.JsonSchema.Draft4.Spec- , Data.JsonSchema.Fetch- , Data.JsonSchema.Types- , Data.Validator.Draft4- , Data.Validator.Draft4.Any- , Data.Validator.Draft4.Array- , Data.Validator.Draft4.Number- , Data.Validator.Draft4.Object- , Data.Validator.Draft4.String- , Data.Validator.Reference- , Data.Validator.Types- , Data.Validator.Utils+ JSONSchema.Draft4+ , JSONSchema.Draft4.Failure+ , JSONSchema.Draft4.Schema+ , JSONSchema.Draft4.Spec+ , JSONSchema.Fetch+ , JSONSchema.Types+ , JSONSchema.Validator.Draft4+ , JSONSchema.Validator.Draft4.Any+ , JSONSchema.Validator.Draft4.Array+ , JSONSchema.Validator.Draft4.Number+ , JSONSchema.Validator.Draft4.Object+ , JSONSchema.Validator.Draft4.String+ , JSONSchema.Validator.Reference+ , JSONSchema.Validator.Types+ , JSONSchema.Validator.Utils other-modules:- Data.Validator.Draft4.Object.Properties+ JSONSchema.Validator.Draft4.Object.Properties , Import build-depends: base >= 4.7 && < 4.10
− src/Data/JsonSchema/Draft4.hs
@@ -1,195 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}--module Data.JsonSchema.Draft4- ( -- * Draft 4 Schema- SchemaWithURI(..)- , Schema(..)- , SC.emptySchema-- -- * One-step validation (getting references over HTTP)- , fetchHTTPAndValidate- , HTTPValidationFailure(..)- , FE.HTTPFailure(..)- , SchemaInvalid(..)-- -- * One-step validation (getting references from the filesystem)- , fetchFilesystemAndValidate- , FilesystemValidationFailure(..)- , FE.FilesystemFailure(..)-- -- * Validation failure- , Invalid(..)- , ValidatorFailure(..)-- -- * Fetching tools- , ReferencedSchemas(..)- , FE.URISchemaMap(..)- , referencesViaHTTP- , referencesViaFilesystem-- -- * Other Draft 4 things exported just in case- , metaSchema- , metaSchemaBytes- , schemaValidity- , referencesValidity- , checkSchema- , draft4FetchInfo- ) where--import Import--import Control.Arrow (left)-import qualified Data.ByteString as BS-import Data.FileEmbed (embedFile,- makeRelativeToProject)-import qualified Data.HashMap.Strict as HM-import qualified Data.List.NonEmpty as NE-import Data.Maybe (fromMaybe)--import Data.JsonSchema.Draft4.Failure (Invalid(..),- SchemaInvalid(..),- ValidatorFailure(..))-import Data.JsonSchema.Draft4.Schema (Schema)-import qualified Data.JsonSchema.Draft4.Schema as SC-import qualified Data.JsonSchema.Draft4.Spec as Spec-import Data.JsonSchema.Fetch (ReferencedSchemas(..),- SchemaWithURI(..))-import qualified Data.JsonSchema.Fetch as FE--data HTTPValidationFailure- = HVRequest FE.HTTPFailure- | HVSchema SchemaInvalid- | HVData Invalid- deriving Show---- | Fetch recursively referenced schemas over HTTP, check that both the--- original and referenced schemas are valid, then validate then data.-fetchHTTPAndValidate- :: SchemaWithURI Schema- -> Value- -> IO (Either HTTPValidationFailure ())-fetchHTTPAndValidate sw v = do- res <- referencesViaHTTP sw- pure (g =<< f =<< left HVRequest res)- where- f :: FE.URISchemaMap Schema- -> Either HTTPValidationFailure (Value -> [ValidatorFailure])- f references = left HVSchema (checkSchema references sw)-- g :: (Value -> [ValidatorFailure]) -> Either HTTPValidationFailure ()- g val = case NE.nonEmpty (val v) of- Nothing -> Right ()- Just failures -> Left (HVData Invalid- { _invalidSchema = _swSchema sw- , _invalidInstance = v- , _invalidFailures = failures- })--data FilesystemValidationFailure- = FVRead FE.FilesystemFailure- | FVSchema SchemaInvalid- | FVData Invalid- deriving (Show, Eq)---- | Fetch recursively referenced schemas from the filesystem, check--- that both the original and referenced schemas are valid, then validate--- the data.-fetchFilesystemAndValidate- :: SchemaWithURI Schema- -> Value- -> IO (Either FilesystemValidationFailure ())-fetchFilesystemAndValidate sw v = do- res <- referencesViaFilesystem sw- pure (g =<< f =<< left FVRead res)- where- f :: FE.URISchemaMap Schema- -> Either FilesystemValidationFailure (Value -> [ValidatorFailure])- f references = left FVSchema (checkSchema references sw)-- g :: (Value -> [ValidatorFailure]) -> Either FilesystemValidationFailure ()- g val = case NE.nonEmpty (val v) of- Nothing -> Right ()- Just invalid -> Left (FVData Invalid- { _invalidSchema = _swSchema sw- , _invalidInstance = v- , _invalidFailures = invalid- })---- | An instance of 'Data.JsonSchema.Fetch.FetchInfo' specialized for--- JSON Schema Draft 4.-draft4FetchInfo :: FE.FetchInfo Schema-draft4FetchInfo = FE.FetchInfo Spec.embedded SC._schemaId SC._schemaRef---- | Fetch the schemas recursively referenced by a starting schema over HTTP.-referencesViaHTTP- :: SchemaWithURI Schema- -> IO (Either FE.HTTPFailure (FE.URISchemaMap Schema))-referencesViaHTTP = FE.referencesViaHTTP' draft4FetchInfo---- | Fetch the schemas recursively referenced by a starting schema from--- the filesystem.-referencesViaFilesystem- :: SchemaWithURI Schema- -> IO (Either FE.FilesystemFailure (FE.URISchemaMap Schema))-referencesViaFilesystem = FE.referencesViaFilesystem' draft4FetchInfo---- | Checks if a schema and a set of referenced schemas are valid.------ Return a function to validate data.-checkSchema- :: FE.URISchemaMap Schema- -> SchemaWithURI Schema- -> Either SchemaInvalid (Value -> [ValidatorFailure])-checkSchema sm sw =- case NE.nonEmpty failures of- Just fs -> Left (SchemaInvalid fs)- Nothing -> Right (Spec.specValidate- (ReferencedSchemas (_swSchema sw)- (FE._unURISchemaMap sm))- sw)- where- failures :: [(Maybe Text, NonEmpty ValidatorFailure)]- failures =- let refFailures = first Just <$> referencesValidity sm- in case NE.nonEmpty (schemaValidity (_swSchema sw)) of- Nothing -> refFailures- Just errs -> (Nothing,errs) : refFailures--metaSchema :: Schema-metaSchema =- fromMaybe (panic "Schema decode failed (this should never happen)")- . decodeStrict- $ metaSchemaBytes--metaSchemaBytes :: BS.ByteString-metaSchemaBytes =- $(makeRelativeToProject "src/draft4.json" >>= embedFile)---- | Check that a schema itself is valid--- (if so the returned list will be empty).-schemaValidity :: Schema -> [ValidatorFailure]-schemaValidity =- Spec.specValidate referenced (SchemaWithURI metaSchema Nothing) . toJSON- where- referenced :: ReferencedSchemas Schema- referenced = ReferencedSchemas- metaSchema- (HM.singleton "http://json-schema.org/draft-04/schema"- metaSchema)---- | Check that a set of referenced schemas are valid--- (if so the returned list will be empty).-referencesValidity- :: FE.URISchemaMap Schema- -> [(Text, NonEmpty ValidatorFailure)]- -- ^ The first item of the tuple is the URI of a schema, the second- -- is that schema's validation errors.-referencesValidity = HM.foldlWithKey' f mempty . FE._unURISchemaMap- where- f :: [(Text, NonEmpty ValidatorFailure)]- -> Text- -> Schema- -> [(Text, NonEmpty ValidatorFailure)]- f acc k v = case NE.nonEmpty (schemaValidity v) of- Nothing -> acc- Just errs -> (k,errs) : acc
− src/Data/JsonSchema/Draft4/Failure.hs
@@ -1,59 +0,0 @@--module Data.JsonSchema.Draft4.Failure where--import Import--import Data.JsonSchema.Draft4.Schema (Schema)-import qualified Data.Validator.Draft4 as D4---- | Used to report an entire instance being invalidated, as opposed--- to the failure of a single validator.-data Invalid = Invalid- { _invalidSchema :: Schema- , _invalidInstance :: Value- , _invalidFailures :: NonEmpty ValidatorFailure- } deriving (Eq, Show)--data ValidatorFailure- = FailureMultipleOf D4.MultipleOfInvalid- | FailureMaximum D4.MaximumInvalid- | FailureMinimum D4.MinimumInvalid-- | FailureMaxLength D4.MaxLengthInvalid- | FailureMinLength D4.MinLengthInvalid- | FailurePattern D4.PatternInvalid-- | FailureMaxItems D4.MaxItemsInvalid- | FailureMinItems D4.MinItemsInvalid- | FailureUniqueItems D4.UniqueItemsInvalid- | FailureItems (D4.ItemsInvalid ValidatorFailure)- | FailureAdditionalItems (D4.AdditionalItemsInvalid ValidatorFailure)-- | FailureMaxProperties D4.MaxPropertiesInvalid- | FailureMinProperties D4.MinPropertiesInvalid- | FailureRequired ()- | FailureDependencies (D4.DependenciesInvalid ValidatorFailure)- | FailurePropertiesRelated (D4.PropertiesRelatedInvalid ValidatorFailure)-- | FailureRef (D4.RefInvalid ValidatorFailure)- | FailureEnum D4.EnumInvalid- | FailureType D4.TypeValidatorInvalid- | FailureAllOf (D4.AllOfInvalid ValidatorFailure)- | FailureAnyOf (D4.AnyOfInvalid ValidatorFailure)- | FailureOneOf (D4.OneOfInvalid ValidatorFailure)- | FailureNot D4.NotValidatorInvalid- deriving (Eq, Show)---- | A description of why a schema (or one of its reference) is itself--- invalid.------ 'Nothing' indicates the starting schema. 'Just' indicates a referenced--- schema. The contents of the 'Just' is the schema's URI.------ NOTE: 'HashMap (Maybe Text) Invalid' would be a nicer way of--- defining this, but then we lose the guarantee that there's at least--- one key.-newtype SchemaInvalid- = SchemaInvalid {- _unSchemaInvalid :: NonEmpty (Maybe Text, NonEmpty ValidatorFailure) }- deriving (Eq, Show)
− src/Data/JsonSchema/Draft4/Schema.hs
@@ -1,342 +0,0 @@--module Data.JsonSchema.Draft4.Schema where--import Import hiding (mapMaybe)--import qualified Data.HashMap.Strict as HM-import Data.List.NonEmpty (NonEmpty)-import Data.Maybe (fromJust, isJust)-import Data.Scientific-import qualified Data.Set as Set-import qualified Data.Text as T--import qualified Data.Validator.Draft4 as D4-import Data.Validator.Utils--data Schema = Schema- { _schemaVersion :: Maybe Text- , _schemaId :: Maybe Text- , _schemaRef :: Maybe Text- , _schemaDefinitions :: Maybe (HashMap Text Schema)- -- ^ A standardized location for embedding schemas- -- to be referenced from elsewhere in the document.- , _schemaOther :: HashMap Text Value- -- ^ Since the JSON document this schema was built from could- -- contain schemas anywhere (not just in "definitions" or any- -- of the other official keys) we save any leftover key/value- -- pairs not covered by them here.- --- -- TODO: This field is the source of most of the complication in this- -- module and needs to be removed. It should be doable, though it will- -- involve some modification to the fetching code.-- , _schemaMultipleOf :: Maybe Scientific- , _schemaMaximum :: Maybe Scientific- , _schemaExclusiveMaximum :: Maybe Bool- , _schemaMinimum :: Maybe Scientific- , _schemaExclusiveMinimum :: Maybe Bool-- , _schemaMaxLength :: Maybe Int- , _schemaMinLength :: Maybe Int- , _schemaPattern :: Maybe Text-- , _schemaMaxItems :: Maybe Int- , _schemaMinItems :: Maybe Int- , _schemaUniqueItems :: Maybe Bool- , _schemaItems :: Maybe (D4.Items Schema)- -- Note that '_schemaAdditionalItems' is left out of 'runValidate'- -- because its functionality is handled by '_schemaItems'. It always- -- validates data unless 'Items' is present.- , _schemaAdditionalItems :: Maybe (D4.AdditionalItems Schema)-- , _schemaMaxProperties :: Maybe Int- , _schemaMinProperties :: Maybe Int- , _schemaRequired :: Maybe (Set Text)- , _schemaDependencies :: Maybe (HashMap Text (D4.Dependency Schema))- , _schemaProperties :: Maybe (HashMap Text Schema)- , _schemaPatternProperties :: Maybe (HashMap Text Schema)- , _schemaAdditionalProperties :: Maybe (D4.AdditionalProperties Schema)-- , _schemaEnum :: Maybe (NonEmpty Value)- , _schemaType :: Maybe D4.TypeValidator- , _schemaAllOf :: Maybe (NonEmpty Schema)- , _schemaAnyOf :: Maybe (NonEmpty Schema)- , _schemaOneOf :: Maybe (NonEmpty Schema)- , _schemaNot :: Maybe Schema- } deriving (Eq, Show)--emptySchema :: Schema-emptySchema = Schema- { _schemaVersion = Nothing- , _schemaId = Nothing- , _schemaRef = Nothing- , _schemaDefinitions = Nothing- , _schemaOther = mempty-- , _schemaMultipleOf = Nothing- , _schemaMaximum = Nothing- , _schemaExclusiveMaximum = Nothing- , _schemaMinimum = Nothing- , _schemaExclusiveMinimum = Nothing-- , _schemaMaxLength = Nothing- , _schemaMinLength = Nothing- , _schemaPattern = Nothing-- , _schemaMaxItems = Nothing- , _schemaMinItems = Nothing- , _schemaUniqueItems = Nothing- , _schemaItems = Nothing- , _schemaAdditionalItems = Nothing-- , _schemaMaxProperties = Nothing- , _schemaMinProperties = Nothing- , _schemaRequired = Nothing- , _schemaDependencies = Nothing- , _schemaProperties = Nothing- , _schemaPatternProperties = Nothing- , _schemaAdditionalProperties = Nothing-- , _schemaEnum = Nothing- , _schemaType = Nothing- , _schemaAllOf = Nothing- , _schemaAnyOf = Nothing- , _schemaOneOf = Nothing- , _schemaNot = Nothing- }--instance FromJSON Schema where- parseJSON = withObject "Schema" $ \o -> do- a <- o .:! "$schema"- b <- o .:! "id"- c <- o .:! "$ref"- d <- o .:! "definitions"- e <- parseJSON (Object (HM.difference o internalSchemaHashMap))-- f <- o .:! "multipleOf"- g <- o .:! "maximum"- h <- o .:! "exclusiveMaximum"- i <- o .:! "minimum"- j <- o .:! "exclusiveMinimum"-- k <- o .:! "maxLength"- l <- o .:! "minLength"- m <- o .:! "pattern"-- n <- o .:! "maxItems"- o' <- o .:! "minItems"- p <- o .:! "uniqueItems"- q <- o .:! "items"- r <- o .:! "additionalItems"-- s <- o .:! "maxProperties"- t <- o .:! "minProperties"- u <- o .:! "required"- v <- o .:! "dependencies"- w <- o .:! "properties"- x <- o .:! "patternProperties"- y <- o .:! "additionalProperties"-- z <- o .:! "enum"- a2 <- o .:! "type"- b2 <- fmap _unNonEmpty' <$> o .:! "allOf"- c2 <- fmap _unNonEmpty' <$> o .:! "anyOf"- d2 <- fmap _unNonEmpty' <$> o .:! "oneOf"- e2 <- o .:! "not"- pure Schema- { _schemaVersion = a- , _schemaId = b- , _schemaRef = c- , _schemaDefinitions = d- , _schemaOther = e-- , _schemaMultipleOf = f- , _schemaMaximum = g- , _schemaExclusiveMaximum = h- , _schemaMinimum = i- , _schemaExclusiveMinimum = j-- , _schemaMaxLength = k- , _schemaMinLength = l- , _schemaPattern = m-- , _schemaMaxItems = n- , _schemaMinItems = o'- , _schemaUniqueItems = p- , _schemaItems = q- , _schemaAdditionalItems = r-- , _schemaMaxProperties = s- , _schemaMinProperties = t- , _schemaRequired = u- , _schemaDependencies = v- , _schemaProperties = w- , _schemaPatternProperties = x- , _schemaAdditionalProperties = y-- , _schemaEnum = z- , _schemaType = a2- , _schemaAllOf = b2- , _schemaAnyOf = c2- , _schemaOneOf = d2- , _schemaNot = e2- }--instance ToJSON Schema where- -- | The way we resolve JSON Pointers to embedded schemas is by- -- serializing the containing schema to a value and then resolving the- -- pointer against it. This means that FromJSON and ToJSON must be- -- isomorphic.- --- -- This influences the design choices in the library. E.g. right now- -- there are two false values for "exclusiveMaximum" -- Nothing and- -- Just False. We could have condensed them down by using () instead- -- of Bool for "exclusiveMaximum". This would have made writing schemas- -- in haskell easier, but we could no longer round trip through/from- -- JSON without losing information.- toJSON s = Object $ HM.union (mapMaybe ($ s) internalSchemaHashMap)- (toJSON <$> _schemaOther s)- where- -- 'mapMaybe' is provided by unordered-containers after- -- unordered-container-2.6.0.0, but until that is a little older- -- (and has time to get into Stackage etc.) we use our own- -- implementation.- mapMaybe :: (v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2- mapMaybe f = fmap fromJust . HM.filter isJust . fmap f---- | Internal. Separate from ToJSON because it's also used--- by FromJSON to determine what keys aren't official schema--- keys and therefor should be included in _schemaOther.-internalSchemaHashMap :: HashMap Text (Schema -> Maybe Value)-internalSchemaHashMap = HM.fromList- [ ("$schema" , f _schemaVersion)- , ("id" , f _schemaId)- , ("$ref" , f _schemaRef)- , ("definitions" , f _schemaDefinitions)-- , ("multipleOf" , f _schemaMultipleOf)- , ("maximum" , f _schemaMaximum)- , ("exclusiveMaximum" , f _schemaExclusiveMaximum)- , ("minimum" , f _schemaMinimum)- , ("exclusiveMinimum" , f _schemaExclusiveMinimum)-- , ("maxLength" , f _schemaMaxLength)- , ("minLength" , f _schemaMinLength)- , ("pattern" , f _schemaPattern)-- , ("maxItems" , f _schemaMaxItems)- , ("minItems" , f _schemaMinItems)- , ("uniqueItems" , f _schemaUniqueItems)- , ("items" , f _schemaItems)- , ("additionalItems" , f _schemaAdditionalItems)-- , ("maxProperties" , f _schemaMaxProperties)- , ("minProperties" , f _schemaMinProperties)- , ("required" , f _schemaRequired)- , ("dependencies" , f _schemaDependencies)- , ("properties" , f _schemaProperties)- , ("patternProperties" , f _schemaPatternProperties)- , ("additionalProperties", f _schemaAdditionalProperties)-- , ("enum" , f _schemaEnum)- , ("type" , f _schemaType)- , ("allOf" , f (fmap NonEmpty' . _schemaAllOf))- , ("anyOf" , f (fmap NonEmpty' . _schemaAnyOf))- , ("oneOf" , f (fmap NonEmpty' . _schemaOneOf))- , ("not" , f _schemaNot)- ]- where- f :: ToJSON a => (Schema -> Maybe a) -> Schema -> Maybe Value- f = (fmap.fmap) toJSON--instance Arbitrary Schema where- arbitrary = sized f- where- maybeGen :: Gen a -> Gen (Maybe a)- maybeGen a = oneof [pure Nothing, Just <$> a]-- maybeRecurse :: Int -> Gen a -> Gen (Maybe a)- maybeRecurse n a- | n < 1 = pure Nothing- | otherwise = maybeGen $ resize (n `div` 10) a-- f :: Int -> Gen Schema- f n = do- a <- maybeGen arbitraryText- b <- maybeGen arbitraryText- c <- maybeGen arbitraryText- -- NOTE: The next two fields are empty to generate cleaner- -- schemas, but note that this means we don't test the- -- invertability of these fields.- d <- pure Nothing -- _schemaDefinitions- e <- pure mempty -- _otherPairs-- f' <- maybeGen arbitraryPositiveScientific- g <- maybeGen arbitraryScientific- h <- arbitrary- i <- maybeGen arbitraryScientific- j <- arbitrary-- k <- maybeGen (getPositive <$> arbitrary)- l <- maybeGen (getPositive <$> arbitrary)- m <- maybeGen arbitraryText-- n' <- maybeGen (getPositive <$> arbitrary)- o <- maybeGen (getPositive <$> arbitrary)- p <- arbitrary- q <- maybeRecurse n arbitrary- r <- maybeRecurse n arbitrary-- s <- maybeGen (getPositive <$> arbitrary)- t <- maybeGen (getPositive <$> arbitrary)- u <- maybeGen (Set.map T.pack <$> arbitrary)- v <- maybeRecurse n arbitraryHashMap- w <- maybeRecurse n arbitraryHashMap- x <- maybeRecurse n arbitraryHashMap- y <- maybeRecurse n arbitrary-- z <- maybeRecurse n ( fmap _unArbitraryValue . _unNonEmpty'- <$> arbitrary)- a2 <- arbitrary- b2 <- maybeRecurse n (_unNonEmpty' <$> arbitrary)- c2 <- maybeRecurse n (_unNonEmpty' <$> arbitrary)- d2 <- maybeRecurse n (_unNonEmpty' <$> arbitrary)- e2 <- maybeRecurse n arbitrary- pure Schema- { _schemaVersion = a- , _schemaId = b- , _schemaRef = c- , _schemaDefinitions = d- , _schemaOther = e-- , _schemaMultipleOf = f'- , _schemaMaximum = g- , _schemaExclusiveMaximum = h- , _schemaMinimum = i- , _schemaExclusiveMinimum = j-- , _schemaMaxLength = k- , _schemaMinLength = l- , _schemaPattern = m-- , _schemaMaxItems = n'- , _schemaMinItems = o- , _schemaUniqueItems = p- , _schemaItems = q- , _schemaAdditionalItems = r-- , _schemaMaxProperties = s- , _schemaMinProperties = t- , _schemaRequired = u- , _schemaDependencies = v- , _schemaProperties = w- , _schemaPatternProperties = x- , _schemaAdditionalProperties = y-- , _schemaEnum = z- , _schemaType = a2- , _schemaAllOf = b2- , _schemaAnyOf = c2- , _schemaOneOf = d2- , _schemaNot = e2- }
− src/Data/JsonSchema/Draft4/Spec.hs
@@ -1,128 +0,0 @@--module Data.JsonSchema.Draft4.Spec where--import Import--import Data.Maybe (fromMaybe)-import Data.Profunctor (Profunctor(..))--import Data.JsonSchema.Draft4.Failure-import Data.JsonSchema.Draft4.Schema (Schema(..))-import Data.JsonSchema.Fetch (ReferencedSchemas(..),- SchemaWithURI(..))-import qualified Data.JsonSchema.Fetch as FE-import Data.JsonSchema.Types (Spec(..))-import qualified Data.JsonSchema.Types as JT-import Data.Validator.Draft4-import Data.Validator.Reference (updateResolutionScope)--embedded :: Schema -> ([Schema], [Schema])-embedded s = JT.embedded (d4Spec (ReferencedSchemas s mempty) mempty Nothing) s--specValidate- :: ReferencedSchemas Schema- -> SchemaWithURI Schema- -> Value- -> [ValidatorFailure]-specValidate rs =- continueValidating rs (VisitedSchemas [(Nothing, Nothing)])--continueValidating- :: ReferencedSchemas Schema- -> VisitedSchemas- -> SchemaWithURI Schema- -> Value- -> [ValidatorFailure]-continueValidating referenced visited sw =- JT.validate (d4Spec referenced visited currentScope)- (_swSchema sw)- where- currentScope :: Maybe Text- currentScope = updateResolutionScope- (_swURI sw)- (_schemaId (_swSchema sw))--d4Spec- :: ReferencedSchemas Schema- -> VisitedSchemas- -> Maybe Text- -> Spec Schema ValidatorFailure-d4Spec referenced visited scope = Spec- [ dimap (fmap MultipleOf . _schemaMultipleOf) FailureMultipleOf multipleOfValidator- , dimap- (\s -> Maximum (fromMaybe False (_schemaExclusiveMaximum s)) <$> _schemaMaximum s)- FailureMaximum- maximumValidator- , dimap- (\s -> Minimum (fromMaybe False (_schemaExclusiveMinimum s)) <$> _schemaMinimum s)- FailureMinimum- minimumValidator-- , dimap (fmap MaxLength . _schemaMaxLength) FailureMaxLength maxLengthValidator- , dimap (fmap MinLength . _schemaMinLength) FailureMinLength minLengthValidator- , dimap (fmap PatternValidator . _schemaPattern) FailurePattern patternValidator-- , dimap (fmap MaxItems . _schemaMaxItems) FailureMaxItems maxItemsValidator- , dimap (fmap MinItems . _schemaMinItems) FailureMinItems minItemsValidator- , dimap (fmap UniqueItems . _schemaUniqueItems) FailureUniqueItems uniqueItemsValidator- , dimap- (\s -> ItemsRelated- { _irItems = _schemaItems s- , _irAdditional = _schemaAdditionalItems s- })- (\err -> case err of- IRInvalidItems e -> FailureItems e- IRInvalidAdditional e -> FailureAdditionalItems e)- (itemsRelatedValidator descend)- , lmap (fmap Definitions . _schemaDefinitions) definitionsEmbedded-- , dimap- (fmap MaxProperties . _schemaMaxProperties)- FailureMaxProperties- maxPropertiesValidator- , dimap- (fmap MinProperties . _schemaMinProperties)- FailureMinProperties- minPropertiesValidator- , dimap (fmap Required . _schemaRequired) FailureRequired requiredValidator- , dimap- (fmap DependenciesValidator . _schemaDependencies)- FailureDependencies- (dependenciesValidator descend)- , dimap- (\s -> PropertiesRelated- { _propProperties = _schemaProperties s- , _propPattern = _schemaPatternProperties s- , _propAdditional = _schemaAdditionalProperties s- })- FailurePropertiesRelated- (propertiesRelatedValidator descend)-- , dimap- (\s -> Ref <$> _schemaRef s)- FailureRef- (refValidator visited scope (FE.getReference referenced) getRef)- , dimap (fmap EnumValidator . _schemaEnum) FailureEnum enumValidator- , dimap (fmap TypeContext . _schemaType) FailureType typeValidator- , dimap (fmap AllOf . _schemaAllOf) FailureAllOf (allOfValidator lateral)- , dimap (fmap AnyOf . _schemaAnyOf) FailureAnyOf (anyOfValidator lateral)- , dimap (fmap OneOf . _schemaOneOf) FailureOneOf (oneOfValidator lateral)- , dimap (fmap NotValidator . _schemaNot) FailureNot (notValidator lateral)- ]- where- getRef- :: VisitedSchemas- -> Maybe Text- -> Schema- -> Value- -> [ValidatorFailure]- getRef newVisited newScope schema =- continueValidating referenced newVisited (SchemaWithURI schema newScope)-- descend :: Schema -> Value -> [ValidatorFailure]- descend schema =- continueValidating referenced mempty (SchemaWithURI schema scope)-- lateral :: Schema -> Value -> [ValidatorFailure]- lateral schema =- continueValidating referenced visited (SchemaWithURI schema scope)
− src/Data/JsonSchema/Fetch.hs
@@ -1,194 +0,0 @@--module Data.JsonSchema.Fetch where--import Import--import Control.Arrow (left)-import Control.Exception (IOException, catch)-import Control.Monad (foldM)-import qualified Data.ByteString as BS-import qualified Data.ByteString.Lazy as LBS-import qualified Data.HashMap.Strict as HM-import qualified Data.Text as T-import qualified Network.HTTP.Client as NC--import Data.Validator.Reference (resolveReference,- updateResolutionScope)------------------------------------------------------- * Types------------------------------------------------------- | This is all the fetching functions need to know about a particular--- JSON Schema draft, e.g. JSON Schema Draft 4.-data FetchInfo schema = FetchInfo- { _fiEmbedded :: schema -> ([schema], [schema])- , _fiId :: schema -> Maybe Text- , _fiRef :: schema -> Maybe Text- }--data ReferencedSchemas schema = ReferencedSchemas- { _rsStarting :: !schema- -- ^ Used to resolve relative references when we don't know what the scope- -- of the current schema is. This only happens with starting schemas- -- because if we're using a remote schema we had to know its URI in order- -- to fetch it.- --- -- Tracking the starting schema (instead of just resolving the reference to- -- the current schema being used for validation) is necessary for cases- -- where schemas are embedded inside one another. For instance in this- -- case not distinguishing the starting and "foo" schemas sends the code- -- into an infinite loop:- --- -- {- -- "additionalProperties": false,- -- "properties": {- -- "foo": {- -- "$ref": "#"- -- }- -- }- -- }- , _rsSchemaMap :: !(HashMap Text schema)- -- ^ Map of URIs to schemas.- } deriving (Eq, Show)---- | Keys are URIs (without URI fragments).-newtype URISchemaMap schema- = URISchemaMap { _unURISchemaMap :: HashMap Text schema }- deriving (Eq, Show)--data SchemaWithURI schema = SchemaWithURI- { _swSchema :: !schema- , _swURI :: !(Maybe Text)- -- ^ This is the URI identifying the document containing the schema.- -- It's different than the schema's "id" field, which controls scope- -- when resolving references contained in the schema.-- -- TODO: Make the no URI fragment requirement unnecessary.- } deriving (Eq, Show)--getReference :: ReferencedSchemas schema -> Maybe Text -> Maybe schema-getReference referenced Nothing = Just (_rsStarting referenced)-getReference referenced (Just t) = HM.lookup t (_rsSchemaMap referenced)------------------------------------------------------- * Fetch via HTTP-----------------------------------------------------data HTTPFailure- = HTTPParseFailure Text- | HTTPRequestFailure NC.HttpException- deriving Show---- | Take a schema. Retrieve every document either it or its subschemas--- include via the "$ref" keyword.-referencesViaHTTP'- :: forall schema. FromJSON schema- => FetchInfo schema- -> SchemaWithURI schema- -> IO (Either HTTPFailure (URISchemaMap schema))-referencesViaHTTP' info sw = do- manager <- NC.newManager NC.defaultManagerSettings- let f = referencesMethodAgnostic (getURL manager) info sw- catch (left HTTPParseFailure <$> f) handler- where- getURL :: NC.Manager -> Text -> IO BS.ByteString- getURL man url = do- request <- NC.parseUrlThrow (T.unpack url)- LBS.toStrict . NC.responseBody <$> NC.httpLbs request man-- handler- :: NC.HttpException- -> IO (Either HTTPFailure (URISchemaMap schema))- handler = pure . Left . HTTPRequestFailure------------------------------------------------------- * Fetch via Filesystem-----------------------------------------------------data FilesystemFailure- = FSParseFailure Text- | FSReadFailure IOException- deriving (Show, Eq)--referencesViaFilesystem'- :: forall schema. FromJSON schema- => FetchInfo schema- -> SchemaWithURI schema- -> IO (Either FilesystemFailure (URISchemaMap schema))-referencesViaFilesystem' info sw = catch (left FSParseFailure <$> f) handler- where- f :: IO (Either Text (URISchemaMap schema))- f = referencesMethodAgnostic (BS.readFile . T.unpack) info sw-- handler- :: IOException- -> IO (Either FilesystemFailure (URISchemaMap schema))- handler = pure . Left . FSReadFailure------------------------------------------------------- * Method Agnostic Fetching Tools------------------------------------------------------- | A version of 'fetchReferencedSchema's where the function to fetch--- schemas is provided by the user. This allows restrictions to be added,--- e.g. rejecting non-local URIs.-referencesMethodAgnostic- :: forall schema. FromJSON schema- => (Text -> IO BS.ByteString)- -> FetchInfo schema- -> SchemaWithURI schema- -> IO (Either Text (URISchemaMap schema))-referencesMethodAgnostic fetchRef info =- getRecursiveReferences fetchRef info (URISchemaMap mempty)--getRecursiveReferences- :: forall schema. FromJSON schema- => (Text -> IO BS.ByteString)- -> FetchInfo schema- -> URISchemaMap schema- -> SchemaWithURI schema- -> IO (Either Text (URISchemaMap schema))-getRecursiveReferences fetchRef info referenced sw =- foldM f (Right referenced) (includeSubschemas info sw)- where- f :: Either Text (URISchemaMap schema)- -> SchemaWithURI schema- -> IO (Either Text (URISchemaMap schema))- f (Left e) _ = pure (Left e)- f (Right (URISchemaMap usm)) (SchemaWithURI schema mUri) =- case newRef of- Nothing -> pure (Right (URISchemaMap usm))- Just uri -> do- bts <- fetchRef uri- case eitherDecodeStrict bts of- Left e -> pure . Left . T.pack $ e- Right schm -> getRecursiveReferences- fetchRef- info- (URISchemaMap (HM.insert uri schm usm))- (SchemaWithURI schm (Just uri))- where- newRef :: Maybe Text- newRef- | Just (Just uri,_) <- resolveReference mUri <$> _fiRef info schema- = case HM.lookup uri usm of- Nothing -> Just uri- Just _ -> Nothing- | otherwise = Nothing---- | Return the schema passed in as an argument, as well as every--- subschema contained within it.-includeSubschemas- :: forall schema.- FetchInfo schema- -> SchemaWithURI schema- -> [SchemaWithURI schema]-includeSubschemas info (SchemaWithURI schema mUri) =- SchemaWithURI schema mUri- : (includeSubschemas info =<< subSchemas)- where- subSchemas :: [SchemaWithURI schema]- subSchemas =- (\a -> SchemaWithURI a (updateResolutionScope mUri (_fiId info schema)))- <$> uncurry (<>) (_fiEmbedded info schema)
− src/Data/JsonSchema/Types.hs
@@ -1,36 +0,0 @@--module Data.JsonSchema.Types where--import Import--import Data.Validator.Types (Validator(..))--newtype Spec schema err- = Spec { _unSpec :: [Validator schema schema err] }---- | Return a schema's immediate subschemas.------ The first list is subschemas validating the same level of the document,--- the second list is subschemas validating lower levels (see--- 'Data.Validator.Types.Fail' for a full explanation).-embedded :: Spec schema a -> schema -> ([schema], [schema])-embedded spec schema =- let embeds = (\val -> _embedded val schema) <$> _unSpec spec- in foldl' (\(a,b) (x,y) -> (x <> a, y <> b)) (mempty, mempty) embeds--validate- :: Spec schema err- -> schema- -> Value- -> [err]-validate spec schema v =- (\val -> _validate val schema v) =<< _unSpec spec---- | A basic schema type that doesn't impose much structure.------ 'Data.JsonSchema.Draft4' doesn't use this, but instead uses the one--- defined in 'Data.JsonSchema.Draft4.Schema' to make it easier to write--- draft 4 schemas in Haskell.-newtype Schema- = Schema { _unSchema :: HashMap Text Value }- deriving (Eq, Show, FromJSON, ToJSON)
− src/Data/Validator/Draft4.hs
@@ -1,242 +0,0 @@--- | Turn the validation functions into actual 'Validator's.--module Data.Validator.Draft4- ( module Data.Validator.Draft4- , module Export- ) where--import Import--import qualified Data.HashMap.Strict as HM-import qualified Data.List.NonEmpty as NE-import Data.Maybe (catMaybes, maybe, maybeToList)-import Data.Text (Text)--import Data.Validator.Draft4.Any as Export-import Data.Validator.Draft4.Array as Export-import Data.Validator.Draft4.Number as Export-import Data.Validator.Draft4.Object as Export-import Data.Validator.Draft4.String as Export-import Data.Validator.Types (Validator(..))-import Data.Validator.Utils (fromJSONEither)---- | For internal use.------ Take a validation function, a possibly existing validator, and some data.--- If the validator is exists and can validate the type of data we have,--- attempt to do so and return any failures.-run :: FromJSON b => (a -> b -> Maybe c) -> Maybe a -> Value -> [c]-run _ Nothing _ = mempty-run f (Just a) b =- case fromJSONEither b of- Left _ -> mempty- Right c -> maybeToList (f a c)---- | For internal use.-noEmbedded :: a -> ([b], [b])-noEmbedded = const (mempty, mempty)------------------------------------------------------- * Numbers-----------------------------------------------------multipleOfValidator :: Validator a (Maybe MultipleOf) MultipleOfInvalid-multipleOfValidator = Validator noEmbedded (run multipleOfVal)--maximumValidator :: Validator a (Maybe Maximum) MaximumInvalid-maximumValidator = Validator noEmbedded (run maximumVal)--minimumValidator :: Validator a (Maybe Minimum) MinimumInvalid-minimumValidator = Validator noEmbedded (run minimumVal)------------------------------------------------------- * Strings-----------------------------------------------------maxLengthValidator :: Validator a (Maybe MaxLength) MaxLengthInvalid-maxLengthValidator = Validator noEmbedded (run maxLengthVal)--minLengthValidator :: Validator a (Maybe MinLength) MinLengthInvalid-minLengthValidator = Validator noEmbedded (run minLengthVal)--patternValidator :: Validator a (Maybe PatternValidator) PatternInvalid-patternValidator = Validator noEmbedded (run patternVal)------------------------------------------------------- * Arrays-----------------------------------------------------maxItemsValidator :: Validator a (Maybe MaxItems) MaxItemsInvalid-maxItemsValidator = Validator noEmbedded (run maxItemsVal)--minItemsValidator :: Validator a (Maybe MinItems) MinItemsInvalid-minItemsValidator = Validator noEmbedded (run minItemsVal)--uniqueItemsValidator :: Validator a (Maybe UniqueItems) UniqueItemsInvalid-uniqueItemsValidator = Validator noEmbedded (run uniqueItemsVal)--itemsRelatedValidator- :: (schema -> Value -> [err])- -> Validator schema (ItemsRelated schema) (ItemsRelatedInvalid err)-itemsRelatedValidator f =- Validator- (\a -> ( mempty- , case _irItems a of- Just (ItemsObject b) -> pure b- Just (ItemsArray cs) -> cs- Nothing -> mempty- <> case _irAdditional a of- Just (AdditionalObject b) -> pure b- _ -> mempty- ))- (\a b -> case fromJSONEither b of- Left _ -> mempty- Right c -> itemsRelatedVal f a c)------------------------------------------------------- * Objects-----------------------------------------------------maxPropertiesValidator- :: Validator- a- (Maybe MaxProperties)- MaxPropertiesInvalid-maxPropertiesValidator = Validator noEmbedded (run maxPropertiesVal)--minPropertiesValidator- :: Validator- a- (Maybe MinProperties)- MinPropertiesInvalid-minPropertiesValidator = Validator noEmbedded (run minPropertiesVal)--requiredValidator :: Validator a (Maybe Required) ()-requiredValidator = Validator noEmbedded (run requiredVal)--dependenciesValidator- :: (schema -> Value -> [err])- -> Validator- schema- (Maybe (DependenciesValidator schema))- (DependenciesInvalid err)-dependenciesValidator f =- Validator- (maybe mempty ( (\a -> (mempty, a))- . catMaybes . fmap checkDependency- . HM.elems . _unDependenciesValidator- ))- (run (dependenciesVal f))- where- checkDependency :: Dependency schema -> Maybe schema- checkDependency (PropertyDependency _) = Nothing- checkDependency (SchemaDependency s) = Just s--propertiesRelatedValidator- :: (schema -> Value -> [err])- -> Validator- schema- (PropertiesRelated schema)- (PropertiesRelatedInvalid err)-propertiesRelatedValidator f =- Validator- (\a -> ( mempty- , HM.elems (fromMaybe mempty (_propProperties a))- <> HM.elems (fromMaybe mempty (_propPattern a))- <> case _propAdditional a of- Just (AdditionalPropertiesObject b) -> [b]- _ -> mempty- ))- (\a b -> case fromJSONEither b of- Left _ -> mempty- Right c -> maybeToList (propertiesRelatedVal f a c))--newtype Definitions schema- = Definitions { _unDefinitions :: HashMap Text schema }- deriving (Eq, Show)--instance FromJSON schema => FromJSON (Definitions schema) where- parseJSON = withObject "Definitions" $ \o ->- Definitions <$> o .: "definitions"---- TODO: Add tests to the language agnostic test suite to--- make sure these schemas are embedded correctly--- (and do so for @"additionalItems"@ as well).-definitionsEmbedded- :: Validator- schema- (Maybe (Definitions schema))- err-definitionsEmbedded =- Validator- (\a -> case a of- Just (Definitions b) -> (mempty, HM.elems b)- Nothing -> (mempty, mempty))- (const (const mempty))------------------------------------------------------- * Any-----------------------------------------------------refValidator- :: (FromJSON schema, ToJSON schema)- => VisitedSchemas- -> Maybe Text- -> (Maybe Text -> Maybe schema)- -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err])- -> Validator a (Maybe Ref) (RefInvalid err)-refValidator visited scope getRef f =- Validator- noEmbedded- (run (refVal visited scope getRef f))--enumValidator :: Validator a (Maybe EnumValidator) EnumInvalid-enumValidator = Validator noEmbedded (run enumVal)--typeValidator :: Validator a (Maybe TypeContext) TypeValidatorInvalid-typeValidator = Validator noEmbedded (run typeVal)--allOfValidator- :: (schema -> Value -> [err])- -> Validator schema (Maybe (AllOf schema)) (AllOfInvalid err)-allOfValidator f =- Validator- (\a -> case a of- Just (AllOf b) -> (NE.toList b, mempty)- Nothing -> (mempty, mempty))- (run (allOfVal f))--anyOfValidator- :: (schema -> Value -> [err])- -> Validator schema (Maybe (AnyOf schema)) (AnyOfInvalid err)-anyOfValidator f =- Validator- (\a -> case a of- Just (AnyOf b) -> (NE.toList b, mempty)- Nothing -> (mempty, mempty))- (run (anyOfVal f))--oneOfValidator- :: ToJSON schema- => (schema -> Value -> [err])- -> Validator schema (Maybe (OneOf schema)) (OneOfInvalid err)-oneOfValidator f =- Validator- (\a -> case a of- Just (OneOf b) -> (NE.toList b, mempty)- Nothing -> (mempty, mempty))- (run (oneOfVal f))--notValidator- :: ToJSON schema- => (schema -> Value -> [err])- -> Validator- schema- (Maybe (NotValidator schema))- NotValidatorInvalid-notValidator f =- Validator- (\a -> case a of- Just (NotValidator b) -> (pure b, mempty)- Nothing -> (mempty, mempty))- (run (notVal f))
− src/Data/Validator/Draft4/Any.hs
@@ -1,350 +0,0 @@--module Data.Validator.Draft4.Any where--import Import--import Data.List.NonEmpty (NonEmpty((:|)))-import qualified Data.List.NonEmpty as NE-import qualified Data.Scientific as SCI-import Data.Semigroup (Semigroup) -- for older GHCs-import Data.Set (Set)-import qualified Data.Set as S-import qualified JSONPointer as JP--import qualified Data.Validator.Utils as UT-import Data.Validator.Reference (URIBaseAndFragment,- resolveFragment, resolveReference)------------------------------------------------------- * $ref-----------------------------------------------------newtype Ref- = Ref { _unRef :: Text }- deriving (Eq, Show)--instance FromJSON Ref where- parseJSON = withObject "Ref" $ \o ->- Ref <$> o .: "$ref"--data RefInvalid err- = RefResolution Text- -- ^ Indicates a reference that failed to resolve.- --- -- NOTE: The language agnostic test suite doesn't specify if this should- -- cause a validation error or should allow data to pass. We choose to- -- return a validation error.- --- -- Also note that ideally we would enforce in the type system that any- -- failing references be dealt with before valididation. Then this could- -- be removed entirely.- | RefPointerResolution Text- | RefLoop Text VisitedSchemas URIBaseAndFragment- | RefInvalid Text Value (NonEmpty err)- -- ^ 'Text' is the URI and 'Value' is the linked schema.- deriving (Eq, Show)--newtype VisitedSchemas- = VisitedSchemas { _unVisited :: [URIBaseAndFragment] }- deriving (Eq, Show, Semigroup, Monoid)--refVal- :: forall err schema. (FromJSON schema, ToJSON schema)- => VisitedSchemas- -> Maybe Text- -> (Maybe Text -> Maybe schema)- -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err])- -> Ref- -> Value- -> Maybe (RefInvalid err)-refVal visited scope getRef f (Ref reference) x- | (mURI, mFragment) `elem` _unVisited visited =- Just (RefLoop reference visited (mURI, mFragment))- | otherwise =- case getRef mURI of- Nothing -> Just (RefResolution reference)- Just schema ->- case resolveFragment mFragment schema of- Nothing -> Just (RefPointerResolution reference)- Just s ->- let newVisited = (VisitedSchemas [(mURI, mFragment)]- <> visited)- errs = f newVisited mURI s x- in RefInvalid reference (toJSON schema)- <$> NE.nonEmpty errs- where- (mURI, mFragment) = resolveReference scope reference------------------------------------------------------- * enum------------------------------------------------------- | From the spec:--- <http://json-schema.org/latest/json-schema-validation.html#anchor76>------ > The value of this keyword MUST be an array.--- > This array MUST have at least one element.--- > Elements in the array MUST be unique.------ NOTE: We don't enforce the uniqueness constraint in the haskell code,--- but we do in the 'FromJSON' instance.-newtype EnumValidator- = EnumValidator { _unEnumValidator :: NonEmpty Value }- -- Given a choice, we'd prefer to enforce uniqueness through the type- -- system over having at least one element. To use a 'Set' though we'd- -- have to use 'OrdValue' here (there's no 'Ord' instance for plain Values)- -- and we'd rather not make users mess with 'OrdValue'.- deriving (Eq, Show)--instance FromJSON EnumValidator where- parseJSON = withObject "EnumValidator" $ \o ->- EnumValidator <$> o .: "enum"--instance Arbitrary EnumValidator where- arbitrary = do- xs <- (fmap.fmap) UT._unArbitraryValue arbitrary- case NE.nonEmpty (toUnique xs) of- Nothing -> EnumValidator . pure . UT._unArbitraryValue <$> arbitrary- Just ne -> pure (EnumValidator ne)- where- toUnique :: [Value] -> [Value]- toUnique = fmap UT._unOrdValue . S.toList . S.fromList . fmap UT.OrdValue--data EnumInvalid- = EnumInvalid EnumValidator Value- deriving (Eq, Show)--enumVal :: EnumValidator -> Value -> Maybe EnumInvalid-enumVal a@(EnumValidator vs) x- | not (UT.allUniqueValues' vs) = Nothing- | x `elem` vs = Nothing- | otherwise = Just $ EnumInvalid a x------------------------------------------------------- * type------------------------------------------------------- | This is separate from 'TypeValidator' so that 'TypeValidator' can--- be used to write 'Data.JsonSchema.Draft4.Schema.Schema' without--- messing up the 'FromJSON' instance of that data type.-newtype TypeContext- = TypeContext { _unTypeContext :: TypeValidator }- deriving (Eq, Show)--instance FromJSON TypeContext where- parseJSON = withObject "TypeContext" $ \o ->- TypeContext <$> o .: "type"--data TypeValidator- = TypeValidatorString Text- | TypeValidatorArray (Set Text)- deriving (Eq, Show)--instance FromJSON TypeValidator where- parseJSON v = fmap TypeValidatorString (parseJSON v)- <|> fmap TypeValidatorArray (parseJSON v)--instance ToJSON TypeValidator where- toJSON (TypeValidatorString t) = toJSON t- toJSON (TypeValidatorArray ts) = toJSON ts--instance Arbitrary TypeValidator where- arbitrary = oneof [ TypeValidatorString <$> UT.arbitraryText- , TypeValidatorArray <$> UT.arbitrarySetOfText- ]--data TypeValidatorInvalid- = TypeValidatorInvalid TypeValidator Value- deriving (Eq, Show)--typeVal :: TypeContext -> Value -> Maybe TypeValidatorInvalid-typeVal (TypeContext tv) x- | S.null matches = Just (TypeValidatorInvalid tv x)- | otherwise = Nothing- where- -- There can be more than one match because a 'Value' can be both a- -- @"number"@ and an @"integer"@.- matches :: Set Text- matches = S.intersection okTypes (setFromTypeValidator tv)-- okTypes :: Set Text- okTypes =- case x of- Null -> S.singleton "null"- (Array _) -> S.singleton "array"- (Bool _) -> S.singleton "boolean"- (Object _) -> S.singleton "object"- (String _) -> S.singleton "string"- (Number y) ->- if SCI.isInteger y- then S.fromList ["number", "integer"]- else S.singleton "number"---- | Internal.-setFromTypeValidator :: TypeValidator -> Set Text-setFromTypeValidator (TypeValidatorString t) = S.singleton t-setFromTypeValidator (TypeValidatorArray ts) = ts------------------------------------------------------- * allOf-----------------------------------------------------newtype AllOf schema- = AllOf { _unAllOf :: NonEmpty schema }- deriving (Eq, Show)--instance FromJSON schema => FromJSON (AllOf schema) where- parseJSON = withObject "AllOf" $ \o ->- AllOf <$> o .: "allOf"--newtype AllOfInvalid err- = AllOfInvalid (NonEmpty (JP.Index, NonEmpty err))- deriving (Eq, Show)--allOfVal- :: forall err schema.- (schema -> Value -> [err])- -> AllOf schema- -> Value- -> Maybe (AllOfInvalid err)-allOfVal f (AllOf subSchemas) x = AllOfInvalid <$> NE.nonEmpty failures- where- perhapsFailures :: [(JP.Index, [err])]- perhapsFailures = zip (JP.Index <$> [0..])- (flip f x <$> NE.toList subSchemas)-- failures :: [(JP.Index, NonEmpty err)]- failures = mapMaybe (traverse NE.nonEmpty) perhapsFailures------------------------------------------------------- * anyOf-----------------------------------------------------newtype AnyOf schema- = AnyOf { _unAnyOf :: NonEmpty schema }- deriving (Eq, Show)--instance FromJSON schema => FromJSON (AnyOf schema) where- parseJSON = withObject "AnyOf" $ \o ->- AnyOf <$> o .: "anyOf"--newtype AnyOfInvalid err- = AnyOfInvalid (NonEmpty (JP.Index, NonEmpty err))- deriving (Eq, Show)--anyOfVal- :: forall err schema.- (schema -> Value -> [err])- -> AnyOf schema- -> Value- -> Maybe (AnyOfInvalid err)-anyOfVal f (AnyOf subSchemas) x- -- Replace with @null@ once we drop GHC 7.8:- | any (((==) 0 . length) . snd) perhapsFailures = Nothing- | otherwise = AnyOfInvalid <$> NE.nonEmpty failures- where- perhapsFailures :: [(JP.Index, [err])]- perhapsFailures = zip (JP.Index <$> [0..])- (flip f x <$> NE.toList subSchemas)-- failures :: [(JP.Index, NonEmpty err)]- failures = mapMaybe (traverse NE.nonEmpty) perhapsFailures------------------------------------------------------- * oneOf-----------------------------------------------------newtype OneOf schema- = OneOf { _unOneOf :: NonEmpty schema }- deriving (Eq, Show)--instance FromJSON schema => FromJSON (OneOf schema) where- parseJSON = withObject "OneOf" $ \o ->- OneOf <$> o .: "oneOf"--data OneOfInvalid err- = TooManySuccesses (NonEmpty (JP.Index, Value)) Value- -- ^ The NonEmpty lists contains tuples whose contents- -- are the index of a schema that validated the data- -- and the contents of that schema.- | NoSuccesses (NonEmpty (JP.Index, NonEmpty err)) Value- -- ^ The NonEmpty lists contains tuples whose contents- -- are the index of a schema that failed to validate the data- -- and the failures it produced.- deriving (Eq, Show)--oneOfVal- :: forall err schema. ToJSON schema- => (schema -> Value -> [err])- -> OneOf schema- -> Value- -> Maybe (OneOfInvalid err)-oneOfVal f (OneOf (firstSubSchema :| otherSubSchemas)) x =- -- Producing the NonEmpty lists needed by the error constructors- -- is a little tricky. If we had a partition function like this- -- it might help:- -- @- -- (a -> Either b c) -> NonEmpty a -> Either (NonEmpty b, [c])- -- ([b], NonEmpty c)- -- @- case (firstSuccess, otherSuccesses) of- (Right _, Nothing) -> Nothing- (Right a, Just successes) -> Just (TooManySuccesses- (a NE.<| successes) x)- (Left e, Nothing) -> Just (NoSuccesses (e :| otherFailures) x)- (Left _, Just (_ :| [])) -> Nothing- (Left _, Just successes) -> Just (TooManySuccesses successes x)- where- firstSuccess :: Either (JP.Index, NonEmpty err) (JP.Index, Value)- firstSuccess =- case NE.nonEmpty (f firstSubSchema x) of- Nothing -> Right (JP.Index 0, toJSON firstSubSchema)- Just errs -> Left (JP.Index 0, errs)-- otherPerhapsFailures :: [(JP.Index, Value, [err])]- otherPerhapsFailures =- zipWith- (\index schema -> (index, toJSON schema, f schema x))- (JP.Index <$> [0..])- otherSubSchemas-- otherSuccesses :: Maybe (NonEmpty (JP.Index, Value))- otherSuccesses = NE.nonEmpty- $ mapMaybe (\(index,val,errs) ->- case errs of- [] -> Just (index,val)- _ -> Nothing- ) otherPerhapsFailures-- otherFailures :: [(JP.Index, NonEmpty err)]- otherFailures = mapMaybe (traverse NE.nonEmpty . mid) otherPerhapsFailures-- mid :: (a,b,c) -> (a,c)- mid (a,_,c) = (a,c)------------------------------------------------------- * not-----------------------------------------------------newtype NotValidator schema- = NotValidator { _unNotValidator :: schema }- deriving (Eq, Show)--instance FromJSON schema => FromJSON (NotValidator schema) where- parseJSON = withObject "NotValidator" $ \o ->- NotValidator <$> o .: "not"--data NotValidatorInvalid- = NotValidatorInvalid Value Value- deriving (Eq, Show)--notVal- :: ToJSON schema =>- (schema -> Value -> [err])- -> NotValidator schema- -> Value- -> Maybe NotValidatorInvalid-notVal f (NotValidator schema) x =- case f schema x of- [] -> Just (NotValidatorInvalid (toJSON schema) x)- _ -> Nothing
− src/Data/Validator/Draft4/Array.hs
@@ -1,224 +0,0 @@--module Data.Validator.Draft4.Array where--import Import--import qualified Data.List.NonEmpty as NE-import qualified Data.Vector as V-import qualified JSONPointer as JP--import Data.Validator.Utils (allUniqueValues)------------------------------------------------------- * maxItems-----------------------------------------------------newtype MaxItems- = MaxItems { _unMaxItems :: Int }- deriving (Eq, Show)--instance FromJSON MaxItems where- parseJSON = withObject "MaxItems" $ \o ->- MaxItems <$> o .: "maxItems"--data MaxItemsInvalid- = MaxItemsInvalid MaxItems (Vector Value)- deriving (Eq, Show)---- | The spec requires @"maxItems"@ to be non-negative.-maxItemsVal :: MaxItems -> Vector Value -> Maybe MaxItemsInvalid-maxItemsVal a@(MaxItems n) xs- | n < 0 = Nothing- | V.length xs > n = Just (MaxItemsInvalid a xs)- | otherwise = Nothing------------------------------------------------------- * minItems-----------------------------------------------------newtype MinItems- = MinItems { _unMinItems :: Int }- deriving (Eq, Show)--instance FromJSON MinItems where- parseJSON = withObject "MinItems" $ \o ->- MinItems <$> o .: "minItems"--data MinItemsInvalid- = MinItemsInvalid MinItems (Vector Value)- deriving (Eq, Show)---- | The spec requires @"minItems"@ to be non-negative.-minItemsVal :: MinItems -> Vector Value -> Maybe MinItemsInvalid-minItemsVal a@(MinItems n) xs- | n < 0 = Nothing- | V.length xs < n = Just (MinItemsInvalid a xs)- | otherwise = Nothing------------------------------------------------------- * uniqueItems-----------------------------------------------------newtype UniqueItems- = UniqueItems { _unUniqueItems :: Bool }- deriving (Eq, Show)--instance FromJSON UniqueItems where- parseJSON = withObject "UniqueItems" $ \o ->- UniqueItems <$> o .: "uniqueItems"--data UniqueItemsInvalid- = UniqueItemsInvalid (Vector Value)- deriving (Eq, Show)--uniqueItemsVal :: UniqueItems -> Vector Value -> Maybe UniqueItemsInvalid-uniqueItemsVal (UniqueItems True) xs- | allUniqueValues xs = Nothing- | otherwise = Just (UniqueItemsInvalid xs)-uniqueItemsVal (UniqueItems False) _ = Nothing------------------------------------------------------- * items-----------------------------------------------------data ItemsRelated schema = ItemsRelated- { _irItems :: Maybe (Items schema)- , _irAdditional :: Maybe (AdditionalItems schema)- } deriving (Eq, Show)--instance FromJSON schema => FromJSON (ItemsRelated schema) where- parseJSON = withObject "ItemsRelated" $ \o -> ItemsRelated- <$> o .:! "items"- <*> o .:! "additionalItems"--emptyItems :: ItemsRelated schema-emptyItems = ItemsRelated- { _irItems = Nothing- , _irAdditional = Nothing- }--data Items schema- = ItemsObject schema- | ItemsArray [schema]- deriving (Eq, Show)--instance FromJSON schema => FromJSON (Items schema) where- parseJSON v = fmap ItemsObject (parseJSON v)- <|> fmap ItemsArray (parseJSON v)--instance ToJSON schema => ToJSON (Items schema) where- toJSON (ItemsObject hm) = toJSON hm- toJSON (ItemsArray schemas) = toJSON schemas--instance Arbitrary schema => Arbitrary (Items schema) where- arbitrary = oneof [ ItemsObject <$> arbitrary- , ItemsArray <$> arbitrary- ]--data ItemsRelatedInvalid err- = IRInvalidItems (ItemsInvalid err)- | IRInvalidAdditional (AdditionalItemsInvalid err)- deriving (Eq, Show)--data ItemsInvalid err- = ItemsObjectInvalid (NonEmpty (JP.Index, NonEmpty err))- | ItemsArrayInvalid (NonEmpty (JP.Index, NonEmpty err))- deriving (Eq, Show)---- | @"additionalItems"@ only matters if @"items"@ exists--- and is a JSON Array.-itemsRelatedVal- :: forall err schema.- (schema -> Value -> [err])- -> ItemsRelated schema- -> Vector Value- -> [ItemsRelatedInvalid err] -- NOTE: 'Data.These' would help here.-itemsRelatedVal f a xs =- let (itemsFailure, remaining) = case _irItems a of- Nothing -> (Nothing, mempty)- Just b -> itemsVal f b xs- additionalFailure = (\b -> additionalItemsVal f b remaining)- =<< _irAdditional a- in catMaybes [ IRInvalidItems <$> itemsFailure- , IRInvalidAdditional <$> additionalFailure- ]---- | Internal.------ This is because 'itemsRelated' handles @"items"@ validation.-itemsVal- :: forall err schema.- (schema -> Value -> [err])- -> Items schema- -> Vector Value- -> (Maybe (ItemsInvalid err), [(JP.Index, Value)])- -- ^ The second item in the tuple is the elements of the original- -- JSON Array still remaining to be checked by @"additionalItems"@.-itemsVal f a xs =- case a of- ItemsObject subSchema ->- case NE.nonEmpty (mapMaybe (validateElem subSchema) indexed) of- Nothing -> (Nothing, mempty)- Just errs -> (Just (ItemsObjectInvalid errs), mempty)- ItemsArray subSchemas ->- let remaining = drop (length subSchemas) indexed- res = catMaybes (zipWith validateElem subSchemas indexed)- in case NE.nonEmpty res of- Nothing -> (Nothing, remaining)- Just errs -> (Just (ItemsArrayInvalid errs), remaining)- where- indexed :: [(JP.Index, Value)]- indexed = zip (JP.Index <$> [0..]) (V.toList xs)-- validateElem- :: schema- -> (JP.Index, Value)- -> Maybe (JP.Index, NonEmpty err)- validateElem schema (index,x) = (index,) <$> NE.nonEmpty (f schema x)------------------------------------------------------- * additionalItems-----------------------------------------------------data AdditionalItems schema- = AdditionalBool Bool- | AdditionalObject schema- deriving (Eq, Show)--instance FromJSON schema => FromJSON (AdditionalItems schema) where- parseJSON v = fmap AdditionalBool (parseJSON v)- <|> fmap AdditionalObject (parseJSON v)--instance ToJSON schema => ToJSON (AdditionalItems schema) where- toJSON (AdditionalBool b) = toJSON b- toJSON (AdditionalObject hm) = toJSON hm--instance Arbitrary schema => Arbitrary (AdditionalItems schema) where- arbitrary = oneof [ AdditionalBool <$> arbitrary- , AdditionalObject <$> arbitrary- ]--data AdditionalItemsInvalid err- = AdditionalItemsBoolInvalid (NonEmpty (JP.Index, Value))- | AdditionalItemsObjectInvalid (NonEmpty (JP.Index, NonEmpty err))- deriving (Eq, Show)---- | Internal.------ This is because 'itemsRelated' handles @"additionalItems"@ validation.-additionalItemsVal- :: forall err schema.- (schema -> Value -> [err])- -> AdditionalItems schema- -> [(JP.Index, Value)]- -- ^ The elements remaining to validate after the ones covered by- -- @"items"@ have been removed.- -> Maybe (AdditionalItemsInvalid err)-additionalItemsVal _ (AdditionalBool True) _ = Nothing-additionalItemsVal _ (AdditionalBool False) xs =- AdditionalItemsBoolInvalid <$> NE.nonEmpty xs-additionalItemsVal f (AdditionalObject subSchema) xs =- let res = mapMaybe- (\(index,x) -> (index,) <$> NE.nonEmpty (f subSchema x))- xs- in AdditionalItemsObjectInvalid <$> NE.nonEmpty res
− src/Data/Validator/Draft4/Number.hs
@@ -1,84 +0,0 @@--module Data.Validator.Draft4.Number where--import Import--import Data.Fixed (mod')-import Data.Scientific (Scientific)------------------------------------------------------- * multipleOf-----------------------------------------------------newtype MultipleOf- = MultipleOf { _unMultipleOf :: Scientific }- deriving (Eq, Show)--instance FromJSON MultipleOf where- parseJSON = withObject "MultipleOf" $ \o ->- MultipleOf <$> o .: "multipleOf"--data MultipleOfInvalid- = MultipleOfInvalid MultipleOf Scientific- deriving (Eq, Show)---- | The spec requires @"multipleOf"@ to be positive.-multipleOfVal :: MultipleOf -> Scientific -> Maybe MultipleOfInvalid-multipleOfVal a@(MultipleOf n) x- | n <= 0 = Nothing- | x `mod'` n /= 0 = Just (MultipleOfInvalid a x)- | otherwise = Nothing------------------------------------------------------- * maximum-----------------------------------------------------data Maximum = Maximum- { _maximumExclusive :: Bool- , _maximumValue :: Scientific- } deriving (Eq, Show)--instance FromJSON Maximum where- parseJSON = withObject "Maximum" $ \o -> Maximum- <$> o .:! "exclusiveMaximum" .!= False- <*> o .: "maximum"--data MaximumInvalid- = MaximumInvalid Maximum Scientific- deriving (Eq, Show)--maximumVal- :: Maximum- -> Scientific- -> Maybe MaximumInvalid-maximumVal a@(Maximum exclusive n) x- | exclusive && x >= n = Just (MaximumInvalid a x)- | x > n = Just (MaximumInvalid a x)- | otherwise = Nothing------------------------------------------------------- * minimum-----------------------------------------------------data Minimum = Minimum- { _minimumExclusive :: Bool- , _minimumValue :: Scientific- } deriving (Eq, Show)--instance FromJSON Minimum where- parseJSON = withObject "Minimum" $ \o -> Minimum- <$> o .:! "exclusiveMinimum" .!= False- <*> o .: "minimum"--data MinimumInvalid- = MinimumInvalid Minimum Scientific- deriving (Eq, Show)--minimumVal- :: Minimum- -> Scientific- -> Maybe MinimumInvalid-minimumVal a@(Minimum exclusive n) x- | exclusive && x <= n = Just (MinimumInvalid a x)- | x < n = Just (MinimumInvalid a x)- | otherwise = Nothing
− src/Data/Validator/Draft4/Object.hs
@@ -1,179 +0,0 @@--module Data.Validator.Draft4.Object- ( module Data.Validator.Draft4.Object- , module Data.Validator.Draft4.Object.Properties- ) where--import Import--import qualified Data.HashMap.Strict as HM-import qualified Data.List.NonEmpty as NE-import Data.Set (Set)-import qualified Data.Set as S-import qualified Data.Text as T--import Data.Validator.Draft4.Object.Properties-import Data.Validator.Utils------------------------------------------------------- * maxProperties-----------------------------------------------------newtype MaxProperties- = MaxProperties { _unMaxProperties :: Int }- deriving (Eq, Show)--instance FromJSON MaxProperties where- parseJSON = withObject "MaxProperties" $ \o ->- MaxProperties <$> o .: "maxProperties"--data MaxPropertiesInvalid- = MaxPropertiesInvalid MaxProperties (HashMap Text Value)- deriving (Eq, Show)---- | The spec requires @"maxProperties"@ to be non-negative.-maxPropertiesVal- :: MaxProperties- -> HashMap Text Value- -> Maybe MaxPropertiesInvalid-maxPropertiesVal a@(MaxProperties n) x- | n < 0 = Nothing- | HM.size x > n = Just (MaxPropertiesInvalid a x)- | otherwise = Nothing------------------------------------------------------- * minProperties-----------------------------------------------------newtype MinProperties- = MinProperties { _unMinProperties :: Int }- deriving (Eq, Show)--instance FromJSON MinProperties where- parseJSON = withObject "MinProperties" $ \o ->- MinProperties <$> o .: "minProperties"--data MinPropertiesInvalid- = MinPropertiesInvalid MinProperties (HashMap Text Value)- deriving (Eq, Show)---- | The spec requires @"minProperties"@ to be non-negative.-minPropertiesVal- :: MinProperties- -> HashMap Text Value- -> Maybe MinPropertiesInvalid-minPropertiesVal a@(MinProperties n) x- | n < 0 = Nothing- | HM.size x < n = Just (MinPropertiesInvalid a x)- | otherwise = Nothing------------------------------------------------------- * required------------------------------------------------------- | From the spec:------ > The value of this keyword MUST be an array.--- > This array MUST have at least one element.--- > Elements of this array MUST be strings, and MUST be unique.-newtype Required- = Required { _unRequired :: Set Text }- deriving (Eq, Show)--instance FromJSON Required where- parseJSON = withObject "Required" $ \o ->- Required <$> o .: "required"--instance Arbitrary Required where- arbitrary = do- x <- arbitraryText -- Guarantee at least one element.- xs <- (fmap.fmap) T.pack arbitrary- pure . Required . S.fromList $ x:xs--requiredVal :: Required -> HashMap Text Value -> Maybe ()-requiredVal (Required ts) x- -- NOTE: When we no longer need to support GHCs before 7.10- -- we can use null from Prelude throughout the library- -- instead of specialized versions.- | S.null ts = Nothing- | HM.null (HM.difference hm x) = Nothing- | otherwise = Just () -- TODO- where- hm :: HashMap Text Bool- hm = foldl (\b a -> HM.insert a True b) mempty ts------------------------------------------------------- * dependencies-----------------------------------------------------newtype DependenciesValidator schema- = DependenciesValidator- { _unDependenciesValidator :: HashMap Text (Dependency schema) }- deriving (Eq, Show)--instance FromJSON schema => FromJSON (DependenciesValidator schema) where- parseJSON = withObject "DependenciesValidator" $ \o ->- DependenciesValidator <$> o .: "dependencies"--data Dependency schema- = SchemaDependency schema- | PropertyDependency (Set Text)- deriving (Eq, Show)--instance FromJSON schema => FromJSON (Dependency schema) where- parseJSON v = fmap SchemaDependency (parseJSON v)- <|> fmap PropertyDependency (parseJSON v)--instance ToJSON schema => ToJSON (Dependency schema) where- toJSON (SchemaDependency schema) = toJSON schema- toJSON (PropertyDependency ts) = toJSON ts--instance Arbitrary schema => Arbitrary (Dependency schema) where- arbitrary = oneof [ SchemaDependency <$> arbitrary- , PropertyDependency <$> arbitrarySetOfText- ]--data DependencyMemberInvalid err- = SchemaDepInvalid (NonEmpty err)- | PropertyDepInvalid (Set Text) (HashMap Text Value)- deriving (Eq, Show)--data DependenciesInvalid err- = DependenciesInvalid (HashMap Text (DependencyMemberInvalid err))- deriving (Eq, Show)---- | From the spec:--- <http://json-schema.org/latest/json-schema-validation.html#anchor70>------ > This keyword's value MUST be an object.--- > Each value of this object MUST be either an object or an array.--- >--- > If the value is an object, it MUST be a valid JSON Schema.--- > This is called a schema dependency.--- >--- > If the value is an array, it MUST have at least one element.--- > Each element MUST be a string, and elements in the array MUST be unique.--- > This is called a property dependency.-dependenciesVal- :: forall err schema.- (schema -> Value -> [err])- -> DependenciesValidator schema- -> HashMap Text Value- -> Maybe (DependenciesInvalid err)-dependenciesVal f (DependenciesValidator hm) x =- let res = HM.mapMaybeWithKey g hm- in if HM.null res- then Nothing- else Just (DependenciesInvalid res)- where- g :: Text -> Dependency schema -> Maybe (DependencyMemberInvalid err)- g k (SchemaDependency schema)- | HM.member k x = SchemaDepInvalid- <$> NE.nonEmpty (f schema (Object x))- | otherwise = Nothing- g k (PropertyDependency ts)- | HM.member k x && not allPresent = Just (PropertyDepInvalid ts x)- | otherwise = Nothing- where- allPresent :: Bool- allPresent = all (`HM.member` x) ts
− src/Data/Validator/Draft4/Object/Properties.hs
@@ -1,209 +0,0 @@--module Data.Validator.Draft4.Object.Properties where--import Import--import qualified Data.Hashable as HA-import qualified Data.HashMap.Strict as HM-import qualified Data.List.NonEmpty as NE-import Data.Text.Encoding (encodeUtf8)-import qualified JSONPointer as JP-import qualified Text.Regex.PCRE.Heavy as RE--data PropertiesRelated schema = PropertiesRelated- { _propProperties :: Maybe (HashMap Text schema)- , _propPattern :: Maybe (HashMap Text schema)- , _propAdditional :: Maybe (AdditionalProperties schema)- } deriving (Eq, Show)--instance FromJSON schema => FromJSON (PropertiesRelated schema) where- parseJSON = withObject "PropertiesRelated" $ \o -> PropertiesRelated- <$> o .:! "properties"- <*> o .:! "patternProperties"- <*> o .:! "additionalProperties"--emptyProperties :: PropertiesRelated schema-emptyProperties = PropertiesRelated- { _propProperties = Nothing- , _propPattern = Nothing- , _propAdditional = Nothing- }--data AdditionalProperties schema- = AdditionalPropertiesBool Bool- | AdditionalPropertiesObject schema- deriving (Eq, Show)--instance FromJSON schema => FromJSON (AdditionalProperties schema) where- parseJSON v = fmap AdditionalPropertiesBool (parseJSON v)- <|> fmap AdditionalPropertiesObject (parseJSON v)--instance ToJSON schema => ToJSON (AdditionalProperties schema) where- toJSON (AdditionalPropertiesBool b) = toJSON b- toJSON (AdditionalPropertiesObject hm) = toJSON hm--instance Arbitrary schema => Arbitrary (AdditionalProperties schema) where- arbitrary = oneof [ AdditionalPropertiesBool <$> arbitrary- , AdditionalPropertiesObject <$> arbitrary- ]---- | A glorified @type@ alias.-newtype Regex- = Regex { _unRegex :: Text }- deriving (Eq, Show, Generic)--instance HA.Hashable Regex---- NOTE: We'd like to enforce that at least one error exists here.-data PropertiesRelatedInvalid err = PropertiesRelatedInvalid- { _prInvalidProperties :: HashMap Text [err]- , _prInvalidPattern :: HashMap (Regex, JP.Key) [err]- , _prInvalidAdditional :: Maybe (APInvalid err)- } deriving (Eq, Show)--data APInvalid err- = APBoolInvalid (HashMap Text Value)- | APObjectInvalid (HashMap Text (NonEmpty err))- deriving (Eq, Show)---- | First @"properties"@ and @"patternProperties"@ are run simultaneously--- on the data, then @"additionalProperties"@ is run on the remainder.-propertiesRelatedVal- :: forall err schema.- (schema -> Value -> [err])- -> PropertiesRelated schema- -> HashMap Text Value- -> Maybe (PropertiesRelatedInvalid err)-propertiesRelatedVal f props x- | all null (HM.elems propFailures)- && all null (HM.elems patFailures)- && isNothing addFailures = Nothing- | otherwise =- Just PropertiesRelatedInvalid- { _prInvalidProperties = propFailures- , _prInvalidPattern = patFailures- , _prInvalidAdditional = addFailures- }- where- propertiesHm :: HashMap Text schema- propertiesHm = fromMaybe mempty (_propProperties props)-- patHm :: HashMap Text schema- patHm = fromMaybe mempty (_propPattern props)-- propAndUnmatched :: (HashMap Text [err], Remaining)- propAndUnmatched = ( HM.intersectionWith f propertiesHm x- , Remaining (HM.difference x propertiesHm)- )-- (propFailures, propRemaining) = propAndUnmatched-- patAndUnmatched :: (HashMap (Regex, JP.Key) [err], Remaining)- patAndUnmatched = patternAndUnmatched f patHm x-- (patFailures, patRemaining) = patAndUnmatched-- finalRemaining :: Remaining- finalRemaining = Remaining (HM.intersection (_unRemaining patRemaining)- (_unRemaining propRemaining))-- addFailures :: Maybe (APInvalid err)- addFailures = (\addProp -> additionalProperties f addProp finalRemaining)- =<< _propAdditional props---- | Internal.-newtype Remaining- = Remaining { _unRemaining :: HashMap Text Value }---- | Internal.-patternAndUnmatched- :: forall err schema.- (schema -> Value -> [err])- -> HashMap Text schema- -> HashMap Text Value- -> (HashMap (Regex, JP.Key) [err], Remaining)-patternAndUnmatched f patPropertiesHm x =- (HM.foldlWithKey' runMatches mempty perhapsMatches, remaining)- where- -- @[(Regex, schema)]@ will have one item per match.- perhapsMatches :: HashMap Text ([(Regex, schema)], Value)- perhapsMatches =- HM.foldlWithKey' (matchingSchemas patPropertiesHm) mempty x- where- matchingSchemas- :: HashMap Text schema- -> HashMap Text ([(Regex, schema)], Value)- -> Text- -> Value- -> HashMap Text ([(Regex, schema)], Value)- matchingSchemas subSchemas acc k v =- HM.insert k- (HM.foldlWithKey' (checkKey k) mempty subSchemas, v)- acc-- checkKey- :: Text- -> [(Regex, schema)]- -> Text- -> schema- -> [(Regex, schema)]- checkKey k acc r subSchema =- case RE.compileM (encodeUtf8 r) mempty of- Left _ -> acc- Right re -> if k RE.=~ re- then (Regex r, subSchema) : acc- else acc-- runMatches- :: HashMap (Regex, JP.Key) [err]- -> Text- -> ([(Regex, schema)], Value)- -> HashMap (Regex, JP.Key) [err]- runMatches acc k (matches,v) =- foldr runMatch acc matches- where- runMatch- :: (Regex, schema)- -> HashMap (Regex, JP.Key) [err]- -> HashMap (Regex, JP.Key) [err]- runMatch (r,schema) = HM.insert (r, JP.Key k) (f schema v)-- remaining :: Remaining- remaining = Remaining . fmap snd . HM.filter (null . fst) $ perhapsMatches---- Internal.-additionalProperties- :: forall err schema.- (schema -> Value -> [err])- -> AdditionalProperties schema- -> Remaining- -> Maybe (APInvalid err)-additionalProperties f a x =- case a of- AdditionalPropertiesBool b ->- APBoolInvalid <$> additionalPropertiesBool b x- AdditionalPropertiesObject b ->- APObjectInvalid <$> additionalPropertiesObject f b x---- | Internal.-additionalPropertiesBool- :: Bool- -> Remaining- -> Maybe (HashMap Text Value)-additionalPropertiesBool True _ = Nothing-additionalPropertiesBool False (Remaining x)- | HM.size x > 0 = Just x- | otherwise = Nothing---- | Internal.-additionalPropertiesObject- :: forall err schema.- (schema -> Value -> [err])- -> schema- -> Remaining- -> Maybe (HashMap Text (NonEmpty err))-additionalPropertiesObject f schema (Remaining x) =- let errs = HM.mapMaybe (NE.nonEmpty . f schema) x- in if HM.null errs- then Nothing- else Just errs
− src/Data/Validator/Draft4/String.hs
@@ -1,79 +0,0 @@--module Data.Validator.Draft4.String where--import Import--import qualified Data.Text as T-import Data.Text.Encoding (encodeUtf8)-import qualified Text.Regex.PCRE.Heavy as RE------------------------------------------------------- * maxLength-----------------------------------------------------newtype MaxLength- = MaxLength { _unMaxLength :: Int }- deriving (Eq, Show)--instance FromJSON MaxLength where- parseJSON = withObject "MaxLength" $ \o ->- MaxLength <$> o .: "maxLength"--data MaxLengthInvalid- = MaxLengthInvalid MaxLength Text- deriving (Eq, Show)---- | The spec requires @"maxLength"@ to be non-negative.-maxLengthVal :: MaxLength -> Text -> Maybe MaxLengthInvalid-maxLengthVal a@(MaxLength n) x- | n <= 0 = Nothing- | T.length x > n = Just (MaxLengthInvalid a x)- | otherwise = Nothing------------------------------------------------------- * minLength-----------------------------------------------------newtype MinLength- = MinLength { _unMinLength :: Int }- deriving (Eq, Show)--instance FromJSON MinLength where- parseJSON = withObject "MinLength" $ \o ->- MinLength <$> o .: "minLength"--data MinLengthInvalid- = MinLengthInvalid MinLength Text- deriving (Eq, Show)---- | The spec requires @"minLength"@ to be non-negative.-minLengthVal :: MinLength -> Text -> Maybe MinLengthInvalid-minLengthVal a@(MinLength n) x- | n <= 0 = Nothing- | T.length x < n = Just (MinLengthInvalid a x)- | otherwise = Nothing------------------------------------------------------- * pattern-----------------------------------------------------newtype PatternValidator- = PatternValidator { _unPatternValidator :: Text }- deriving (Eq, Show)--instance FromJSON PatternValidator where- parseJSON = withObject "PatternValidator" $ \o ->- PatternValidator <$> o .: "pattern"--data PatternInvalid- = PatternNotRegex -- TODO: let these pass successfully?- | PatternInvalid PatternValidator Text- deriving (Eq, Show)--patternVal :: PatternValidator -> Text -> Maybe PatternInvalid-patternVal a@(PatternValidator t) x =- case RE.compileM (encodeUtf8 t) mempty of- Left _ -> Just PatternNotRegex- Right re -> if x RE.=~ re- then Nothing- else Just (PatternInvalid a x)
− src/Data/Validator/Reference.hs
@@ -1,79 +0,0 @@--- | JSON Reference is described here:--- <http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03>------ And is extended for JSON Schema here:--- <http://json-schema.org/latest/json-schema-core.html#anchor26>--module Data.Validator.Reference where--import Import--import qualified Data.Text as T-import Data.Text.Encoding (decodeUtf8, encodeUtf8)-import qualified JSONPointer as JP-import Network.HTTP.Types.URI (urlDecode)-import System.FilePath ((</>), dropFileName)---- | TODO: Replace these with actual URI data types.-type URIBase = Maybe Text-type URIBaseAndFragment = (Maybe Text, Maybe Text)--updateResolutionScope :: URIBase -> Maybe Text -> URIBase-updateResolutionScope mScope idKeyword- | Just t <- idKeyword = fst . baseAndFragment $ resolveScopeAgainst mScope t- | otherwise = mScope--resolveReference :: URIBase -> Text -> URIBaseAndFragment-resolveReference mScope t = baseAndFragment $ resolveScopeAgainst mScope t--resolveFragment- :: (FromJSON schema, ToJSON schema)- => Maybe Text- -> schema- -> Maybe schema-resolveFragment Nothing schema = Just schema-resolveFragment (Just pointer) schema = do- let urlDecoded = decodeUtf8 . urlDecode True . encodeUtf8 $ pointer- p <- either (const Nothing) Just (JP.unescape urlDecoded)- x <- either (const Nothing) Just (JP.resolve p (toJSON schema))- case fromJSON x of- Error _ -> Nothing- Success schema' -> Just schema'------------------------------------------------------- * Helpers-----------------------------------------------------isRemoteReference :: Text -> Bool-isRemoteReference = T.isInfixOf "://"--baseAndFragment :: Text -> URIBaseAndFragment-baseAndFragment = f . T.splitOn "#"- where- f :: [Text] -> URIBaseAndFragment- f [x] = (g x, Nothing)- f [x,y] = (g x, g y)- f _ = (Nothing, Nothing)-- g "" = Nothing- g x = Just x--resolveScopeAgainst :: Maybe Text -> Text -> Text-resolveScopeAgainst Nothing t = t-resolveScopeAgainst (Just scope) t- | isRemoteReference t = t- | otherwise = smartAppend- where- -- There shouldn't be a fragment at the end of a scope URI,- -- but just in case a user leaves one in we want to be sure- -- to cut it off before appending.- smartAppend :: Text- smartAppend =- case baseAndFragment scope of- (Just base,_) ->- case T.unpack t of- -- We want "/foo" and "#/bar" to combine into- -- "/foo#/bar" not "/foo/#/bar".- '#':_ -> base <> t- _ -> T.pack (dropFileName (T.unpack base) </> T.unpack t)- _ -> t
− src/Data/Validator/Types.hs
@@ -1,23 +0,0 @@--module Data.Validator.Types where--import Import--import Data.Profunctor (Profunctor(..))--data Validator schema val err = Validator- { _embedded :: val -> ([schema], [schema])- -- ^ The first list is embedded schemas that validate the same piece- -- of data this schema validates (such as schemas embedded in 'allOf').- -- The second is embedded schemas that validate a subset of that data- -- (such as the schemas embedded in 'items').- --- -- This is done to allow static detection of loops, though this isn't- -- implemented yet (though the Draft4 code does do live loop detection- -- during validation).- , _validate :: val -> Value -> [err]- } deriving Functor--instance Profunctor (Validator schema) where- lmap f (Validator a b) = Validator (lmap f a) (lmap f b)- rmap = fmap
− src/Data/Validator/Utils.hs
@@ -1,135 +0,0 @@--module Data.Validator.Utils where--import Import--import Control.Monad (fail)-import qualified Data.HashMap.Strict as HM-import qualified Data.List.NonEmpty as NE-import Data.Scientific (Scientific, fromFloatDigits)-import Data.Set (Set)-import qualified Data.Set as S-import qualified Data.Text as T-import qualified Data.Vector as V------------------------------------------------------- * QuickCheck-----------------------------------------------------arbitraryText :: Gen Text-arbitraryText = T.pack <$> arbitrary--arbitraryScientific :: Gen Scientific-arbitraryScientific = (fromFloatDigits :: Double -> Scientific) <$> arbitrary--arbitraryPositiveScientific :: Gen Scientific-arbitraryPositiveScientific = (fromFloatDigits :: Double -> Scientific)- . getPositive- <$> arbitrary--newtype ArbitraryValue- = ArbitraryValue { _unArbitraryValue :: Value }- deriving (Eq, Show)--instance Arbitrary ArbitraryValue where- arbitrary = ArbitraryValue <$> sized f- where- f :: Int -> Gen Value- f n | n <= 1 = oneof nonRecursive- | otherwise = oneof $- fmap (Array . V.fromList) (traverse (const (f (n `div` 10)))- =<< (arbitrary :: Gen [()]))- : fmap (Object . HM.fromList) (traverse (const (g (n `div` 10)))- =<< (arbitrary :: Gen [()]))- : nonRecursive-- g :: Int -> Gen (Text, Value)- g n = (,) <$> arbitraryText <*> f n-- nonRecursive :: [Gen Value]- nonRecursive =- [ pure Null- , Bool <$> arbitrary- , String <$> arbitraryText- , Number <$> arbitraryScientific- ]--arbitraryHashMap :: Arbitrary a => Gen (HashMap Text a)-arbitraryHashMap = HM.fromList . fmap (first T.pack) <$> arbitrary--arbitrarySetOfText :: Gen (Set Text)-arbitrarySetOfText = S.fromList . fmap T.pack <$> arbitrary--newtype NonEmpty' a = NonEmpty' { _unNonEmpty' :: NonEmpty a }--instance FromJSON a => FromJSON (NonEmpty' a) where- parseJSON v = do- xs <- parseJSON v- case NE.nonEmpty xs of- Nothing -> fail "Must have at least one item."- Just ne -> pure (NonEmpty' ne)--instance ToJSON a => ToJSON (NonEmpty' a) where- toJSON = toJSON . NE.toList . _unNonEmpty'--instance Arbitrary a => Arbitrary (NonEmpty' a) where- arbitrary = do- xs <- arbitrary- case NE.nonEmpty xs of- Nothing -> NonEmpty' . pure <$> arbitrary- Just ne -> pure (NonEmpty' ne)------------------------------------------------------- * allUniqueValues-----------------------------------------------------allUniqueValues :: Vector Value -> Bool-allUniqueValues = allUnique . fmap OrdValue . V.toList---- NOTE: When we no longer support GHC 7.8 we can generalize--- allUnique to work on any Foldable and remove this function.-allUniqueValues' :: NonEmpty Value -> Bool-allUniqueValues' = allUnique . fmap OrdValue . NE.toList--allUnique :: (Ord a) => [a] -> Bool-allUnique xs = S.size (S.fromList xs) == length xs---- | OrdValue's Ord instance needs benchmarking, but it allows us to--- use our 'allUnique' function instead of O(n^2) nub, so it's probably--- worth it.-newtype OrdValue = OrdValue { _unOrdValue :: Value } deriving Eq--instance Ord OrdValue where- (OrdValue Null) `compare` (OrdValue Null) = EQ- (OrdValue Null) `compare` _ = LT- _ `compare` (OrdValue Null) = GT-- (OrdValue (Bool x)) `compare` (OrdValue (Bool y)) = x `compare` y- (OrdValue (Bool _)) `compare` _ = LT- _ `compare` (OrdValue (Bool _)) = GT-- (OrdValue (Number x)) `compare` (OrdValue (Number y)) = x `compare` y- (OrdValue (Number _)) `compare` _ = LT- _ `compare` (OrdValue (Number _)) = GT-- (OrdValue (String x)) `compare` (OrdValue (String y)) = x `compare` y- (OrdValue (String _)) `compare` _ = LT- _ `compare` (OrdValue (String _)) = GT-- (OrdValue (Array xs)) `compare` (OrdValue (Array ys)) =- (OrdValue <$> xs) `compare` (OrdValue <$> ys)- (OrdValue (Array _)) `compare` _ = LT- _ `compare` (OrdValue (Array _)) = GT-- (OrdValue (Object x)) `compare` (OrdValue (Object y)) =- HM.toList (OrdValue <$> x) `compare` HM.toList (OrdValue <$> y)------------------------------------------------------- * other-----------------------------------------------------fromJSONEither :: FromJSON a => Value -> Either Text a-fromJSONEither a =- case fromJSON a of- Error e -> Left (T.pack e)- Success b -> Right b
+ src/JSONSchema/Draft4.hs view
@@ -0,0 +1,195 @@+{-# LANGUAGE TemplateHaskell #-}++module JSONSchema.Draft4+ ( -- * Draft 4 Schema+ SchemaWithURI(..)+ , Schema(..)+ , SC.emptySchema++ -- * One-step validation (getting references over HTTP)+ , fetchHTTPAndValidate+ , HTTPValidationFailure(..)+ , FE.HTTPFailure(..)+ , SchemaInvalid(..)++ -- * One-step validation (getting references from the filesystem)+ , fetchFilesystemAndValidate+ , FilesystemValidationFailure(..)+ , FE.FilesystemFailure(..)++ -- * Validation failure+ , Invalid(..)+ , ValidatorFailure(..)++ -- * Fetching tools+ , ReferencedSchemas(..)+ , FE.URISchemaMap(..)+ , referencesViaHTTP+ , referencesViaFilesystem++ -- * Other Draft 4 things exported just in case+ , metaSchema+ , metaSchemaBytes+ , schemaValidity+ , referencesValidity+ , checkSchema+ , draft4FetchInfo+ ) where++import Import++import Control.Arrow (left)+import qualified Data.ByteString as BS+import Data.FileEmbed (embedFile,+ makeRelativeToProject)+import qualified Data.HashMap.Strict as HM+import qualified Data.List.NonEmpty as NE+import Data.Maybe (fromMaybe)++import JSONSchema.Draft4.Failure (Invalid(..),+ SchemaInvalid(..),+ ValidatorFailure(..))+import JSONSchema.Draft4.Schema (Schema)+import qualified JSONSchema.Draft4.Schema as SC+import qualified JSONSchema.Draft4.Spec as Spec+import JSONSchema.Fetch (ReferencedSchemas(..),+ SchemaWithURI(..))+import qualified JSONSchema.Fetch as FE++data HTTPValidationFailure+ = HVRequest FE.HTTPFailure+ | HVSchema SchemaInvalid+ | HVData Invalid+ deriving Show++-- | Fetch recursively referenced schemas over HTTP, check that both the+-- original and referenced schemas are valid, then validate then data.+fetchHTTPAndValidate+ :: SchemaWithURI Schema+ -> Value+ -> IO (Either HTTPValidationFailure ())+fetchHTTPAndValidate sw v = do+ res <- referencesViaHTTP sw+ pure (g =<< f =<< left HVRequest res)+ where+ f :: FE.URISchemaMap Schema+ -> Either HTTPValidationFailure (Value -> [ValidatorFailure])+ f references = left HVSchema (checkSchema references sw)++ g :: (Value -> [ValidatorFailure]) -> Either HTTPValidationFailure ()+ g val = case NE.nonEmpty (val v) of+ Nothing -> Right ()+ Just failures -> Left (HVData Invalid+ { _invalidSchema = _swSchema sw+ , _invalidInstance = v+ , _invalidFailures = failures+ })++data FilesystemValidationFailure+ = FVRead FE.FilesystemFailure+ | FVSchema SchemaInvalid+ | FVData Invalid+ deriving (Show, Eq)++-- | Fetch recursively referenced schemas from the filesystem, check+-- that both the original and referenced schemas are valid, then validate+-- the data.+fetchFilesystemAndValidate+ :: SchemaWithURI Schema+ -> Value+ -> IO (Either FilesystemValidationFailure ())+fetchFilesystemAndValidate sw v = do+ res <- referencesViaFilesystem sw+ pure (g =<< f =<< left FVRead res)+ where+ f :: FE.URISchemaMap Schema+ -> Either FilesystemValidationFailure (Value -> [ValidatorFailure])+ f references = left FVSchema (checkSchema references sw)++ g :: (Value -> [ValidatorFailure]) -> Either FilesystemValidationFailure ()+ g val = case NE.nonEmpty (val v) of+ Nothing -> Right ()+ Just invalid -> Left (FVData Invalid+ { _invalidSchema = _swSchema sw+ , _invalidInstance = v+ , _invalidFailures = invalid+ })++-- | An instance of 'JSONSchema.Fetch.FetchInfo' specialized for+-- JSON Schema Draft 4.+draft4FetchInfo :: FE.FetchInfo Schema+draft4FetchInfo = FE.FetchInfo Spec.embedded SC._schemaId SC._schemaRef++-- | Fetch the schemas recursively referenced by a starting schema over HTTP.+referencesViaHTTP+ :: SchemaWithURI Schema+ -> IO (Either FE.HTTPFailure (FE.URISchemaMap Schema))+referencesViaHTTP = FE.referencesViaHTTP' draft4FetchInfo++-- | Fetch the schemas recursively referenced by a starting schema from+-- the filesystem.+referencesViaFilesystem+ :: SchemaWithURI Schema+ -> IO (Either FE.FilesystemFailure (FE.URISchemaMap Schema))+referencesViaFilesystem = FE.referencesViaFilesystem' draft4FetchInfo++-- | Checks if a schema and a set of referenced schemas are valid.+--+-- Return a function to validate data.+checkSchema+ :: FE.URISchemaMap Schema+ -> SchemaWithURI Schema+ -> Either SchemaInvalid (Value -> [ValidatorFailure])+checkSchema sm sw =+ case NE.nonEmpty failures of+ Just fs -> Left (SchemaInvalid fs)+ Nothing -> Right (Spec.specValidate+ (ReferencedSchemas (_swSchema sw)+ (FE._unURISchemaMap sm))+ sw)+ where+ failures :: [(Maybe Text, NonEmpty ValidatorFailure)]+ failures =+ let refFailures = first Just <$> referencesValidity sm+ in case NE.nonEmpty (schemaValidity (_swSchema sw)) of+ Nothing -> refFailures+ Just errs -> (Nothing,errs) : refFailures++metaSchema :: Schema+metaSchema =+ fromMaybe (panic "Schema decode failed (this should never happen)")+ . decodeStrict+ $ metaSchemaBytes++metaSchemaBytes :: BS.ByteString+metaSchemaBytes =+ $(makeRelativeToProject "src/draft4.json" >>= embedFile)++-- | Check that a schema itself is valid+-- (if so the returned list will be empty).+schemaValidity :: Schema -> [ValidatorFailure]+schemaValidity =+ Spec.specValidate referenced (SchemaWithURI metaSchema Nothing) . toJSON+ where+ referenced :: ReferencedSchemas Schema+ referenced = ReferencedSchemas+ metaSchema+ (HM.singleton "http://json-schema.org/draft-04/schema"+ metaSchema)++-- | Check that a set of referenced schemas are valid+-- (if so the returned list will be empty).+referencesValidity+ :: FE.URISchemaMap Schema+ -> [(Text, NonEmpty ValidatorFailure)]+ -- ^ The first item of the tuple is the URI of a schema, the second+ -- is that schema's validation errors.+referencesValidity = HM.foldlWithKey' f mempty . FE._unURISchemaMap+ where+ f :: [(Text, NonEmpty ValidatorFailure)]+ -> Text+ -> Schema+ -> [(Text, NonEmpty ValidatorFailure)]+ f acc k v = case NE.nonEmpty (schemaValidity v) of+ Nothing -> acc+ Just errs -> (k,errs) : acc
+ src/JSONSchema/Draft4/Failure.hs view
@@ -0,0 +1,59 @@++module JSONSchema.Draft4.Failure where++import Import++import JSONSchema.Draft4.Schema (Schema)+import qualified JSONSchema.Validator.Draft4 as D4++-- | Used to report an entire instance being invalidated, as opposed+-- to the failure of a single validator.+data Invalid = Invalid+ { _invalidSchema :: Schema+ , _invalidInstance :: Value+ , _invalidFailures :: NonEmpty ValidatorFailure+ } deriving (Eq, Show)++data ValidatorFailure+ = FailureMultipleOf D4.MultipleOfInvalid+ | FailureMaximum D4.MaximumInvalid+ | FailureMinimum D4.MinimumInvalid++ | FailureMaxLength D4.MaxLengthInvalid+ | FailureMinLength D4.MinLengthInvalid+ | FailurePattern D4.PatternInvalid++ | FailureMaxItems D4.MaxItemsInvalid+ | FailureMinItems D4.MinItemsInvalid+ | FailureUniqueItems D4.UniqueItemsInvalid+ | FailureItems (D4.ItemsInvalid ValidatorFailure)+ | FailureAdditionalItems (D4.AdditionalItemsInvalid ValidatorFailure)++ | FailureMaxProperties D4.MaxPropertiesInvalid+ | FailureMinProperties D4.MinPropertiesInvalid+ | FailureRequired ()+ | FailureDependencies (D4.DependenciesInvalid ValidatorFailure)+ | FailurePropertiesRelated (D4.PropertiesRelatedInvalid ValidatorFailure)++ | FailureRef (D4.RefInvalid ValidatorFailure)+ | FailureEnum D4.EnumInvalid+ | FailureType D4.TypeValidatorInvalid+ | FailureAllOf (D4.AllOfInvalid ValidatorFailure)+ | FailureAnyOf (D4.AnyOfInvalid ValidatorFailure)+ | FailureOneOf (D4.OneOfInvalid ValidatorFailure)+ | FailureNot D4.NotValidatorInvalid+ deriving (Eq, Show)++-- | A description of why a schema (or one of its reference) is itself+-- invalid.+--+-- 'Nothing' indicates the starting schema. 'Just' indicates a referenced+-- schema. The contents of the 'Just' is the schema's URI.+--+-- NOTE: 'HashMap (Maybe Text) Invalid' would be a nicer way of+-- defining this, but then we lose the guarantee that there's at least+-- one key.+newtype SchemaInvalid+ = SchemaInvalid {+ _unSchemaInvalid :: NonEmpty (Maybe Text, NonEmpty ValidatorFailure) }+ deriving (Eq, Show)
+ src/JSONSchema/Draft4/Schema.hs view
@@ -0,0 +1,342 @@++module JSONSchema.Draft4.Schema where++import Import hiding (mapMaybe)++import qualified Data.HashMap.Strict as HM+import Data.List.NonEmpty (NonEmpty)+import Data.Maybe (fromJust, isJust)+import Data.Scientific+import qualified Data.Set as Set+import qualified Data.Text as T++import qualified JSONSchema.Validator.Draft4 as D4+import JSONSchema.Validator.Utils++data Schema = Schema+ { _schemaVersion :: Maybe Text+ , _schemaId :: Maybe Text+ , _schemaRef :: Maybe Text+ , _schemaDefinitions :: Maybe (HashMap Text Schema)+ -- ^ A standardized location for embedding schemas+ -- to be referenced from elsewhere in the document.+ , _schemaOther :: HashMap Text Value+ -- ^ Since the JSON document this schema was built from could+ -- contain schemas anywhere (not just in "definitions" or any+ -- of the other official keys) we save any leftover key/value+ -- pairs not covered by them here.+ --+ -- TODO: This field is the source of most of the complication in this+ -- module and needs to be removed. It should be doable, though it will+ -- involve some modification to the fetching code.++ , _schemaMultipleOf :: Maybe Scientific+ , _schemaMaximum :: Maybe Scientific+ , _schemaExclusiveMaximum :: Maybe Bool+ , _schemaMinimum :: Maybe Scientific+ , _schemaExclusiveMinimum :: Maybe Bool++ , _schemaMaxLength :: Maybe Int+ , _schemaMinLength :: Maybe Int+ , _schemaPattern :: Maybe Text++ , _schemaMaxItems :: Maybe Int+ , _schemaMinItems :: Maybe Int+ , _schemaUniqueItems :: Maybe Bool+ , _schemaItems :: Maybe (D4.Items Schema)+ -- Note that '_schemaAdditionalItems' is left out of 'runValidate'+ -- because its functionality is handled by '_schemaItems'. It always+ -- validates data unless 'Items' is present.+ , _schemaAdditionalItems :: Maybe (D4.AdditionalItems Schema)++ , _schemaMaxProperties :: Maybe Int+ , _schemaMinProperties :: Maybe Int+ , _schemaRequired :: Maybe (Set Text)+ , _schemaDependencies :: Maybe (HashMap Text (D4.Dependency Schema))+ , _schemaProperties :: Maybe (HashMap Text Schema)+ , _schemaPatternProperties :: Maybe (HashMap Text Schema)+ , _schemaAdditionalProperties :: Maybe (D4.AdditionalProperties Schema)++ , _schemaEnum :: Maybe (NonEmpty Value)+ , _schemaType :: Maybe D4.TypeValidator+ , _schemaAllOf :: Maybe (NonEmpty Schema)+ , _schemaAnyOf :: Maybe (NonEmpty Schema)+ , _schemaOneOf :: Maybe (NonEmpty Schema)+ , _schemaNot :: Maybe Schema+ } deriving (Eq, Show)++emptySchema :: Schema+emptySchema = Schema+ { _schemaVersion = Nothing+ , _schemaId = Nothing+ , _schemaRef = Nothing+ , _schemaDefinitions = Nothing+ , _schemaOther = mempty++ , _schemaMultipleOf = Nothing+ , _schemaMaximum = Nothing+ , _schemaExclusiveMaximum = Nothing+ , _schemaMinimum = Nothing+ , _schemaExclusiveMinimum = Nothing++ , _schemaMaxLength = Nothing+ , _schemaMinLength = Nothing+ , _schemaPattern = Nothing++ , _schemaMaxItems = Nothing+ , _schemaMinItems = Nothing+ , _schemaUniqueItems = Nothing+ , _schemaItems = Nothing+ , _schemaAdditionalItems = Nothing++ , _schemaMaxProperties = Nothing+ , _schemaMinProperties = Nothing+ , _schemaRequired = Nothing+ , _schemaDependencies = Nothing+ , _schemaProperties = Nothing+ , _schemaPatternProperties = Nothing+ , _schemaAdditionalProperties = Nothing++ , _schemaEnum = Nothing+ , _schemaType = Nothing+ , _schemaAllOf = Nothing+ , _schemaAnyOf = Nothing+ , _schemaOneOf = Nothing+ , _schemaNot = Nothing+ }++instance FromJSON Schema where+ parseJSON = withObject "Schema" $ \o -> do+ a <- o .:! "$schema"+ b <- o .:! "id"+ c <- o .:! "$ref"+ d <- o .:! "definitions"+ e <- parseJSON (Object (HM.difference o internalSchemaHashMap))++ f <- o .:! "multipleOf"+ g <- o .:! "maximum"+ h <- o .:! "exclusiveMaximum"+ i <- o .:! "minimum"+ j <- o .:! "exclusiveMinimum"++ k <- o .:! "maxLength"+ l <- o .:! "minLength"+ m <- o .:! "pattern"++ n <- o .:! "maxItems"+ o' <- o .:! "minItems"+ p <- o .:! "uniqueItems"+ q <- o .:! "items"+ r <- o .:! "additionalItems"++ s <- o .:! "maxProperties"+ t <- o .:! "minProperties"+ u <- o .:! "required"+ v <- o .:! "dependencies"+ w <- o .:! "properties"+ x <- o .:! "patternProperties"+ y <- o .:! "additionalProperties"++ z <- o .:! "enum"+ a2 <- o .:! "type"+ b2 <- fmap _unNonEmpty' <$> o .:! "allOf"+ c2 <- fmap _unNonEmpty' <$> o .:! "anyOf"+ d2 <- fmap _unNonEmpty' <$> o .:! "oneOf"+ e2 <- o .:! "not"+ pure Schema+ { _schemaVersion = a+ , _schemaId = b+ , _schemaRef = c+ , _schemaDefinitions = d+ , _schemaOther = e++ , _schemaMultipleOf = f+ , _schemaMaximum = g+ , _schemaExclusiveMaximum = h+ , _schemaMinimum = i+ , _schemaExclusiveMinimum = j++ , _schemaMaxLength = k+ , _schemaMinLength = l+ , _schemaPattern = m++ , _schemaMaxItems = n+ , _schemaMinItems = o'+ , _schemaUniqueItems = p+ , _schemaItems = q+ , _schemaAdditionalItems = r++ , _schemaMaxProperties = s+ , _schemaMinProperties = t+ , _schemaRequired = u+ , _schemaDependencies = v+ , _schemaProperties = w+ , _schemaPatternProperties = x+ , _schemaAdditionalProperties = y++ , _schemaEnum = z+ , _schemaType = a2+ , _schemaAllOf = b2+ , _schemaAnyOf = c2+ , _schemaOneOf = d2+ , _schemaNot = e2+ }++instance ToJSON Schema where+ -- | The way we resolve JSON Pointers to embedded schemas is by+ -- serializing the containing schema to a value and then resolving the+ -- pointer against it. This means that FromJSON and ToJSON must be+ -- isomorphic.+ --+ -- This influences the design choices in the library. E.g. right now+ -- there are two false values for "exclusiveMaximum" -- Nothing and+ -- Just False. We could have condensed them down by using () instead+ -- of Bool for "exclusiveMaximum". This would have made writing schemas+ -- in haskell easier, but we could no longer round trip through/from+ -- JSON without losing information.+ toJSON s = Object $ HM.union (mapMaybe ($ s) internalSchemaHashMap)+ (toJSON <$> _schemaOther s)+ where+ -- 'mapMaybe' is provided by unordered-containers after+ -- unordered-container-2.6.0.0, but until that is a little older+ -- (and has time to get into Stackage etc.) we use our own+ -- implementation.+ mapMaybe :: (v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2+ mapMaybe f = fmap fromJust . HM.filter isJust . fmap f++-- | Internal. Separate from ToJSON because it's also used+-- by FromJSON to determine what keys aren't official schema+-- keys and therefor should be included in _schemaOther.+internalSchemaHashMap :: HashMap Text (Schema -> Maybe Value)+internalSchemaHashMap = HM.fromList+ [ ("$schema" , f _schemaVersion)+ , ("id" , f _schemaId)+ , ("$ref" , f _schemaRef)+ , ("definitions" , f _schemaDefinitions)++ , ("multipleOf" , f _schemaMultipleOf)+ , ("maximum" , f _schemaMaximum)+ , ("exclusiveMaximum" , f _schemaExclusiveMaximum)+ , ("minimum" , f _schemaMinimum)+ , ("exclusiveMinimum" , f _schemaExclusiveMinimum)++ , ("maxLength" , f _schemaMaxLength)+ , ("minLength" , f _schemaMinLength)+ , ("pattern" , f _schemaPattern)++ , ("maxItems" , f _schemaMaxItems)+ , ("minItems" , f _schemaMinItems)+ , ("uniqueItems" , f _schemaUniqueItems)+ , ("items" , f _schemaItems)+ , ("additionalItems" , f _schemaAdditionalItems)++ , ("maxProperties" , f _schemaMaxProperties)+ , ("minProperties" , f _schemaMinProperties)+ , ("required" , f _schemaRequired)+ , ("dependencies" , f _schemaDependencies)+ , ("properties" , f _schemaProperties)+ , ("patternProperties" , f _schemaPatternProperties)+ , ("additionalProperties", f _schemaAdditionalProperties)++ , ("enum" , f _schemaEnum)+ , ("type" , f _schemaType)+ , ("allOf" , f (fmap NonEmpty' . _schemaAllOf))+ , ("anyOf" , f (fmap NonEmpty' . _schemaAnyOf))+ , ("oneOf" , f (fmap NonEmpty' . _schemaOneOf))+ , ("not" , f _schemaNot)+ ]+ where+ f :: ToJSON a => (Schema -> Maybe a) -> Schema -> Maybe Value+ f = (fmap.fmap) toJSON++instance Arbitrary Schema where+ arbitrary = sized f+ where+ maybeGen :: Gen a -> Gen (Maybe a)+ maybeGen a = oneof [pure Nothing, Just <$> a]++ maybeRecurse :: Int -> Gen a -> Gen (Maybe a)+ maybeRecurse n a+ | n < 1 = pure Nothing+ | otherwise = maybeGen $ resize (n `div` 10) a++ f :: Int -> Gen Schema+ f n = do+ a <- maybeGen arbitraryText+ b <- maybeGen arbitraryText+ c <- maybeGen arbitraryText+ -- NOTE: The next two fields are empty to generate cleaner+ -- schemas, but note that this means we don't test the+ -- invertability of these fields.+ d <- pure Nothing -- _schemaDefinitions+ e <- pure mempty -- _otherPairs++ f' <- maybeGen arbitraryPositiveScientific+ g <- maybeGen arbitraryScientific+ h <- arbitrary+ i <- maybeGen arbitraryScientific+ j <- arbitrary++ k <- maybeGen (getPositive <$> arbitrary)+ l <- maybeGen (getPositive <$> arbitrary)+ m <- maybeGen arbitraryText++ n' <- maybeGen (getPositive <$> arbitrary)+ o <- maybeGen (getPositive <$> arbitrary)+ p <- arbitrary+ q <- maybeRecurse n arbitrary+ r <- maybeRecurse n arbitrary++ s <- maybeGen (getPositive <$> arbitrary)+ t <- maybeGen (getPositive <$> arbitrary)+ u <- maybeGen (Set.map T.pack <$> arbitrary)+ v <- maybeRecurse n arbitraryHashMap+ w <- maybeRecurse n arbitraryHashMap+ x <- maybeRecurse n arbitraryHashMap+ y <- maybeRecurse n arbitrary++ z <- maybeRecurse n ( fmap _unArbitraryValue . _unNonEmpty'+ <$> arbitrary)+ a2 <- arbitrary+ b2 <- maybeRecurse n (_unNonEmpty' <$> arbitrary)+ c2 <- maybeRecurse n (_unNonEmpty' <$> arbitrary)+ d2 <- maybeRecurse n (_unNonEmpty' <$> arbitrary)+ e2 <- maybeRecurse n arbitrary+ pure Schema+ { _schemaVersion = a+ , _schemaId = b+ , _schemaRef = c+ , _schemaDefinitions = d+ , _schemaOther = e++ , _schemaMultipleOf = f'+ , _schemaMaximum = g+ , _schemaExclusiveMaximum = h+ , _schemaMinimum = i+ , _schemaExclusiveMinimum = j++ , _schemaMaxLength = k+ , _schemaMinLength = l+ , _schemaPattern = m++ , _schemaMaxItems = n'+ , _schemaMinItems = o+ , _schemaUniqueItems = p+ , _schemaItems = q+ , _schemaAdditionalItems = r++ , _schemaMaxProperties = s+ , _schemaMinProperties = t+ , _schemaRequired = u+ , _schemaDependencies = v+ , _schemaProperties = w+ , _schemaPatternProperties = x+ , _schemaAdditionalProperties = y++ , _schemaEnum = z+ , _schemaType = a2+ , _schemaAllOf = b2+ , _schemaAnyOf = c2+ , _schemaOneOf = d2+ , _schemaNot = e2+ }
+ src/JSONSchema/Draft4/Spec.hs view
@@ -0,0 +1,128 @@++module JSONSchema.Draft4.Spec where++import Import++import Data.Maybe (fromMaybe)+import Data.Profunctor (Profunctor(..))++import JSONSchema.Draft4.Failure+import JSONSchema.Draft4.Schema (Schema(..))+import JSONSchema.Fetch (ReferencedSchemas(..),+ SchemaWithURI(..))+import qualified JSONSchema.Fetch as FE+import JSONSchema.Types (Spec(..))+import qualified JSONSchema.Types as JT+import JSONSchema.Validator.Draft4+import JSONSchema.Validator.Reference (updateResolutionScope)++embedded :: Schema -> ([Schema], [Schema])+embedded s = JT.embedded (d4Spec (ReferencedSchemas s mempty) mempty Nothing) s++specValidate+ :: ReferencedSchemas Schema+ -> SchemaWithURI Schema+ -> Value+ -> [ValidatorFailure]+specValidate rs =+ continueValidating rs (VisitedSchemas [(Nothing, Nothing)])++continueValidating+ :: ReferencedSchemas Schema+ -> VisitedSchemas+ -> SchemaWithURI Schema+ -> Value+ -> [ValidatorFailure]+continueValidating referenced visited sw =+ JT.validate (d4Spec referenced visited currentScope)+ (_swSchema sw)+ where+ currentScope :: Maybe Text+ currentScope = updateResolutionScope+ (_swURI sw)+ (_schemaId (_swSchema sw))++d4Spec+ :: ReferencedSchemas Schema+ -> VisitedSchemas+ -> Maybe Text+ -> Spec Schema ValidatorFailure+d4Spec referenced visited scope = Spec+ [ dimap (fmap MultipleOf . _schemaMultipleOf) FailureMultipleOf multipleOfValidator+ , dimap+ (\s -> Maximum (fromMaybe False (_schemaExclusiveMaximum s)) <$> _schemaMaximum s)+ FailureMaximum+ maximumValidator+ , dimap+ (\s -> Minimum (fromMaybe False (_schemaExclusiveMinimum s)) <$> _schemaMinimum s)+ FailureMinimum+ minimumValidator++ , dimap (fmap MaxLength . _schemaMaxLength) FailureMaxLength maxLengthValidator+ , dimap (fmap MinLength . _schemaMinLength) FailureMinLength minLengthValidator+ , dimap (fmap PatternValidator . _schemaPattern) FailurePattern patternValidator++ , dimap (fmap MaxItems . _schemaMaxItems) FailureMaxItems maxItemsValidator+ , dimap (fmap MinItems . _schemaMinItems) FailureMinItems minItemsValidator+ , dimap (fmap UniqueItems . _schemaUniqueItems) FailureUniqueItems uniqueItemsValidator+ , dimap+ (\s -> ItemsRelated+ { _irItems = _schemaItems s+ , _irAdditional = _schemaAdditionalItems s+ })+ (\err -> case err of+ IRInvalidItems e -> FailureItems e+ IRInvalidAdditional e -> FailureAdditionalItems e)+ (itemsRelatedValidator descend)+ , lmap (fmap Definitions . _schemaDefinitions) definitionsEmbedded++ , dimap+ (fmap MaxProperties . _schemaMaxProperties)+ FailureMaxProperties+ maxPropertiesValidator+ , dimap+ (fmap MinProperties . _schemaMinProperties)+ FailureMinProperties+ minPropertiesValidator+ , dimap (fmap Required . _schemaRequired) FailureRequired requiredValidator+ , dimap+ (fmap DependenciesValidator . _schemaDependencies)+ FailureDependencies+ (dependenciesValidator descend)+ , dimap+ (\s -> PropertiesRelated+ { _propProperties = _schemaProperties s+ , _propPattern = _schemaPatternProperties s+ , _propAdditional = _schemaAdditionalProperties s+ })+ FailurePropertiesRelated+ (propertiesRelatedValidator descend)++ , dimap+ (\s -> Ref <$> _schemaRef s)+ FailureRef+ (refValidator visited scope (FE.getReference referenced) getRef)+ , dimap (fmap EnumValidator . _schemaEnum) FailureEnum enumValidator+ , dimap (fmap TypeContext . _schemaType) FailureType typeValidator+ , dimap (fmap AllOf . _schemaAllOf) FailureAllOf (allOfValidator lateral)+ , dimap (fmap AnyOf . _schemaAnyOf) FailureAnyOf (anyOfValidator lateral)+ , dimap (fmap OneOf . _schemaOneOf) FailureOneOf (oneOfValidator lateral)+ , dimap (fmap NotValidator . _schemaNot) FailureNot (notValidator lateral)+ ]+ where+ getRef+ :: VisitedSchemas+ -> Maybe Text+ -> Schema+ -> Value+ -> [ValidatorFailure]+ getRef newVisited newScope schema =+ continueValidating referenced newVisited (SchemaWithURI schema newScope)++ descend :: Schema -> Value -> [ValidatorFailure]+ descend schema =+ continueValidating referenced mempty (SchemaWithURI schema scope)++ lateral :: Schema -> Value -> [ValidatorFailure]+ lateral schema =+ continueValidating referenced visited (SchemaWithURI schema scope)
+ src/JSONSchema/Fetch.hs view
@@ -0,0 +1,194 @@++module JSONSchema.Fetch where++import Import++import Control.Arrow (left)+import Control.Exception (IOException, catch)+import Control.Monad (foldM)+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS+import qualified Data.HashMap.Strict as HM+import qualified Data.Text as T+import qualified Network.HTTP.Client as NC++import JSONSchema.Validator.Reference (resolveReference,+ updateResolutionScope)++--------------------------------------------------+-- * Types+--------------------------------------------------++-- | This is all the fetching functions need to know about a particular+-- JSON Schema draft, e.g. JSON Schema Draft 4.+data FetchInfo schema = FetchInfo+ { _fiEmbedded :: schema -> ([schema], [schema])+ , _fiId :: schema -> Maybe Text+ , _fiRef :: schema -> Maybe Text+ }++data ReferencedSchemas schema = ReferencedSchemas+ { _rsStarting :: !schema+ -- ^ Used to resolve relative references when we don't know what the scope+ -- of the current schema is. This only happens with starting schemas+ -- because if we're using a remote schema we had to know its URI in order+ -- to fetch it.+ --+ -- Tracking the starting schema (instead of just resolving the reference to+ -- the current schema being used for validation) is necessary for cases+ -- where schemas are embedded inside one another. For instance in this+ -- case not distinguishing the starting and "foo" schemas sends the code+ -- into an infinite loop:+ --+ -- {+ -- "additionalProperties": false,+ -- "properties": {+ -- "foo": {+ -- "$ref": "#"+ -- }+ -- }+ -- }+ , _rsSchemaMap :: !(HashMap Text schema)+ -- ^ Map of URIs to schemas.+ } deriving (Eq, Show)++-- | Keys are URIs (without URI fragments).+newtype URISchemaMap schema+ = URISchemaMap { _unURISchemaMap :: HashMap Text schema }+ deriving (Eq, Show)++data SchemaWithURI schema = SchemaWithURI+ { _swSchema :: !schema+ , _swURI :: !(Maybe Text)+ -- ^ This is the URI identifying the document containing the schema.+ -- It's different than the schema's "id" field, which controls scope+ -- when resolving references contained in the schema.++ -- TODO: Make the no URI fragment requirement unnecessary.+ } deriving (Eq, Show)++getReference :: ReferencedSchemas schema -> Maybe Text -> Maybe schema+getReference referenced Nothing = Just (_rsStarting referenced)+getReference referenced (Just t) = HM.lookup t (_rsSchemaMap referenced)++--------------------------------------------------+-- * Fetch via HTTP+--------------------------------------------------++data HTTPFailure+ = HTTPParseFailure Text+ | HTTPRequestFailure NC.HttpException+ deriving Show++-- | Take a schema. Retrieve every document either it or its subschemas+-- include via the "$ref" keyword.+referencesViaHTTP'+ :: forall schema. FromJSON schema+ => FetchInfo schema+ -> SchemaWithURI schema+ -> IO (Either HTTPFailure (URISchemaMap schema))+referencesViaHTTP' info sw = do+ manager <- NC.newManager NC.defaultManagerSettings+ let f = referencesMethodAgnostic (getURL manager) info sw+ catch (left HTTPParseFailure <$> f) handler+ where+ getURL :: NC.Manager -> Text -> IO BS.ByteString+ getURL man url = do+ request <- NC.parseUrlThrow (T.unpack url)+ LBS.toStrict . NC.responseBody <$> NC.httpLbs request man++ handler+ :: NC.HttpException+ -> IO (Either HTTPFailure (URISchemaMap schema))+ handler = pure . Left . HTTPRequestFailure++--------------------------------------------------+-- * Fetch via Filesystem+--------------------------------------------------++data FilesystemFailure+ = FSParseFailure Text+ | FSReadFailure IOException+ deriving (Show, Eq)++referencesViaFilesystem'+ :: forall schema. FromJSON schema+ => FetchInfo schema+ -> SchemaWithURI schema+ -> IO (Either FilesystemFailure (URISchemaMap schema))+referencesViaFilesystem' info sw = catch (left FSParseFailure <$> f) handler+ where+ f :: IO (Either Text (URISchemaMap schema))+ f = referencesMethodAgnostic (BS.readFile . T.unpack) info sw++ handler+ :: IOException+ -> IO (Either FilesystemFailure (URISchemaMap schema))+ handler = pure . Left . FSReadFailure++--------------------------------------------------+-- * Method Agnostic Fetching Tools+--------------------------------------------------++-- | A version of 'fetchReferencedSchema's where the function to fetch+-- schemas is provided by the user. This allows restrictions to be added,+-- e.g. rejecting non-local URIs.+referencesMethodAgnostic+ :: forall schema. FromJSON schema+ => (Text -> IO BS.ByteString)+ -> FetchInfo schema+ -> SchemaWithURI schema+ -> IO (Either Text (URISchemaMap schema))+referencesMethodAgnostic fetchRef info =+ getRecursiveReferences fetchRef info (URISchemaMap mempty)++getRecursiveReferences+ :: forall schema. FromJSON schema+ => (Text -> IO BS.ByteString)+ -> FetchInfo schema+ -> URISchemaMap schema+ -> SchemaWithURI schema+ -> IO (Either Text (URISchemaMap schema))+getRecursiveReferences fetchRef info referenced sw =+ foldM f (Right referenced) (includeSubschemas info sw)+ where+ f :: Either Text (URISchemaMap schema)+ -> SchemaWithURI schema+ -> IO (Either Text (URISchemaMap schema))+ f (Left e) _ = pure (Left e)+ f (Right (URISchemaMap usm)) (SchemaWithURI schema mUri) =+ case newRef of+ Nothing -> pure (Right (URISchemaMap usm))+ Just uri -> do+ bts <- fetchRef uri+ case eitherDecodeStrict bts of+ Left e -> pure . Left . T.pack $ e+ Right schm -> getRecursiveReferences+ fetchRef+ info+ (URISchemaMap (HM.insert uri schm usm))+ (SchemaWithURI schm (Just uri))+ where+ newRef :: Maybe Text+ newRef+ | Just (Just uri,_) <- resolveReference mUri <$> _fiRef info schema+ = case HM.lookup uri usm of+ Nothing -> Just uri+ Just _ -> Nothing+ | otherwise = Nothing++-- | Return the schema passed in as an argument, as well as every+-- subschema contained within it.+includeSubschemas+ :: forall schema.+ FetchInfo schema+ -> SchemaWithURI schema+ -> [SchemaWithURI schema]+includeSubschemas info (SchemaWithURI schema mUri) =+ SchemaWithURI schema mUri+ : (includeSubschemas info =<< subSchemas)+ where+ subSchemas :: [SchemaWithURI schema]+ subSchemas =+ (\a -> SchemaWithURI a (updateResolutionScope mUri (_fiId info schema)))+ <$> uncurry (<>) (_fiEmbedded info schema)
+ src/JSONSchema/Types.hs view
@@ -0,0 +1,36 @@++module JSONSchema.Types where++import Import++import JSONSchema.Validator.Types (Validator(..))++newtype Spec schema err+ = Spec { _unSpec :: [Validator schema schema err] }++-- | Return a schema's immediate subschemas.+--+-- The first list is subschemas validating the same level of the document,+-- the second list is subschemas validating lower levels (see+-- 'JSONSchema.Validator.Types.Fail' for a full explanation).+embedded :: Spec schema a -> schema -> ([schema], [schema])+embedded spec schema =+ let embeds = (\val -> _embedded val schema) <$> _unSpec spec+ in foldl' (\(a,b) (x,y) -> (x <> a, y <> b)) (mempty, mempty) embeds++validate+ :: Spec schema err+ -> schema+ -> Value+ -> [err]+validate spec schema v =+ (\val -> _validate val schema v) =<< _unSpec spec++-- | A basic schema type that doesn't impose much structure.+--+-- 'JSONSchema.Draft4' doesn't use this, but instead uses the record based+-- one defined in 'JSONSchema.Draft4.Schema' to make it easier to write+-- draft 4 schemas in Haskell.+newtype Schema+ = Schema { _unSchema :: HashMap Text Value }+ deriving (Eq, Show, FromJSON, ToJSON)
+ src/JSONSchema/Validator/Draft4.hs view
@@ -0,0 +1,242 @@+-- | Turn the validation functions into actual 'Validator's.++module JSONSchema.Validator.Draft4+ ( module JSONSchema.Validator.Draft4+ , module Export+ ) where++import Import++import qualified Data.HashMap.Strict as HM+import qualified Data.List.NonEmpty as NE+import Data.Maybe (catMaybes, maybe, maybeToList)+import Data.Text (Text)++import JSONSchema.Validator.Draft4.Any as Export+import JSONSchema.Validator.Draft4.Array as Export+import JSONSchema.Validator.Draft4.Number as Export+import JSONSchema.Validator.Draft4.Object as Export+import JSONSchema.Validator.Draft4.String as Export+import JSONSchema.Validator.Types (Validator(..))+import JSONSchema.Validator.Utils (fromJSONEither)++-- | For internal use.+--+-- Take a validation function, a possibly existing validator, and some data.+-- If the validator is exists and can validate the type of data we have,+-- attempt to do so and return any failures.+run :: FromJSON b => (a -> b -> Maybe c) -> Maybe a -> Value -> [c]+run _ Nothing _ = mempty+run f (Just a) b =+ case fromJSONEither b of+ Left _ -> mempty+ Right c -> maybeToList (f a c)++-- | For internal use.+noEmbedded :: a -> ([b], [b])+noEmbedded = const (mempty, mempty)++--------------------------------------------------+-- * Numbers+--------------------------------------------------++multipleOfValidator :: Validator a (Maybe MultipleOf) MultipleOfInvalid+multipleOfValidator = Validator noEmbedded (run multipleOfVal)++maximumValidator :: Validator a (Maybe Maximum) MaximumInvalid+maximumValidator = Validator noEmbedded (run maximumVal)++minimumValidator :: Validator a (Maybe Minimum) MinimumInvalid+minimumValidator = Validator noEmbedded (run minimumVal)++--------------------------------------------------+-- * Strings+--------------------------------------------------++maxLengthValidator :: Validator a (Maybe MaxLength) MaxLengthInvalid+maxLengthValidator = Validator noEmbedded (run maxLengthVal)++minLengthValidator :: Validator a (Maybe MinLength) MinLengthInvalid+minLengthValidator = Validator noEmbedded (run minLengthVal)++patternValidator :: Validator a (Maybe PatternValidator) PatternInvalid+patternValidator = Validator noEmbedded (run patternVal)++--------------------------------------------------+-- * Arrays+--------------------------------------------------++maxItemsValidator :: Validator a (Maybe MaxItems) MaxItemsInvalid+maxItemsValidator = Validator noEmbedded (run maxItemsVal)++minItemsValidator :: Validator a (Maybe MinItems) MinItemsInvalid+minItemsValidator = Validator noEmbedded (run minItemsVal)++uniqueItemsValidator :: Validator a (Maybe UniqueItems) UniqueItemsInvalid+uniqueItemsValidator = Validator noEmbedded (run uniqueItemsVal)++itemsRelatedValidator+ :: (schema -> Value -> [err])+ -> Validator schema (ItemsRelated schema) (ItemsRelatedInvalid err)+itemsRelatedValidator f =+ Validator+ (\a -> ( mempty+ , case _irItems a of+ Just (ItemsObject b) -> pure b+ Just (ItemsArray cs) -> cs+ Nothing -> mempty+ <> case _irAdditional a of+ Just (AdditionalObject b) -> pure b+ _ -> mempty+ ))+ (\a b -> case fromJSONEither b of+ Left _ -> mempty+ Right c -> itemsRelatedVal f a c)++--------------------------------------------------+-- * Objects+--------------------------------------------------++maxPropertiesValidator+ :: Validator+ a+ (Maybe MaxProperties)+ MaxPropertiesInvalid+maxPropertiesValidator = Validator noEmbedded (run maxPropertiesVal)++minPropertiesValidator+ :: Validator+ a+ (Maybe MinProperties)+ MinPropertiesInvalid+minPropertiesValidator = Validator noEmbedded (run minPropertiesVal)++requiredValidator :: Validator a (Maybe Required) ()+requiredValidator = Validator noEmbedded (run requiredVal)++dependenciesValidator+ :: (schema -> Value -> [err])+ -> Validator+ schema+ (Maybe (DependenciesValidator schema))+ (DependenciesInvalid err)+dependenciesValidator f =+ Validator+ (maybe mempty ( (\a -> (mempty, a))+ . catMaybes . fmap checkDependency+ . HM.elems . _unDependenciesValidator+ ))+ (run (dependenciesVal f))+ where+ checkDependency :: Dependency schema -> Maybe schema+ checkDependency (PropertyDependency _) = Nothing+ checkDependency (SchemaDependency s) = Just s++propertiesRelatedValidator+ :: (schema -> Value -> [err])+ -> Validator+ schema+ (PropertiesRelated schema)+ (PropertiesRelatedInvalid err)+propertiesRelatedValidator f =+ Validator+ (\a -> ( mempty+ , HM.elems (fromMaybe mempty (_propProperties a))+ <> HM.elems (fromMaybe mempty (_propPattern a))+ <> case _propAdditional a of+ Just (AdditionalPropertiesObject b) -> [b]+ _ -> mempty+ ))+ (\a b -> case fromJSONEither b of+ Left _ -> mempty+ Right c -> maybeToList (propertiesRelatedVal f a c))++newtype Definitions schema+ = Definitions { _unDefinitions :: HashMap Text schema }+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (Definitions schema) where+ parseJSON = withObject "Definitions" $ \o ->+ Definitions <$> o .: "definitions"++-- TODO: Add tests to the language agnostic test suite to+-- make sure these schemas are embedded correctly+-- (and do so for @"additionalItems"@ as well).+definitionsEmbedded+ :: Validator+ schema+ (Maybe (Definitions schema))+ err+definitionsEmbedded =+ Validator+ (\a -> case a of+ Just (Definitions b) -> (mempty, HM.elems b)+ Nothing -> (mempty, mempty))+ (const (const mempty))++--------------------------------------------------+-- * Any+--------------------------------------------------++refValidator+ :: (FromJSON schema, ToJSON schema)+ => VisitedSchemas+ -> Maybe Text+ -> (Maybe Text -> Maybe schema)+ -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err])+ -> Validator a (Maybe Ref) (RefInvalid err)+refValidator visited scope getRef f =+ Validator+ noEmbedded+ (run (refVal visited scope getRef f))++enumValidator :: Validator a (Maybe EnumValidator) EnumInvalid+enumValidator = Validator noEmbedded (run enumVal)++typeValidator :: Validator a (Maybe TypeContext) TypeValidatorInvalid+typeValidator = Validator noEmbedded (run typeVal)++allOfValidator+ :: (schema -> Value -> [err])+ -> Validator schema (Maybe (AllOf schema)) (AllOfInvalid err)+allOfValidator f =+ Validator+ (\a -> case a of+ Just (AllOf b) -> (NE.toList b, mempty)+ Nothing -> (mempty, mempty))+ (run (allOfVal f))++anyOfValidator+ :: (schema -> Value -> [err])+ -> Validator schema (Maybe (AnyOf schema)) (AnyOfInvalid err)+anyOfValidator f =+ Validator+ (\a -> case a of+ Just (AnyOf b) -> (NE.toList b, mempty)+ Nothing -> (mempty, mempty))+ (run (anyOfVal f))++oneOfValidator+ :: ToJSON schema+ => (schema -> Value -> [err])+ -> Validator schema (Maybe (OneOf schema)) (OneOfInvalid err)+oneOfValidator f =+ Validator+ (\a -> case a of+ Just (OneOf b) -> (NE.toList b, mempty)+ Nothing -> (mempty, mempty))+ (run (oneOfVal f))++notValidator+ :: ToJSON schema+ => (schema -> Value -> [err])+ -> Validator+ schema+ (Maybe (NotValidator schema))+ NotValidatorInvalid+notValidator f =+ Validator+ (\a -> case a of+ Just (NotValidator b) -> (pure b, mempty)+ Nothing -> (mempty, mempty))+ (run (notVal f))
+ src/JSONSchema/Validator/Draft4/Any.hs view
@@ -0,0 +1,351 @@++module JSONSchema.Validator.Draft4.Any where++import Import++import Data.List.NonEmpty (NonEmpty((:|)))+import qualified Data.List.NonEmpty as NE+import qualified Data.Scientific as SCI+import Data.Semigroup (Semigroup) -- for older GHCs+import Data.Set (Set)+import qualified Data.Set as S+import qualified JSONPointer as JP++import qualified JSONSchema.Validator.Utils as UT+import JSONSchema.Validator.Reference (URIBaseAndFragment,+ resolveFragment,+ resolveReference)++--------------------------------------------------+-- * $ref+--------------------------------------------------++newtype Ref+ = Ref { _unRef :: Text }+ deriving (Eq, Show)++instance FromJSON Ref where+ parseJSON = withObject "Ref" $ \o ->+ Ref <$> o .: "$ref"++data RefInvalid err+ = RefResolution Text+ -- ^ Indicates a reference that failed to resolve.+ --+ -- NOTE: The language agnostic test suite doesn't specify if this should+ -- cause a validation error or should allow data to pass. We choose to+ -- return a validation error.+ --+ -- Also note that ideally we would enforce in the type system that any+ -- failing references be dealt with before valididation. Then this could+ -- be removed entirely.+ | RefPointerResolution Text+ | RefLoop Text VisitedSchemas URIBaseAndFragment+ | RefInvalid Text Value (NonEmpty err)+ -- ^ 'Text' is the URI and 'Value' is the linked schema.+ deriving (Eq, Show)++newtype VisitedSchemas+ = VisitedSchemas { _unVisited :: [URIBaseAndFragment] }+ deriving (Eq, Show, Semigroup, Monoid)++refVal+ :: forall err schema. (FromJSON schema, ToJSON schema)+ => VisitedSchemas+ -> Maybe Text+ -> (Maybe Text -> Maybe schema)+ -> (VisitedSchemas -> Maybe Text -> schema -> Value -> [err])+ -> Ref+ -> Value+ -> Maybe (RefInvalid err)+refVal visited scope getRef f (Ref reference) x+ | (mURI, mFragment) `elem` _unVisited visited =+ Just (RefLoop reference visited (mURI, mFragment))+ | otherwise =+ case getRef mURI of+ Nothing -> Just (RefResolution reference)+ Just schema ->+ case resolveFragment mFragment schema of+ Nothing -> Just (RefPointerResolution reference)+ Just s ->+ let newVisited = (VisitedSchemas [(mURI, mFragment)]+ <> visited)+ errs = f newVisited mURI s x+ in RefInvalid reference (toJSON schema)+ <$> NE.nonEmpty errs+ where+ (mURI, mFragment) = resolveReference scope reference++--------------------------------------------------+-- * enum+--------------------------------------------------++-- | From the spec:+-- <http://json-schema.org/latest/json-schema-validation.html#anchor76>+--+-- > The value of this keyword MUST be an array.+-- > This array MUST have at least one element.+-- > Elements in the array MUST be unique.+--+-- NOTE: We don't enforce the uniqueness constraint in the haskell code,+-- but we do in the 'FromJSON' instance.+newtype EnumValidator+ = EnumValidator { _unEnumValidator :: NonEmpty Value }+ -- Given a choice, we'd prefer to enforce uniqueness through the type+ -- system over having at least one element. To use a 'Set' though we'd+ -- have to use 'OrdValue' here (there's no 'Ord' instance for plain Values)+ -- and we'd rather not make users mess with 'OrdValue'.+ deriving (Eq, Show)++instance FromJSON EnumValidator where+ parseJSON = withObject "EnumValidator" $ \o ->+ EnumValidator <$> o .: "enum"++instance Arbitrary EnumValidator where+ arbitrary = do+ xs <- (fmap.fmap) UT._unArbitraryValue arbitrary+ case NE.nonEmpty (toUnique xs) of+ Nothing -> EnumValidator . pure . UT._unArbitraryValue <$> arbitrary+ Just ne -> pure (EnumValidator ne)+ where+ toUnique :: [Value] -> [Value]+ toUnique = fmap UT._unOrdValue . S.toList . S.fromList . fmap UT.OrdValue++data EnumInvalid+ = EnumInvalid EnumValidator Value+ deriving (Eq, Show)++enumVal :: EnumValidator -> Value -> Maybe EnumInvalid+enumVal a@(EnumValidator vs) x+ | not (UT.allUniqueValues' vs) = Nothing+ | x `elem` vs = Nothing+ | otherwise = Just $ EnumInvalid a x++--------------------------------------------------+-- * type+--------------------------------------------------++-- | This is separate from 'TypeValidator' so that 'TypeValidator' can+-- be used to write 'JSONSchema.Draft4.Schema.Schema' without+-- messing up the 'FromJSON' instance of that data type.+newtype TypeContext+ = TypeContext { _unTypeContext :: TypeValidator }+ deriving (Eq, Show)++instance FromJSON TypeContext where+ parseJSON = withObject "TypeContext" $ \o ->+ TypeContext <$> o .: "type"++data TypeValidator+ = TypeValidatorString Text+ | TypeValidatorArray (Set Text)+ deriving (Eq, Show)++instance FromJSON TypeValidator where+ parseJSON v = fmap TypeValidatorString (parseJSON v)+ <|> fmap TypeValidatorArray (parseJSON v)++instance ToJSON TypeValidator where+ toJSON (TypeValidatorString t) = toJSON t+ toJSON (TypeValidatorArray ts) = toJSON ts++instance Arbitrary TypeValidator where+ arbitrary = oneof [ TypeValidatorString <$> UT.arbitraryText+ , TypeValidatorArray <$> UT.arbitrarySetOfText+ ]++data TypeValidatorInvalid+ = TypeValidatorInvalid TypeValidator Value+ deriving (Eq, Show)++typeVal :: TypeContext -> Value -> Maybe TypeValidatorInvalid+typeVal (TypeContext tv) x+ | S.null matches = Just (TypeValidatorInvalid tv x)+ | otherwise = Nothing+ where+ -- There can be more than one match because a 'Value' can be both a+ -- @"number"@ and an @"integer"@.+ matches :: Set Text+ matches = S.intersection okTypes (setFromTypeValidator tv)++ okTypes :: Set Text+ okTypes =+ case x of+ Null -> S.singleton "null"+ (Array _) -> S.singleton "array"+ (Bool _) -> S.singleton "boolean"+ (Object _) -> S.singleton "object"+ (String _) -> S.singleton "string"+ (Number y) ->+ if SCI.isInteger y+ then S.fromList ["number", "integer"]+ else S.singleton "number"++-- | Internal.+setFromTypeValidator :: TypeValidator -> Set Text+setFromTypeValidator (TypeValidatorString t) = S.singleton t+setFromTypeValidator (TypeValidatorArray ts) = ts++--------------------------------------------------+-- * allOf+--------------------------------------------------++newtype AllOf schema+ = AllOf { _unAllOf :: NonEmpty schema }+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (AllOf schema) where+ parseJSON = withObject "AllOf" $ \o ->+ AllOf <$> o .: "allOf"++newtype AllOfInvalid err+ = AllOfInvalid (NonEmpty (JP.Index, NonEmpty err))+ deriving (Eq, Show)++allOfVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> AllOf schema+ -> Value+ -> Maybe (AllOfInvalid err)+allOfVal f (AllOf subSchemas) x = AllOfInvalid <$> NE.nonEmpty failures+ where+ perhapsFailures :: [(JP.Index, [err])]+ perhapsFailures = zip (JP.Index <$> [0..])+ (flip f x <$> NE.toList subSchemas)++ failures :: [(JP.Index, NonEmpty err)]+ failures = mapMaybe (traverse NE.nonEmpty) perhapsFailures++--------------------------------------------------+-- * anyOf+--------------------------------------------------++newtype AnyOf schema+ = AnyOf { _unAnyOf :: NonEmpty schema }+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (AnyOf schema) where+ parseJSON = withObject "AnyOf" $ \o ->+ AnyOf <$> o .: "anyOf"++newtype AnyOfInvalid err+ = AnyOfInvalid (NonEmpty (JP.Index, NonEmpty err))+ deriving (Eq, Show)++anyOfVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> AnyOf schema+ -> Value+ -> Maybe (AnyOfInvalid err)+anyOfVal f (AnyOf subSchemas) x+ -- Replace with @null@ once we drop GHC 7.8:+ | any (((==) 0 . length) . snd) perhapsFailures = Nothing+ | otherwise = AnyOfInvalid <$> NE.nonEmpty failures+ where+ perhapsFailures :: [(JP.Index, [err])]+ perhapsFailures = zip (JP.Index <$> [0..])+ (flip f x <$> NE.toList subSchemas)++ failures :: [(JP.Index, NonEmpty err)]+ failures = mapMaybe (traverse NE.nonEmpty) perhapsFailures++--------------------------------------------------+-- * oneOf+--------------------------------------------------++newtype OneOf schema+ = OneOf { _unOneOf :: NonEmpty schema }+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (OneOf schema) where+ parseJSON = withObject "OneOf" $ \o ->+ OneOf <$> o .: "oneOf"++data OneOfInvalid err+ = TooManySuccesses (NonEmpty (JP.Index, Value)) Value+ -- ^ The NonEmpty lists contains tuples whose contents+ -- are the index of a schema that validated the data+ -- and the contents of that schema.+ | NoSuccesses (NonEmpty (JP.Index, NonEmpty err)) Value+ -- ^ The NonEmpty lists contains tuples whose contents+ -- are the index of a schema that failed to validate the data+ -- and the failures it produced.+ deriving (Eq, Show)++oneOfVal+ :: forall err schema. ToJSON schema+ => (schema -> Value -> [err])+ -> OneOf schema+ -> Value+ -> Maybe (OneOfInvalid err)+oneOfVal f (OneOf (firstSubSchema :| otherSubSchemas)) x =+ -- Producing the NonEmpty lists needed by the error constructors+ -- is a little tricky. If we had a partition function like this+ -- it might help:+ -- @+ -- (a -> Either b c) -> NonEmpty a -> Either (NonEmpty b, [c])+ -- ([b], NonEmpty c)+ -- @+ case (firstSuccess, otherSuccesses) of+ (Right _, Nothing) -> Nothing+ (Right a, Just successes) -> Just (TooManySuccesses+ (a NE.<| successes) x)+ (Left e, Nothing) -> Just (NoSuccesses (e :| otherFailures) x)+ (Left _, Just (_ :| [])) -> Nothing+ (Left _, Just successes) -> Just (TooManySuccesses successes x)+ where+ firstSuccess :: Either (JP.Index, NonEmpty err) (JP.Index, Value)+ firstSuccess =+ case NE.nonEmpty (f firstSubSchema x) of+ Nothing -> Right (JP.Index 0, toJSON firstSubSchema)+ Just errs -> Left (JP.Index 0, errs)++ otherPerhapsFailures :: [(JP.Index, Value, [err])]+ otherPerhapsFailures =+ zipWith+ (\index schema -> (index, toJSON schema, f schema x))+ (JP.Index <$> [0..])+ otherSubSchemas++ otherSuccesses :: Maybe (NonEmpty (JP.Index, Value))+ otherSuccesses = NE.nonEmpty+ $ mapMaybe (\(index,val,errs) ->+ case errs of+ [] -> Just (index,val)+ _ -> Nothing+ ) otherPerhapsFailures++ otherFailures :: [(JP.Index, NonEmpty err)]+ otherFailures = mapMaybe (traverse NE.nonEmpty . mid) otherPerhapsFailures++ mid :: (a,b,c) -> (a,c)+ mid (a,_,c) = (a,c)++--------------------------------------------------+-- * not+--------------------------------------------------++newtype NotValidator schema+ = NotValidator { _unNotValidator :: schema }+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (NotValidator schema) where+ parseJSON = withObject "NotValidator" $ \o ->+ NotValidator <$> o .: "not"++data NotValidatorInvalid+ = NotValidatorInvalid Value Value+ deriving (Eq, Show)++notVal+ :: ToJSON schema =>+ (schema -> Value -> [err])+ -> NotValidator schema+ -> Value+ -> Maybe NotValidatorInvalid+notVal f (NotValidator schema) x =+ case f schema x of+ [] -> Just (NotValidatorInvalid (toJSON schema) x)+ _ -> Nothing
+ src/JSONSchema/Validator/Draft4/Array.hs view
@@ -0,0 +1,224 @@++module JSONSchema.Validator.Draft4.Array where++import Import++import qualified Data.List.NonEmpty as NE+import qualified Data.Vector as V+import qualified JSONPointer as JP++import JSONSchema.Validator.Utils (allUniqueValues)++--------------------------------------------------+-- * maxItems+--------------------------------------------------++newtype MaxItems+ = MaxItems { _unMaxItems :: Int }+ deriving (Eq, Show)++instance FromJSON MaxItems where+ parseJSON = withObject "MaxItems" $ \o ->+ MaxItems <$> o .: "maxItems"++data MaxItemsInvalid+ = MaxItemsInvalid MaxItems (Vector Value)+ deriving (Eq, Show)++-- | The spec requires @"maxItems"@ to be non-negative.+maxItemsVal :: MaxItems -> Vector Value -> Maybe MaxItemsInvalid+maxItemsVal a@(MaxItems n) xs+ | n < 0 = Nothing+ | V.length xs > n = Just (MaxItemsInvalid a xs)+ | otherwise = Nothing++--------------------------------------------------+-- * minItems+--------------------------------------------------++newtype MinItems+ = MinItems { _unMinItems :: Int }+ deriving (Eq, Show)++instance FromJSON MinItems where+ parseJSON = withObject "MinItems" $ \o ->+ MinItems <$> o .: "minItems"++data MinItemsInvalid+ = MinItemsInvalid MinItems (Vector Value)+ deriving (Eq, Show)++-- | The spec requires @"minItems"@ to be non-negative.+minItemsVal :: MinItems -> Vector Value -> Maybe MinItemsInvalid+minItemsVal a@(MinItems n) xs+ | n < 0 = Nothing+ | V.length xs < n = Just (MinItemsInvalid a xs)+ | otherwise = Nothing++--------------------------------------------------+-- * uniqueItems+--------------------------------------------------++newtype UniqueItems+ = UniqueItems { _unUniqueItems :: Bool }+ deriving (Eq, Show)++instance FromJSON UniqueItems where+ parseJSON = withObject "UniqueItems" $ \o ->+ UniqueItems <$> o .: "uniqueItems"++data UniqueItemsInvalid+ = UniqueItemsInvalid (Vector Value)+ deriving (Eq, Show)++uniqueItemsVal :: UniqueItems -> Vector Value -> Maybe UniqueItemsInvalid+uniqueItemsVal (UniqueItems True) xs+ | allUniqueValues xs = Nothing+ | otherwise = Just (UniqueItemsInvalid xs)+uniqueItemsVal (UniqueItems False) _ = Nothing++--------------------------------------------------+-- * items+--------------------------------------------------++data ItemsRelated schema = ItemsRelated+ { _irItems :: Maybe (Items schema)+ , _irAdditional :: Maybe (AdditionalItems schema)+ } deriving (Eq, Show)++instance FromJSON schema => FromJSON (ItemsRelated schema) where+ parseJSON = withObject "ItemsRelated" $ \o -> ItemsRelated+ <$> o .:! "items"+ <*> o .:! "additionalItems"++emptyItems :: ItemsRelated schema+emptyItems = ItemsRelated+ { _irItems = Nothing+ , _irAdditional = Nothing+ }++data Items schema+ = ItemsObject schema+ | ItemsArray [schema]+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (Items schema) where+ parseJSON v = fmap ItemsObject (parseJSON v)+ <|> fmap ItemsArray (parseJSON v)++instance ToJSON schema => ToJSON (Items schema) where+ toJSON (ItemsObject hm) = toJSON hm+ toJSON (ItemsArray schemas) = toJSON schemas++instance Arbitrary schema => Arbitrary (Items schema) where+ arbitrary = oneof [ ItemsObject <$> arbitrary+ , ItemsArray <$> arbitrary+ ]++data ItemsRelatedInvalid err+ = IRInvalidItems (ItemsInvalid err)+ | IRInvalidAdditional (AdditionalItemsInvalid err)+ deriving (Eq, Show)++data ItemsInvalid err+ = ItemsObjectInvalid (NonEmpty (JP.Index, NonEmpty err))+ | ItemsArrayInvalid (NonEmpty (JP.Index, NonEmpty err))+ deriving (Eq, Show)++-- | @"additionalItems"@ only matters if @"items"@ exists+-- and is a JSON Array.+itemsRelatedVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> ItemsRelated schema+ -> Vector Value+ -> [ItemsRelatedInvalid err] -- NOTE: 'Data.These' would help here.+itemsRelatedVal f a xs =+ let (itemsFailure, remaining) = case _irItems a of+ Nothing -> (Nothing, mempty)+ Just b -> itemsVal f b xs+ additionalFailure = (\b -> additionalItemsVal f b remaining)+ =<< _irAdditional a+ in catMaybes [ IRInvalidItems <$> itemsFailure+ , IRInvalidAdditional <$> additionalFailure+ ]++-- | Internal.+--+-- This is because 'itemsRelated' handles @"items"@ validation.+itemsVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> Items schema+ -> Vector Value+ -> (Maybe (ItemsInvalid err), [(JP.Index, Value)])+ -- ^ The second item in the tuple is the elements of the original+ -- JSON Array still remaining to be checked by @"additionalItems"@.+itemsVal f a xs =+ case a of+ ItemsObject subSchema ->+ case NE.nonEmpty (mapMaybe (validateElem subSchema) indexed) of+ Nothing -> (Nothing, mempty)+ Just errs -> (Just (ItemsObjectInvalid errs), mempty)+ ItemsArray subSchemas ->+ let remaining = drop (length subSchemas) indexed+ res = catMaybes (zipWith validateElem subSchemas indexed)+ in case NE.nonEmpty res of+ Nothing -> (Nothing, remaining)+ Just errs -> (Just (ItemsArrayInvalid errs), remaining)+ where+ indexed :: [(JP.Index, Value)]+ indexed = zip (JP.Index <$> [0..]) (V.toList xs)++ validateElem+ :: schema+ -> (JP.Index, Value)+ -> Maybe (JP.Index, NonEmpty err)+ validateElem schema (index,x) = (index,) <$> NE.nonEmpty (f schema x)++--------------------------------------------------+-- * additionalItems+--------------------------------------------------++data AdditionalItems schema+ = AdditionalBool Bool+ | AdditionalObject schema+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (AdditionalItems schema) where+ parseJSON v = fmap AdditionalBool (parseJSON v)+ <|> fmap AdditionalObject (parseJSON v)++instance ToJSON schema => ToJSON (AdditionalItems schema) where+ toJSON (AdditionalBool b) = toJSON b+ toJSON (AdditionalObject hm) = toJSON hm++instance Arbitrary schema => Arbitrary (AdditionalItems schema) where+ arbitrary = oneof [ AdditionalBool <$> arbitrary+ , AdditionalObject <$> arbitrary+ ]++data AdditionalItemsInvalid err+ = AdditionalItemsBoolInvalid (NonEmpty (JP.Index, Value))+ | AdditionalItemsObjectInvalid (NonEmpty (JP.Index, NonEmpty err))+ deriving (Eq, Show)++-- | Internal.+--+-- This is because 'itemsRelated' handles @"additionalItems"@ validation.+additionalItemsVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> AdditionalItems schema+ -> [(JP.Index, Value)]+ -- ^ The elements remaining to validate after the ones covered by+ -- @"items"@ have been removed.+ -> Maybe (AdditionalItemsInvalid err)+additionalItemsVal _ (AdditionalBool True) _ = Nothing+additionalItemsVal _ (AdditionalBool False) xs =+ AdditionalItemsBoolInvalid <$> NE.nonEmpty xs+additionalItemsVal f (AdditionalObject subSchema) xs =+ let res = mapMaybe+ (\(index,x) -> (index,) <$> NE.nonEmpty (f subSchema x))+ xs+ in AdditionalItemsObjectInvalid <$> NE.nonEmpty res
+ src/JSONSchema/Validator/Draft4/Number.hs view
@@ -0,0 +1,84 @@++module JSONSchema.Validator.Draft4.Number where++import Import++import Data.Fixed (mod')+import Data.Scientific (Scientific)++--------------------------------------------------+-- * multipleOf+--------------------------------------------------++newtype MultipleOf+ = MultipleOf { _unMultipleOf :: Scientific }+ deriving (Eq, Show)++instance FromJSON MultipleOf where+ parseJSON = withObject "MultipleOf" $ \o ->+ MultipleOf <$> o .: "multipleOf"++data MultipleOfInvalid+ = MultipleOfInvalid MultipleOf Scientific+ deriving (Eq, Show)++-- | The spec requires @"multipleOf"@ to be positive.+multipleOfVal :: MultipleOf -> Scientific -> Maybe MultipleOfInvalid+multipleOfVal a@(MultipleOf n) x+ | n <= 0 = Nothing+ | x `mod'` n /= 0 = Just (MultipleOfInvalid a x)+ | otherwise = Nothing++--------------------------------------------------+-- * maximum+--------------------------------------------------++data Maximum = Maximum+ { _maximumExclusive :: Bool+ , _maximumValue :: Scientific+ } deriving (Eq, Show)++instance FromJSON Maximum where+ parseJSON = withObject "Maximum" $ \o -> Maximum+ <$> o .:! "exclusiveMaximum" .!= False+ <*> o .: "maximum"++data MaximumInvalid+ = MaximumInvalid Maximum Scientific+ deriving (Eq, Show)++maximumVal+ :: Maximum+ -> Scientific+ -> Maybe MaximumInvalid+maximumVal a@(Maximum exclusive n) x+ | exclusive && x >= n = Just (MaximumInvalid a x)+ | x > n = Just (MaximumInvalid a x)+ | otherwise = Nothing++--------------------------------------------------+-- * minimum+--------------------------------------------------++data Minimum = Minimum+ { _minimumExclusive :: Bool+ , _minimumValue :: Scientific+ } deriving (Eq, Show)++instance FromJSON Minimum where+ parseJSON = withObject "Minimum" $ \o -> Minimum+ <$> o .:! "exclusiveMinimum" .!= False+ <*> o .: "minimum"++data MinimumInvalid+ = MinimumInvalid Minimum Scientific+ deriving (Eq, Show)++minimumVal+ :: Minimum+ -> Scientific+ -> Maybe MinimumInvalid+minimumVal a@(Minimum exclusive n) x+ | exclusive && x <= n = Just (MinimumInvalid a x)+ | x < n = Just (MinimumInvalid a x)+ | otherwise = Nothing
+ src/JSONSchema/Validator/Draft4/Object.hs view
@@ -0,0 +1,179 @@++module JSONSchema.Validator.Draft4.Object+ ( module JSONSchema.Validator.Draft4.Object+ , module JSONSchema.Validator.Draft4.Object.Properties+ ) where++import Import++import qualified Data.HashMap.Strict as HM+import qualified Data.List.NonEmpty as NE+import Data.Set (Set)+import qualified Data.Set as S+import qualified Data.Text as T++import JSONSchema.Validator.Draft4.Object.Properties+import JSONSchema.Validator.Utils++--------------------------------------------------+-- * maxProperties+--------------------------------------------------++newtype MaxProperties+ = MaxProperties { _unMaxProperties :: Int }+ deriving (Eq, Show)++instance FromJSON MaxProperties where+ parseJSON = withObject "MaxProperties" $ \o ->+ MaxProperties <$> o .: "maxProperties"++data MaxPropertiesInvalid+ = MaxPropertiesInvalid MaxProperties (HashMap Text Value)+ deriving (Eq, Show)++-- | The spec requires @"maxProperties"@ to be non-negative.+maxPropertiesVal+ :: MaxProperties+ -> HashMap Text Value+ -> Maybe MaxPropertiesInvalid+maxPropertiesVal a@(MaxProperties n) x+ | n < 0 = Nothing+ | HM.size x > n = Just (MaxPropertiesInvalid a x)+ | otherwise = Nothing++--------------------------------------------------+-- * minProperties+--------------------------------------------------++newtype MinProperties+ = MinProperties { _unMinProperties :: Int }+ deriving (Eq, Show)++instance FromJSON MinProperties where+ parseJSON = withObject "MinProperties" $ \o ->+ MinProperties <$> o .: "minProperties"++data MinPropertiesInvalid+ = MinPropertiesInvalid MinProperties (HashMap Text Value)+ deriving (Eq, Show)++-- | The spec requires @"minProperties"@ to be non-negative.+minPropertiesVal+ :: MinProperties+ -> HashMap Text Value+ -> Maybe MinPropertiesInvalid+minPropertiesVal a@(MinProperties n) x+ | n < 0 = Nothing+ | HM.size x < n = Just (MinPropertiesInvalid a x)+ | otherwise = Nothing++--------------------------------------------------+-- * required+--------------------------------------------------++-- | From the spec:+--+-- > The value of this keyword MUST be an array.+-- > This array MUST have at least one element.+-- > Elements of this array MUST be strings, and MUST be unique.+newtype Required+ = Required { _unRequired :: Set Text }+ deriving (Eq, Show)++instance FromJSON Required where+ parseJSON = withObject "Required" $ \o ->+ Required <$> o .: "required"++instance Arbitrary Required where+ arbitrary = do+ x <- arbitraryText -- Guarantee at least one element.+ xs <- (fmap.fmap) T.pack arbitrary+ pure . Required . S.fromList $ x:xs++requiredVal :: Required -> HashMap Text Value -> Maybe ()+requiredVal (Required ts) x+ -- NOTE: When we no longer need to support GHCs before 7.10+ -- we can use null from Prelude throughout the library+ -- instead of specialized versions.+ | S.null ts = Nothing+ | HM.null (HM.difference hm x) = Nothing+ | otherwise = Just () -- TODO+ where+ hm :: HashMap Text Bool+ hm = foldl (\b a -> HM.insert a True b) mempty ts++--------------------------------------------------+-- * dependencies+--------------------------------------------------++newtype DependenciesValidator schema+ = DependenciesValidator+ { _unDependenciesValidator :: HashMap Text (Dependency schema) }+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (DependenciesValidator schema) where+ parseJSON = withObject "DependenciesValidator" $ \o ->+ DependenciesValidator <$> o .: "dependencies"++data Dependency schema+ = SchemaDependency schema+ | PropertyDependency (Set Text)+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (Dependency schema) where+ parseJSON v = fmap SchemaDependency (parseJSON v)+ <|> fmap PropertyDependency (parseJSON v)++instance ToJSON schema => ToJSON (Dependency schema) where+ toJSON (SchemaDependency schema) = toJSON schema+ toJSON (PropertyDependency ts) = toJSON ts++instance Arbitrary schema => Arbitrary (Dependency schema) where+ arbitrary = oneof [ SchemaDependency <$> arbitrary+ , PropertyDependency <$> arbitrarySetOfText+ ]++data DependencyMemberInvalid err+ = SchemaDepInvalid (NonEmpty err)+ | PropertyDepInvalid (Set Text) (HashMap Text Value)+ deriving (Eq, Show)++data DependenciesInvalid err+ = DependenciesInvalid (HashMap Text (DependencyMemberInvalid err))+ deriving (Eq, Show)++-- | From the spec:+-- <http://json-schema.org/latest/json-schema-validation.html#anchor70>+--+-- > This keyword's value MUST be an object.+-- > Each value of this object MUST be either an object or an array.+-- >+-- > If the value is an object, it MUST be a valid JSON Schema.+-- > This is called a schema dependency.+-- >+-- > If the value is an array, it MUST have at least one element.+-- > Each element MUST be a string, and elements in the array MUST be unique.+-- > This is called a property dependency.+dependenciesVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> DependenciesValidator schema+ -> HashMap Text Value+ -> Maybe (DependenciesInvalid err)+dependenciesVal f (DependenciesValidator hm) x =+ let res = HM.mapMaybeWithKey g hm+ in if HM.null res+ then Nothing+ else Just (DependenciesInvalid res)+ where+ g :: Text -> Dependency schema -> Maybe (DependencyMemberInvalid err)+ g k (SchemaDependency schema)+ | HM.member k x = SchemaDepInvalid+ <$> NE.nonEmpty (f schema (Object x))+ | otherwise = Nothing+ g k (PropertyDependency ts)+ | HM.member k x && not allPresent = Just (PropertyDepInvalid ts x)+ | otherwise = Nothing+ where+ allPresent :: Bool+ allPresent = all (`HM.member` x) ts
+ src/JSONSchema/Validator/Draft4/Object/Properties.hs view
@@ -0,0 +1,209 @@++module JSONSchema.Validator.Draft4.Object.Properties where++import Import++import qualified Data.Hashable as HA+import qualified Data.HashMap.Strict as HM+import qualified Data.List.NonEmpty as NE+import Data.Text.Encoding (encodeUtf8)+import qualified JSONPointer as JP+import qualified Text.Regex.PCRE.Heavy as RE++data PropertiesRelated schema = PropertiesRelated+ { _propProperties :: Maybe (HashMap Text schema)+ , _propPattern :: Maybe (HashMap Text schema)+ , _propAdditional :: Maybe (AdditionalProperties schema)+ } deriving (Eq, Show)++instance FromJSON schema => FromJSON (PropertiesRelated schema) where+ parseJSON = withObject "PropertiesRelated" $ \o -> PropertiesRelated+ <$> o .:! "properties"+ <*> o .:! "patternProperties"+ <*> o .:! "additionalProperties"++emptyProperties :: PropertiesRelated schema+emptyProperties = PropertiesRelated+ { _propProperties = Nothing+ , _propPattern = Nothing+ , _propAdditional = Nothing+ }++data AdditionalProperties schema+ = AdditionalPropertiesBool Bool+ | AdditionalPropertiesObject schema+ deriving (Eq, Show)++instance FromJSON schema => FromJSON (AdditionalProperties schema) where+ parseJSON v = fmap AdditionalPropertiesBool (parseJSON v)+ <|> fmap AdditionalPropertiesObject (parseJSON v)++instance ToJSON schema => ToJSON (AdditionalProperties schema) where+ toJSON (AdditionalPropertiesBool b) = toJSON b+ toJSON (AdditionalPropertiesObject hm) = toJSON hm++instance Arbitrary schema => Arbitrary (AdditionalProperties schema) where+ arbitrary = oneof [ AdditionalPropertiesBool <$> arbitrary+ , AdditionalPropertiesObject <$> arbitrary+ ]++-- | A glorified @type@ alias.+newtype Regex+ = Regex { _unRegex :: Text }+ deriving (Eq, Show, Generic)++instance HA.Hashable Regex++-- NOTE: We'd like to enforce that at least one error exists here.+data PropertiesRelatedInvalid err = PropertiesRelatedInvalid+ { _prInvalidProperties :: HashMap Text [err]+ , _prInvalidPattern :: HashMap (Regex, JP.Key) [err]+ , _prInvalidAdditional :: Maybe (APInvalid err)+ } deriving (Eq, Show)++data APInvalid err+ = APBoolInvalid (HashMap Text Value)+ | APObjectInvalid (HashMap Text (NonEmpty err))+ deriving (Eq, Show)++-- | First @"properties"@ and @"patternProperties"@ are run simultaneously+-- on the data, then @"additionalProperties"@ is run on the remainder.+propertiesRelatedVal+ :: forall err schema.+ (schema -> Value -> [err])+ -> PropertiesRelated schema+ -> HashMap Text Value+ -> Maybe (PropertiesRelatedInvalid err)+propertiesRelatedVal f props x+ | all null (HM.elems propFailures)+ && all null (HM.elems patFailures)+ && isNothing addFailures = Nothing+ | otherwise =+ Just PropertiesRelatedInvalid+ { _prInvalidProperties = propFailures+ , _prInvalidPattern = patFailures+ , _prInvalidAdditional = addFailures+ }+ where+ propertiesHm :: HashMap Text schema+ propertiesHm = fromMaybe mempty (_propProperties props)++ patHm :: HashMap Text schema+ patHm = fromMaybe mempty (_propPattern props)++ propAndUnmatched :: (HashMap Text [err], Remaining)+ propAndUnmatched = ( HM.intersectionWith f propertiesHm x+ , Remaining (HM.difference x propertiesHm)+ )++ (propFailures, propRemaining) = propAndUnmatched++ patAndUnmatched :: (HashMap (Regex, JP.Key) [err], Remaining)+ patAndUnmatched = patternAndUnmatched f patHm x++ (patFailures, patRemaining) = patAndUnmatched++ finalRemaining :: Remaining+ finalRemaining = Remaining (HM.intersection (_unRemaining patRemaining)+ (_unRemaining propRemaining))++ addFailures :: Maybe (APInvalid err)+ addFailures = (\addProp -> additionalProperties f addProp finalRemaining)+ =<< _propAdditional props++-- | Internal.+newtype Remaining+ = Remaining { _unRemaining :: HashMap Text Value }++-- | Internal.+patternAndUnmatched+ :: forall err schema.+ (schema -> Value -> [err])+ -> HashMap Text schema+ -> HashMap Text Value+ -> (HashMap (Regex, JP.Key) [err], Remaining)+patternAndUnmatched f patPropertiesHm x =+ (HM.foldlWithKey' runMatches mempty perhapsMatches, remaining)+ where+ -- @[(Regex, schema)]@ will have one item per match.+ perhapsMatches :: HashMap Text ([(Regex, schema)], Value)+ perhapsMatches =+ HM.foldlWithKey' (matchingSchemas patPropertiesHm) mempty x+ where+ matchingSchemas+ :: HashMap Text schema+ -> HashMap Text ([(Regex, schema)], Value)+ -> Text+ -> Value+ -> HashMap Text ([(Regex, schema)], Value)+ matchingSchemas subSchemas acc k v =+ HM.insert k+ (HM.foldlWithKey' (checkKey k) mempty subSchemas, v)+ acc++ checkKey+ :: Text+ -> [(Regex, schema)]+ -> Text+ -> schema+ -> [(Regex, schema)]+ checkKey k acc r subSchema =+ case RE.compileM (encodeUtf8 r) mempty of+ Left _ -> acc+ Right re -> if k RE.=~ re+ then (Regex r, subSchema) : acc+ else acc++ runMatches+ :: HashMap (Regex, JP.Key) [err]+ -> Text+ -> ([(Regex, schema)], Value)+ -> HashMap (Regex, JP.Key) [err]+ runMatches acc k (matches,v) =+ foldr runMatch acc matches+ where+ runMatch+ :: (Regex, schema)+ -> HashMap (Regex, JP.Key) [err]+ -> HashMap (Regex, JP.Key) [err]+ runMatch (r,schema) = HM.insert (r, JP.Key k) (f schema v)++ remaining :: Remaining+ remaining = Remaining . fmap snd . HM.filter (null . fst) $ perhapsMatches++-- Internal.+additionalProperties+ :: forall err schema.+ (schema -> Value -> [err])+ -> AdditionalProperties schema+ -> Remaining+ -> Maybe (APInvalid err)+additionalProperties f a x =+ case a of+ AdditionalPropertiesBool b ->+ APBoolInvalid <$> additionalPropertiesBool b x+ AdditionalPropertiesObject b ->+ APObjectInvalid <$> additionalPropertiesObject f b x++-- | Internal.+additionalPropertiesBool+ :: Bool+ -> Remaining+ -> Maybe (HashMap Text Value)+additionalPropertiesBool True _ = Nothing+additionalPropertiesBool False (Remaining x)+ | HM.size x > 0 = Just x+ | otherwise = Nothing++-- | Internal.+additionalPropertiesObject+ :: forall err schema.+ (schema -> Value -> [err])+ -> schema+ -> Remaining+ -> Maybe (HashMap Text (NonEmpty err))+additionalPropertiesObject f schema (Remaining x) =+ let errs = HM.mapMaybe (NE.nonEmpty . f schema) x+ in if HM.null errs+ then Nothing+ else Just errs
+ src/JSONSchema/Validator/Draft4/String.hs view
@@ -0,0 +1,79 @@++module JSONSchema.Validator.Draft4.String where++import Import++import qualified Data.Text as T+import Data.Text.Encoding (encodeUtf8)+import qualified Text.Regex.PCRE.Heavy as RE++--------------------------------------------------+-- * maxLength+--------------------------------------------------++newtype MaxLength+ = MaxLength { _unMaxLength :: Int }+ deriving (Eq, Show)++instance FromJSON MaxLength where+ parseJSON = withObject "MaxLength" $ \o ->+ MaxLength <$> o .: "maxLength"++data MaxLengthInvalid+ = MaxLengthInvalid MaxLength Text+ deriving (Eq, Show)++-- | The spec requires @"maxLength"@ to be non-negative.+maxLengthVal :: MaxLength -> Text -> Maybe MaxLengthInvalid+maxLengthVal a@(MaxLength n) x+ | n <= 0 = Nothing+ | T.length x > n = Just (MaxLengthInvalid a x)+ | otherwise = Nothing++--------------------------------------------------+-- * minLength+--------------------------------------------------++newtype MinLength+ = MinLength { _unMinLength :: Int }+ deriving (Eq, Show)++instance FromJSON MinLength where+ parseJSON = withObject "MinLength" $ \o ->+ MinLength <$> o .: "minLength"++data MinLengthInvalid+ = MinLengthInvalid MinLength Text+ deriving (Eq, Show)++-- | The spec requires @"minLength"@ to be non-negative.+minLengthVal :: MinLength -> Text -> Maybe MinLengthInvalid+minLengthVal a@(MinLength n) x+ | n <= 0 = Nothing+ | T.length x < n = Just (MinLengthInvalid a x)+ | otherwise = Nothing++--------------------------------------------------+-- * pattern+--------------------------------------------------++newtype PatternValidator+ = PatternValidator { _unPatternValidator :: Text }+ deriving (Eq, Show)++instance FromJSON PatternValidator where+ parseJSON = withObject "PatternValidator" $ \o ->+ PatternValidator <$> o .: "pattern"++data PatternInvalid+ = PatternNotRegex -- TODO: let these pass successfully?+ | PatternInvalid PatternValidator Text+ deriving (Eq, Show)++patternVal :: PatternValidator -> Text -> Maybe PatternInvalid+patternVal a@(PatternValidator t) x =+ case RE.compileM (encodeUtf8 t) mempty of+ Left _ -> Just PatternNotRegex+ Right re -> if x RE.=~ re+ then Nothing+ else Just (PatternInvalid a x)
+ src/JSONSchema/Validator/Reference.hs view
@@ -0,0 +1,79 @@+-- | JSON Reference is described here:+-- <http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03>+--+-- And is extended for JSON Schema here:+-- <http://json-schema.org/latest/json-schema-core.html#anchor26>++module JSONSchema.Validator.Reference where++import Import++import qualified Data.Text as T+import Data.Text.Encoding (decodeUtf8, encodeUtf8)+import qualified JSONPointer as JP+import Network.HTTP.Types.URI (urlDecode)+import System.FilePath ((</>), dropFileName)++-- | TODO: Replace these with actual URI data types.+type URIBase = Maybe Text+type URIBaseAndFragment = (Maybe Text, Maybe Text)++updateResolutionScope :: URIBase -> Maybe Text -> URIBase+updateResolutionScope mScope idKeyword+ | Just t <- idKeyword = fst . baseAndFragment $ resolveScopeAgainst mScope t+ | otherwise = mScope++resolveReference :: URIBase -> Text -> URIBaseAndFragment+resolveReference mScope t = baseAndFragment $ resolveScopeAgainst mScope t++resolveFragment+ :: (FromJSON schema, ToJSON schema)+ => Maybe Text+ -> schema+ -> Maybe schema+resolveFragment Nothing schema = Just schema+resolveFragment (Just pointer) schema = do+ let urlDecoded = decodeUtf8 . urlDecode True . encodeUtf8 $ pointer+ p <- either (const Nothing) Just (JP.unescape urlDecoded)+ x <- either (const Nothing) Just (JP.resolve p (toJSON schema))+ case fromJSON x of+ Error _ -> Nothing+ Success schema' -> Just schema'++--------------------------------------------------+-- * Helpers+--------------------------------------------------++isRemoteReference :: Text -> Bool+isRemoteReference = T.isInfixOf "://"++baseAndFragment :: Text -> URIBaseAndFragment+baseAndFragment = f . T.splitOn "#"+ where+ f :: [Text] -> URIBaseAndFragment+ f [x] = (g x, Nothing)+ f [x,y] = (g x, g y)+ f _ = (Nothing, Nothing)++ g "" = Nothing+ g x = Just x++resolveScopeAgainst :: Maybe Text -> Text -> Text+resolveScopeAgainst Nothing t = t+resolveScopeAgainst (Just scope) t+ | isRemoteReference t = t+ | otherwise = smartAppend+ where+ -- There shouldn't be a fragment at the end of a scope URI,+ -- but just in case a user leaves one in we want to be sure+ -- to cut it off before appending.+ smartAppend :: Text+ smartAppend =+ case baseAndFragment scope of+ (Just base,_) ->+ case T.unpack t of+ -- We want "/foo" and "#/bar" to combine into+ -- "/foo#/bar" not "/foo/#/bar".+ '#':_ -> base <> t+ _ -> T.pack (dropFileName (T.unpack base) </> T.unpack t)+ _ -> t
+ src/JSONSchema/Validator/Types.hs view
@@ -0,0 +1,23 @@++module JSONSchema.Validator.Types where++import Import++import Data.Profunctor (Profunctor(..))++data Validator schema val err = Validator+ { _embedded :: val -> ([schema], [schema])+ -- ^ The first list is embedded schemas that validate the same piece+ -- of data this schema validates (such as schemas embedded in 'allOf').+ -- The second is embedded schemas that validate a subset of that data+ -- (such as the schemas embedded in 'items').+ --+ -- This is done to allow static detection of loops, though this isn't+ -- implemented yet (though the Draft4 code does do live loop detection+ -- during validation).+ , _validate :: val -> Value -> [err]+ } deriving Functor++instance Profunctor (Validator schema) where+ lmap f (Validator a b) = Validator (lmap f a) (lmap f b)+ rmap = fmap
+ src/JSONSchema/Validator/Utils.hs view
@@ -0,0 +1,135 @@++module JSONSchema.Validator.Utils where++import Import++import Control.Monad (fail)+import qualified Data.HashMap.Strict as HM+import qualified Data.List.NonEmpty as NE+import Data.Scientific (Scientific, fromFloatDigits)+import Data.Set (Set)+import qualified Data.Set as S+import qualified Data.Text as T+import qualified Data.Vector as V++--------------------------------------------------+-- * QuickCheck+--------------------------------------------------++arbitraryText :: Gen Text+arbitraryText = T.pack <$> arbitrary++arbitraryScientific :: Gen Scientific+arbitraryScientific = (fromFloatDigits :: Double -> Scientific) <$> arbitrary++arbitraryPositiveScientific :: Gen Scientific+arbitraryPositiveScientific = (fromFloatDigits :: Double -> Scientific)+ . getPositive+ <$> arbitrary++newtype ArbitraryValue+ = ArbitraryValue { _unArbitraryValue :: Value }+ deriving (Eq, Show)++instance Arbitrary ArbitraryValue where+ arbitrary = ArbitraryValue <$> sized f+ where+ f :: Int -> Gen Value+ f n | n <= 1 = oneof nonRecursive+ | otherwise = oneof $+ fmap (Array . V.fromList) (traverse (const (f (n `div` 10)))+ =<< (arbitrary :: Gen [()]))+ : fmap (Object . HM.fromList) (traverse (const (g (n `div` 10)))+ =<< (arbitrary :: Gen [()]))+ : nonRecursive++ g :: Int -> Gen (Text, Value)+ g n = (,) <$> arbitraryText <*> f n++ nonRecursive :: [Gen Value]+ nonRecursive =+ [ pure Null+ , Bool <$> arbitrary+ , String <$> arbitraryText+ , Number <$> arbitraryScientific+ ]++arbitraryHashMap :: Arbitrary a => Gen (HashMap Text a)+arbitraryHashMap = HM.fromList . fmap (first T.pack) <$> arbitrary++arbitrarySetOfText :: Gen (Set Text)+arbitrarySetOfText = S.fromList . fmap T.pack <$> arbitrary++newtype NonEmpty' a = NonEmpty' { _unNonEmpty' :: NonEmpty a }++instance FromJSON a => FromJSON (NonEmpty' a) where+ parseJSON v = do+ xs <- parseJSON v+ case NE.nonEmpty xs of+ Nothing -> fail "Must have at least one item."+ Just ne -> pure (NonEmpty' ne)++instance ToJSON a => ToJSON (NonEmpty' a) where+ toJSON = toJSON . NE.toList . _unNonEmpty'++instance Arbitrary a => Arbitrary (NonEmpty' a) where+ arbitrary = do+ xs <- arbitrary+ case NE.nonEmpty xs of+ Nothing -> NonEmpty' . pure <$> arbitrary+ Just ne -> pure (NonEmpty' ne)++--------------------------------------------------+-- * allUniqueValues+--------------------------------------------------++allUniqueValues :: Vector Value -> Bool+allUniqueValues = allUnique . fmap OrdValue . V.toList++-- NOTE: When we no longer support GHC 7.8 we can generalize+-- allUnique to work on any Foldable and remove this function.+allUniqueValues' :: NonEmpty Value -> Bool+allUniqueValues' = allUnique . fmap OrdValue . NE.toList++allUnique :: (Ord a) => [a] -> Bool+allUnique xs = S.size (S.fromList xs) == length xs++-- | OrdValue's Ord instance needs benchmarking, but it allows us to+-- use our 'allUnique' function instead of O(n^2) nub, so it's probably+-- worth it.+newtype OrdValue = OrdValue { _unOrdValue :: Value } deriving Eq++instance Ord OrdValue where+ (OrdValue Null) `compare` (OrdValue Null) = EQ+ (OrdValue Null) `compare` _ = LT+ _ `compare` (OrdValue Null) = GT++ (OrdValue (Bool x)) `compare` (OrdValue (Bool y)) = x `compare` y+ (OrdValue (Bool _)) `compare` _ = LT+ _ `compare` (OrdValue (Bool _)) = GT++ (OrdValue (Number x)) `compare` (OrdValue (Number y)) = x `compare` y+ (OrdValue (Number _)) `compare` _ = LT+ _ `compare` (OrdValue (Number _)) = GT++ (OrdValue (String x)) `compare` (OrdValue (String y)) = x `compare` y+ (OrdValue (String _)) `compare` _ = LT+ _ `compare` (OrdValue (String _)) = GT++ (OrdValue (Array xs)) `compare` (OrdValue (Array ys)) =+ (OrdValue <$> xs) `compare` (OrdValue <$> ys)+ (OrdValue (Array _)) `compare` _ = LT+ _ `compare` (OrdValue (Array _)) = GT++ (OrdValue (Object x)) `compare` (OrdValue (Object y)) =+ HM.toList (OrdValue <$> x) `compare` HM.toList (OrdValue <$> y)++--------------------------------------------------+-- * other+--------------------------------------------------++fromJSONEither :: FromJSON a => Value -> Either Text a+fromJSONEither a =+ case fromJSON a of+ Error e -> Left (T.pack e)+ Success b -> Right b
test/Local.hs view
@@ -4,15 +4,15 @@ import Protolude import Data.Aeson-import qualified Data.List.NonEmpty as NE-import qualified System.Timeout as TO+import qualified Data.List.NonEmpty as NE+import qualified System.Timeout as TO import Test.Hspec-import Test.QuickCheck (property)+import Test.QuickCheck (property) -import qualified Data.JsonSchema.Draft4 as D4-import Data.JsonSchema.Fetch (ReferencedSchemas(..),- URISchemaMap(..))-import qualified Data.JsonSchema.Types as JT+import qualified JSONSchema.Draft4 as D4+import JSONSchema.Fetch (ReferencedSchemas(..),+ URISchemaMap(..))+import qualified JSONSchema.Types as JT import qualified Local.Failure import qualified Local.Validation import qualified Local.Reference@@ -46,7 +46,7 @@ describe "Examples" exampleTests describe "QuickCheck" quickCheckTests describe "Failure" Local.Failure.spec- describe "Data.Validator.Reference" Local.Reference.spec+ describe "JSONSchema.Validator.Reference" Local.Reference.spec describe "Supplementary validation tests written in Haskell" Local.Validation.spec
test/Local/Failure.hs view
@@ -8,9 +8,9 @@ import qualified Data.Vector as V import qualified JSONPointer as JP -import Data.JsonSchema.Draft4-import qualified Data.JsonSchema.Draft4.Spec as Spec-import qualified Data.Validator.Draft4 as D4+import JSONSchema.Draft4+import qualified JSONSchema.Draft4.Spec as Spec+import qualified JSONSchema.Validator.Draft4 as VAL spec :: Spec spec = do@@ -21,9 +21,9 @@ itemsArray :: Expectation itemsArray = failures `shouldBe`- [ FailureItems (D4.ItemsArrayInvalid (+ [ FailureItems (VAL.ItemsArrayInvalid ( pure ( JP.Index 0- , pure (FailureUniqueItems (D4.UniqueItemsInvalid+ , pure (FailureUniqueItems (VAL.UniqueItemsInvalid (V.fromList [Null, Null]) )) )@@ -35,7 +35,7 @@ schema :: Schema schema = emptySchema- { _schemaItems = Just $ D4.ItemsArray+ { _schemaItems = Just $ VAL.ItemsArray [emptySchema { _schemaUniqueItems = Just True }] } @@ -51,9 +51,9 @@ itemsObject :: Expectation itemsObject = failures `shouldBe`- [ FailureItems (D4.ItemsObjectInvalid (+ [ FailureItems (VAL.ItemsObjectInvalid ( pure ( JP.Index 1- , pure (FailureUniqueItems (D4.UniqueItemsInvalid+ , pure (FailureUniqueItems (VAL.UniqueItemsInvalid (V.fromList [Null, Null]) )) )@@ -65,7 +65,7 @@ schema :: Schema schema = emptySchema- { _schemaItems = Just $ D4.ItemsObject+ { _schemaItems = Just $ VAL.ItemsObject (emptySchema { _schemaUniqueItems = Just True }) } @@ -81,9 +81,9 @@ loopRef :: Expectation loopRef = failures `shouldBe`- [ FailureRef (D4.RefLoop+ [ FailureRef (VAL.RefLoop "#"- (D4.VisitedSchemas [(Nothing, Nothing)])+ (VAL.VisitedSchemas [(Nothing, Nothing)]) (Nothing, Nothing) ) ]
test/Local/Reference.hs view
@@ -5,7 +5,7 @@ import Test.Hspec -import Data.Validator.Reference+import JSONSchema.Validator.Reference spec :: Spec spec = do
test/Local/Validation.hs view
@@ -1,18 +1,17 @@ module Local.Validation where -import Protolude hiding (msg)+import Protolude hiding (msg) import Data.Aeson-import qualified Data.Aeson as AE-import qualified Data.HashMap.Strict as HM-import Data.String (String)+import qualified Data.Aeson as AE+import qualified Data.HashMap.Strict as HM+import Data.String (String) import Test.Hspec -import Data.JsonSchema.Draft4-import qualified Data.JsonSchema.Types as JT--import qualified AlternateSchema as AS+import JSONSchema.Draft4+import qualified JSONSchema.Types as JT+import qualified AlternateSchema as AS spec :: Spec spec = do
test/Remote.hs view
@@ -10,10 +10,10 @@ import Network.Wai.Handler.Warp (run) import Test.Hspec -import qualified Data.JsonSchema.Draft4 as D4-import Data.JsonSchema.Fetch (ReferencedSchemas(..),- URISchemaMap(..))-import qualified Data.JsonSchema.Types as JT+import qualified JSONSchema.Draft4 as D4+import JSONSchema.Fetch (ReferencedSchemas(..),+ URISchemaMap(..))+import qualified JSONSchema.Types as JT import Shared -- Examples