packages feed

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 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