Copyright | (c) 2015 GetShopTV |
---|---|
License | BSD3 |
Maintainer | Nickolay Kudasov <nickolay@getshoptv.com> |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Validate JSON values with Swagger Schema.
Synopsis
- validatePrettyToJSON :: forall a. ( ToJSON a, ToSchema a) => a -> Maybe String
- validateToJSON :: forall a. ( ToJSON a, ToSchema a) => a -> [ ValidationError ]
- validateToJSONWithPatternChecker :: forall a. ( ToJSON a, ToSchema a) => ( Pattern -> Text -> Bool ) -> a -> [ ValidationError ]
- renderValidationErrors :: forall a. ( ToJSON a, ToSchema a) => (a -> [ ValidationError ]) -> a -> Maybe String
- validateJSON :: Definitions Schema -> Schema -> Value -> [ ValidationError ]
- validateJSONWithPatternChecker :: ( Pattern -> Text -> Bool ) -> Definitions Schema -> Schema -> Value -> [ ValidationError ]
- type ValidationError = String
-
data
Result
a
- = Failed [ ValidationError ]
- | Passed a
-
data
Config
=
Config
{
- configPatternChecker :: Pattern -> Text -> Bool
- configDefinitions :: Definitions Schema
- defaultConfig :: Config
-
newtype
Validation
s a =
Validation
{
- runValidation :: Config -> s -> Result a
- withConfig :: ( Config -> Validation s a) -> Validation s a
- withSchema :: (s -> Validation s a) -> Validation s a
- invalid :: String -> Validation schema a
- valid :: Validation schema ()
- checkMissing :: Validation s () -> Lens' s ( Maybe a) -> (a -> Validation s ()) -> Validation s ()
- check :: Lens' s ( Maybe a) -> (a -> Validation s ()) -> Validation s ()
- sub :: t -> Validation t a -> Validation s a
- sub_ :: Getting a s a -> Validation a r -> Validation s r
- withRef :: Reference -> ( Schema -> Validation s a) -> Validation s a
- validateWithSchemaRef :: Referenced Schema -> Value -> Validation s ()
- validateWithSchema :: Value -> Validation Schema ()
- validateInteger :: Scientific -> Validation Schema ()
- validateNumber :: Scientific -> Validation Schema ()
- validateString :: Text -> Validation Schema ()
- validateArray :: Vector Value -> Validation Schema ()
- validateObject :: KeyMap Value -> Validation Schema ()
- validateEnum :: Value -> Validation Schema ()
- inferSchemaTypes :: Schema -> [ OpenApiType ]
- inferParamSchemaTypes :: Schema -> [ OpenApiType ]
- validateSchemaType :: Value -> Validation Schema ()
- validateParamSchemaType :: Value -> Validation Schema ()
- showType :: ( Maybe OpenApiType , Value ) -> String
Documentation
>>>
import Data.OpenApi.Internal.Schema.Validation
validatePrettyToJSON :: forall a. ( ToJSON a, ToSchema a) => a -> Maybe String Source #
Validate
instance matches
ToJSON
for a given value.
This can be used with QuickCheck to ensure those instances are coherent:
ToSchema
validateToJSON (x :: Int) == []
NOTE:
does not perform string pattern validation.
See
validateToJSON
.
validateToJSONWithPatternChecker
See
renderValidationErrors
on how the output is structured.
validateToJSON :: forall a. ( ToJSON a, ToSchema a) => a -> [ ValidationError ] Source #
Variant of
validatePrettyToJSON
with typed output.
validateToJSONWithPatternChecker :: forall a. ( ToJSON a, ToSchema a) => ( Pattern -> Text -> Bool ) -> a -> [ ValidationError ] Source #
Validate
instance matches
ToJSON
for a given value and pattern checker.
This can be used with QuickCheck to ensure those instances are coherent.
ToSchema
For validation without patterns see
. See also:
validateToJSON
renderValidationErrors
.
renderValidationErrors :: forall a. ( ToJSON a, ToSchema a) => (a -> [ ValidationError ]) -> a -> Maybe String Source #
Pretty print validation errors
together with actual JSON and Swagger Schema
(using
encodePretty
).
>>>
import Data.Aeson as Aeson
>>>
import Data.Foldable (traverse_)
>>>
import GHC.Generics
>>>
data Phone = Phone { value :: String } deriving (Generic)
>>>
data Person = Person { name :: String, phone :: Phone } deriving (Generic)
>>>
instance ToJSON Person where toJSON p = object [ "name" Aeson..= name p ]
>>>
instance ToSchema Phone
>>>
instance ToSchema Person
>>>
let person = Person { name = "John", phone = Phone "123456" }
>>>
traverse_ putStrLn $ renderValidationErrors validateToJSON person
Validation against the schema fails: * property "phone" is required, but not found in "{\"name\":\"John\"}" JSON value: { "name": "John" } Swagger Schema: { "properties": { "name": { "type": "string" }, "phone": { "$ref": "#/components/schemas/Phone" } }, "required": [ "name", "phone" ], "type": "object" } Swagger Description Context: { "Phone": { "properties": { "value": { "type": "string" } }, "required": [ "value" ], "type": "object" } }
validateJSON :: Definitions Schema -> Schema -> Value -> [ ValidationError ] Source #
Validate JSON
against Swagger
Value
.
Schema
validateJSON mempty (toSchema (Proxy :: Proxy Int)) (toJSON (x :: Int)) == []
NOTE:
does not perform string pattern validation.
See
validateJSON
.
validateJSONWithPatternChecker
validateJSONWithPatternChecker :: ( Pattern -> Text -> Bool ) -> Definitions Schema -> Schema -> Value -> [ ValidationError ] Source #
Validate JSON
agains Swagger
Value
for a given value and pattern checker.
ToSchema
For validation without patterns see
.
validateJSON
type ValidationError = String Source #
Validation error message.
Validation result type.
Failed [ ValidationError ] |
Validation failed with a list of error messages. |
Passed a |
Validation passed. |
Validation configuration.
Config | |
|
defaultConfig :: Config Source #
Default
:
Config
defaultConfig =Config
{configPatternChecker
= \_pattern _str -> True ,configDefinitions
= mempty }
newtype Validation s a Source #
Value validation.
Validation | |
|
Instances
withConfig :: ( Config -> Validation s a) -> Validation s a Source #
withSchema :: (s -> Validation s a) -> Validation s a Source #
invalid :: String -> Validation schema a Source #
Issue an error message.
valid :: Validation schema () Source #
Validation passed.
checkMissing :: Validation s () -> Lens' s ( Maybe a) -> (a -> Validation s ()) -> Validation s () Source #
Validate schema's property given a lens into that property and property checker.
check :: Lens' s ( Maybe a) -> (a -> Validation s ()) -> Validation s () Source #
Validate schema's property given a lens into that property and property checker. If property is missing in schema, consider it valid.
sub :: t -> Validation t a -> Validation s a Source #
Validate same value with different schema.
sub_ :: Getting a s a -> Validation a r -> Validation s r Source #
Validate same value with a part of the original schema.
withRef :: Reference -> ( Schema -> Validation s a) -> Validation s a Source #
Validate value against a schema given schema reference and validation function.
validateWithSchemaRef :: Referenced Schema -> Value -> Validation s () Source #
validateWithSchema :: Value -> Validation Schema () Source #
validateInteger :: Scientific -> Validation Schema () Source #
validateNumber :: Scientific -> Validation Schema () Source #
validateString :: Text -> Validation Schema () Source #
validateArray :: Vector Value -> Validation Schema () Source #
validateObject :: KeyMap Value -> Validation Schema () Source #
validateEnum :: Value -> Validation Schema () Source #
inferSchemaTypes :: Schema -> [ OpenApiType ] Source #
Infer schema type based on used properties.
This is like
inferParamSchemaTypes
, but also works for objects:
>>>
inferSchemaTypes <$> decode "{\"minProperties\": 1}"
Just [OpenApiObject]
inferParamSchemaTypes :: Schema -> [ OpenApiType ] Source #
Infer schema type based on used properties.
>>>
inferSchemaTypes <$> decode "{\"minLength\": 2}"
Just [OpenApiString]
>>>
inferSchemaTypes <$> decode "{\"maxItems\": 0}"
Just [OpenApiArray]
From numeric properties
OpenApiInteger
type is inferred.
If you want
OpenApiNumber
instead, you must specify it explicitly.
>>>
inferSchemaTypes <$> decode "{\"minimum\": 1}"
Just [OpenApiInteger]
validateSchemaType :: Value -> Validation Schema () Source #
validateParamSchemaType :: Value -> Validation Schema () Source #