git.iko.soy/typeable/openapi3
on master help sign in
Polish types
commit9aa51b3fdf6bcedf26190ceb56b570b042e3baed authorMaxim Koltsov <kolmax94@gmail.com> dateFri 26 Jun 2020, 12:10 (6 years ago) parent5902310
4 files changed+30−4
src/Data/Swagger.hs+1 src/Data/Swagger/Internal.hs+18−2 src/Data/Swagger/Internal/Schema/Validation.hs+6−2 src/Data/Swagger/Lens.hs+5
src/Data/Swagger.hs+1
@@ -84,6 +84,7 @@ module Data.Swagger (
8484 Xml(..),
8585 Pattern,
8686 AdditionalProperties(..),
87+ Discriminator(..),
8788
8889 -- ** Responses
8990 Responses(..),
src/Data/Swagger/Internal.hs+18−2
@@ -681,11 +681,13 @@ data Schema = Schema
681681 , _schemaProperties :: InsOrdHashMap Text (Referenced Schema)
682682 , _schemaAdditionalProperties :: Maybe AdditionalProperties
683683
684− , _schemaDiscriminator :: Maybe Text -- FIXME Discriminator object
684+ , _schemaDiscriminator :: Maybe Discriminator
685685 , _schemaReadOnly :: Maybe Bool
686+ , _schemaWriteOnly :: Maybe Bool
686687 , _schemaXml :: Maybe Xml
687688 , _schemaExternalDocs :: Maybe ExternalDocs
688689 , _schemaExample :: Maybe Value
690+ , _schemaDeprecated :: Maybe Bool
689691
690692 , _schemaMaxProperties :: Maybe Integer
691693 , _schemaMinProperties :: Maybe Integer
@@ -693,6 +695,14 @@ data Schema = Schema
693695 , _schemaParamSchema :: ParamSchema 'SwaggerKindSchema
694696 } deriving (Eq, Show, Generic, Data, Typeable)
695697
698+data Discriminator = Discriminator
699+ { -- | The name of the property in the payload that will hold the discriminator value.
700+ _discriminatorPropertyName :: Text
701+
702+ -- | An object to hold mappings between payload values and schema names or references.
703+ , _discriminatorMapping :: InsOrdHashMap Text Text
704+ } deriving (Eq, Show, Generic, Data, Typeable)
705+
696706-- | A @'Schema'@ with an optional name.
697707-- This name can be used in references.
698708data NamedSchema = NamedSchema
@@ -790,7 +800,7 @@ data Response = Response
790800 , _responseContent :: InsOrdHashMap Text MediaTypeObject
791801
792802 -- | Maps a header name to its definition.
793− , _responseHeaders :: InsOrdHashMap HeaderName Header -- FIXME Referenced
803+ , _responseHeaders :: InsOrdHashMap HeaderName (Referenced Header)
794804
795805 -- TODO links
796806 } deriving (Eq, Show, Generic, Data, Typeable)
@@ -1152,6 +1162,9 @@ instance ToJSON ExternalDocs where
11521162instance ToJSON Xml where
11531163 toJSON = genericToJSON (jsonPrefix "Xml")
11541164
1165+instance ToJSON Discriminator where
1166+ toJSON = genericToJSON (jsonPrefix "Discriminator")
1167+
11551168-- =======================================================================
11561169-- Simple Generic-based FromJSON instances
11571170-- =======================================================================
@@ -1189,6 +1202,9 @@ instance FromJSON Tag where
11891202instance FromJSON ExternalDocs where
11901203 parseJSON = genericParseJSON (jsonPrefix "ExternalDocs")
11911204
1205+instance FromJSON Discriminator where
1206+ parseJSON = genericParseJSON (jsonPrefix "Discriminator")
1207+
11921208-- =======================================================================
11931209-- Manual ToJSON instances
11941210-- =======================================================================
src/Data/Swagger/Internal/Schema/Validation.hs+6−2
@@ -37,6 +37,7 @@ import Data.HashMap.Strict (HashMap)
3737import qualified Data.HashMap.Strict as HashMap
3838import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
3939import qualified "unordered-containers" Data.HashSet as HashSet
40+import Data.Maybe (fromMaybe)
4041import Data.Proxy
4142import Data.Scientific (Scientific, isInteger)
4243import Data.Text (Text)
@@ -374,8 +375,11 @@ validateArray xs = do
374375validateObject :: HashMap Text Value -> Validation Schema ()
375376validateObject o = withSchema $ \sch ->
376377 case sch ^. discriminator of
377− Just pname -> case fromJSON <$> HashMap.lookup pname o of
378− Just (Success ref) -> validateWithSchemaRef ref (Object o)
378+ Just (Discriminator pname types) -> case fromJSON <$> HashMap.lookup pname o of
379+ Just (Success pvalue) ->
380+ let ref = fromMaybe pvalue $ InsOrdHashMap.lookup pvalue types
381+ -- TODO ref may be name or reference
382+ in validateWithSchemaRef (Ref (Reference ref)) (Object o)
379383 Just (Error msg) -> invalid ("failed to parse discriminator property " ++ show pname ++ ": " ++ show msg)
380384 Nothing -> invalid ("discriminator property " ++ show pname ++ "is missing")
381385 Nothing -> do
src/Data/Swagger/Lens.hs+5
@@ -29,6 +29,8 @@ import Data.Text (Text)
2929makeFields ''Swagger
3030makeFields ''Components
3131makeFields ''Server
32+-- conflict with enum of ParamSchema
33+--makeLensesWith swaggerFieldRules ''ServerVariable
3234makeFields ''RequestBody
3335makeFields ''MediaTypeObject
3436makeFields ''Host
@@ -51,6 +53,9 @@ makeLensesWith swaggerFieldRules ''SecurityScheme
5153makeFields ''ApiKeyParams
5254makeFields ''OAuth2Params
5355makeFields ''ExternalDocs
56+makeFields ''Encoding
57+makeFields ''Example
58+makeFields ''Discriminator
5459
5560-- * Prisms
5661-- ** 'ParamAnySchema' prisms