@@ -1,4 +1,5 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE DeriveFunctor #-}
4{-# LANGUAGE DeriveFunctor #-}
4{-# LANGUAGE DeriveGeneric #-}
5{-# LANGUAGE DeriveGeneric #-}
@@ -11,11 +12,12 @@
11{-# LANGUAGE RecordWildCards #-}
12{-# LANGUAGE RecordWildCards #-}
12{-# LANGUAGE ScopedTypeVariables #-}
13{-# LANGUAGE ScopedTypeVariables #-}
13{-# LANGUAGE StandaloneDeriving #-}
14{-# LANGUAGE StandaloneDeriving #-}
14−{-# LANGUAGE UndecidableInstances #-}
16−{-# LANGUAGE DataKinds #-}
17−{-# LANGUAGE TypeFamilies #-}
18{-# LANGUAGE TemplateHaskell #-}
15{-# LANGUAGE TemplateHaskell #-}
16+{-# LANGUAGE TypeFamilies #-}
17+{-# LANGUAGE UndecidableInstances #-}
18+#if __GLASGOW_HASKELL__ <710
19+{-# LANGUAGE PolyKinds #-}
19#include "overlapping-compat.h"
21#include "overlapping-compat.h"
20module Data.Swagger.Internal where
22module Data.Swagger.Internal where
@@ -24,22 +26,22 @@ import Prelude.Compat
25import Control.Lens ((&), (.~), (?~))
27import Control.Lens ((&), (.~), (?~))
26import Control.Applicative
28import Control.Applicative
28import Data.Aeson
29import Data.Aeson
29import qualified Data.Aeson.Types as JSON
30import qualified Data.Aeson.Types as JSON
30import Data.Data (Data(..), Typeable, mkConstr, mkDataType, Fixity(..), Constr, DataType, constrIndex)
31import Data.Data (Data(..), Typeable, mkConstr, mkDataType, Fixity(..), Constr, DataType, constrIndex)
31−import Data.HashMap.Strict (HashMap)
32+import Data.Hashable (Hashable)
32import qualified Data.HashMap.Strict as HashMap
33import qualified Data.HashMap.Strict as HashMap
34+import Data.HashSet.InsOrd (InsOrdHashSet)
33import Data.Map (Map)
35import Data.Map (Map)
34import qualified Data.Map as Map
36import qualified Data.Map as Map
35−import Data.Monoid
37+import Data.Monoid (Monoid (..))
38+import Data.Semigroup.Compat (Semigroup (..))
36import Data.Scientific (Scientific)
39import Data.Scientific (Scientific)
38import Data.String (IsString(..))
40import Data.String (IsString(..))
39import Data.Text (Text)
41import Data.Text (Text)
40import qualified Data.Text as Text
42import qualified Data.Text as Text
41import GHC.Generics (Generic)
43import GHC.Generics (Generic)
42−import Network (HostName, PortNumber)
44+import Network.Socket (HostName, PortNumber)
43import Network.HTTP.Media (MediaType)
45import Network.HTTP.Media (MediaType)
44import Text.Read (readMaybe)
46import Text.Read (readMaybe)
@@ -48,11 +50,26 @@ import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
49import Generics.SOP.TH (deriveGeneric)
51import Generics.SOP.TH (deriveGeneric)
50import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToJSON
52import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToJSON
53+ ,sopSwaggerGenericToJSONWithOpts
54+ ,sopSwaggerGenericParseJSON
55+ ,HasSwaggerAesonOptions(..)
56+ ,AesonDefaultValue(..)
51 ,mkSwaggerAesonOptions
57 ,mkSwaggerAesonOptions
52 ,saoAdditionalPairs
58 ,saoAdditionalPairs
53 ,saoSubObject)
59 ,saoSubObject)
54import Data.Swagger.Internal.Utils
60import Data.Swagger.Internal.Utils
62+#if MIN_VERSION_aeson(0,10,0)
63+import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToEncoding)
64+#define DEFINE_TOENCODING toEncoding = sopSwaggerGenericToEncoding
66+#define DEFINE_TOENCODING
70+-- >>> :seti -XDataKinds
71+-- >>> import Data.Aeson
56-- | A list of definitions that can be used in references.
73-- | A list of definitions that can be used in references.
57type Definitions = InsOrdHashMap Text
74type Definitions = InsOrdHashMap Text
@@ -100,7 +117,7 @@ data Swagger = Swagger
100 , _swaggerResponses :: Definitions Response
117 , _swaggerResponses :: Definitions Response
102 -- | Security scheme definitions that can be used across the specification.
119 -- | Security scheme definitions that can be used across the specification.
103− , _swaggerSecurityDefinitions :: Definitions SecurityScheme
120+ , _swaggerSecurityDefinitions :: SecurityDefinitions
105 -- | A declaration of which security schemes are applied for the API as a whole.
122 -- | A declaration of which security schemes are applied for the API as a whole.
106 -- The list of values describes alternative security schemes that can be used
123 -- The list of values describes alternative security schemes that can be used
@@ -113,7 +130,7 @@ data Swagger = Swagger
113 -- Not all tags that are used by the Operation Object must be declared.
130 -- Not all tags that are used by the Operation Object must be declared.
114 -- The tags that are not declared may be organized randomly or based on the tools' logic.
131 -- The tags that are not declared may be organized randomly or based on the tools' logic.
115 -- Each tag name in the list MUST be unique.
132 -- Each tag name in the list MUST be unique.
116− , _swaggerTags :: Set Tag
133+ , _swaggerTags :: InsOrdHashSet Tag
118 -- | Additional external documentation.
135 -- | Additional external documentation.
119 , _swaggerExternalDocs :: Maybe ExternalDocs
136 , _swaggerExternalDocs :: Maybe ExternalDocs
@@ -235,7 +252,7 @@ data PathItem = PathItem
235data Operation = Operation
252data Operation = Operation
236 { -- | A list of tags for API documentation control.
253 { -- | A list of tags for API documentation control.
237 -- Tags can be used for logical grouping of operations by resources or any other qualifier.
254 -- Tags can be used for logical grouping of operations by resources or any other qualifier.
238− _operationTags :: Set TagName
255+ _operationTags :: InsOrdHashSet TagName
240 -- | A short summary of what the operation does.
257 -- | A short summary of what the operation does.
241 -- For maximum readability in the swagger-ui, this field SHOULD be less than 120 characters.
258 -- For maximum readability in the swagger-ui, this field SHOULD be less than 120 characters.
@@ -292,7 +309,7 @@ data Operation = Operation
292 } deriving (Eq, Show, Generic, Data, Typeable)
309 } deriving (Eq, Show, Generic, Data, Typeable)
294newtype MimeList = MimeList { getMimeList :: [MediaType] }
311newtype MimeList = MimeList { getMimeList :: [MediaType] }
295− deriving (Eq, Show, Monoid, Typeable)
312+ deriving (Eq, Show, Semigroup, Monoid, Typeable)
297mimeListConstr :: Constr
314mimeListConstr :: Constr
298mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
315mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
@@ -343,8 +360,8 @@ data ParamOtherSchema = ParamOtherSchema
343 -- Default value is @False@.
360 -- Default value is @False@.
344 , _paramOtherSchemaAllowEmptyValue :: Maybe Bool
361 , _paramOtherSchemaAllowEmptyValue :: Maybe Bool
346− , _paramOtherSchemaParamSchema :: ParamSchema ParamOtherSchema
363+ , _paramOtherSchemaParamSchema :: ParamSchema 'SwaggerKindParamOtherSchema
347− } deriving (Eq, Show, Generic, Data, Typeable)
364+ } deriving (Eq, Show, Generic, Typeable, Data)
349-- | Items for @'SwaggerArray'@ schemas.
366-- | Items for @'SwaggerArray'@ schemas.
@@ -357,9 +374,9 @@ data ParamOtherSchema = ParamOtherSchema
358-- @'SwaggerItemsArray'@ should be used to specify tuple @'Schema'@s.
375-- @'SwaggerItemsArray'@ should be used to specify tuple @'Schema'@s.
359data SwaggerItems t where
376data SwaggerItems t where
360− SwaggerItemsPrimitive :: Maybe (CollectionFormat t) -> ParamSchema t -> SwaggerItems t
377+ SwaggerItemsPrimitive :: Maybe (CollectionFormat k) -> ParamSchema k-> SwaggerItems k
361− SwaggerItemsObject :: Referenced Schema -> SwaggerItems Schema
378+ SwaggerItemsObject :: Referenced Schema -> SwaggerItems 'SwaggerKindSchema
362− SwaggerItemsArray :: [Referenced Schema] -> SwaggerItems Schema
379+ SwaggerItemsArray :: [Referenced Schema] -> SwaggerItems 'SwaggerKindSchema
363 deriving (Typeable)
380 deriving (Typeable)
365deriving instance Eq (SwaggerItems t)
382deriving instance Eq (SwaggerItems t)
@@ -369,17 +386,66 @@ deriving instance Show (SwaggerItems t)
369swaggerItemsPrimitiveConstr :: Constr
386swaggerItemsPrimitiveConstr :: Constr
370swaggerItemsPrimitiveConstr = mkConstr swaggerItemsDataType "SwaggerItemsPrimitive" [] Prefix
387swaggerItemsPrimitiveConstr = mkConstr swaggerItemsDataType "SwaggerItemsPrimitive" [] Prefix
389+swaggerItemsObjectConstr :: Constr
390+swaggerItemsObjectConstr = mkConstr swaggerItemsDataType "SwaggerItemsObject" [] Prefix
392+swaggerItemsArrayConstr :: Constr
393+swaggerItemsArrayConstr = mkConstr swaggerItemsDataType "SwaggerItemsArray" [] Prefix
372swaggerItemsDataType :: DataType
395swaggerItemsDataType :: DataType
373swaggerItemsDataType = mkDataType "Data.Swagger.SwaggerItems" [swaggerItemsPrimitiveConstr]
396swaggerItemsDataType = mkDataType "Data.Swagger.SwaggerItems" [swaggerItemsPrimitiveConstr]
398+-- Note: unfortunately we have to write these Data instances by hand,
399+-- to get better contexts / avoid duplicate name when using standalone deriving
375−instance OVERLAPPABLE_ Data t => Data (SwaggerItems t) where
401+instance Data t => Data (SwaggerItems ('SwaggerKindNormal t)) where
402+ -- TODO: define gfoldl
376 gunfold k z c = case constrIndex c of
403 gunfold k z c = case constrIndex c of
377 1 -> k (k (z SwaggerItemsPrimitive))
404 1 -> k (k (z SwaggerItemsPrimitive))
378 _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems t)."
405 _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems t)."
379 toConstr _ = swaggerItemsPrimitiveConstr
406 toConstr _ = swaggerItemsPrimitiveConstr
380 dataTypeOf _ = swaggerItemsDataType
407 dataTypeOf _ = swaggerItemsDataType
409+-- SwaggerItems SwaggerKindParamOtherSchema can be constructed using SwaggerItemsPrimitive only
382−deriving instance Data (SwaggerItems Schema)
410+instance Data (SwaggerItems 'SwaggerKindParamOtherSchema) where
411+ -- TODO: define gfoldl
412+ gunfold k z c = case constrIndex c of
413+ 1 -> k (k (z SwaggerItemsPrimitive))
414+ _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems SwaggerKindParamOtherSchema)."
415+ toConstr _ = swaggerItemsPrimitiveConstr
416+ dataTypeOf _ = swaggerItemsDataType
418+instance Data (SwaggerItems 'SwaggerKindSchema) where
419+ gfoldl _ _ (SwaggerItemsPrimitive _ _) = error $ " Data.Data.gfoldl: Constructor SwaggerItemsPrimitive used to construct SwaggerItems SwaggerKindSchema"
420+ gfoldl k z (SwaggerItemsObject ref) = z SwaggerItemsObject `k` ref
421+ gfoldl k z (SwaggerItemsArray ref) = z SwaggerItemsArray `k` ref
423+ gunfold k z c = case constrIndex c of
424+ 2 -> k (z SwaggerItemsObject)
425+ 3 -> k (z SwaggerItemsArray)
426+ _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems SwaggerKindSchema)."
428+ toConstr (SwaggerItemsPrimitive _ _) = error "Not supported"
429+ toConstr (SwaggerItemsObject _) = swaggerItemsObjectConstr
430+ toConstr (SwaggerItemsArray _) = swaggerItemsArrayConstr
432+ dataTypeOf _ = swaggerItemsDataType
434+-- | Type used as a kind to avoid overlapping instances.
436+ = SwaggerKindNormal t
437+ | SwaggerKindParamOtherSchema
441+deriving instance Typeable 'SwaggerKindNormal
442+deriving instance Typeable 'SwaggerKindParamOtherSchema
443+deriving instance Typeable 'SwaggerKindSchema
445+type family SwaggerKindType (k :: SwaggerKind *) :: *
446+type instance SwaggerKindType ('SwaggerKindNormal t) = t
447+type instance SwaggerKindType 'SwaggerKindSchema = Schema
448+type instance SwaggerKindType 'SwaggerKindParamOtherSchema = ParamOtherSchema
384data SwaggerType t where
450data SwaggerType t where
385 SwaggerString :: SwaggerType t
451 SwaggerString :: SwaggerType t
@@ -387,9 +453,9 @@ data SwaggerType t where
387 SwaggerInteger :: SwaggerType t
453 SwaggerInteger :: SwaggerType t
388 SwaggerBoolean :: SwaggerType t
454 SwaggerBoolean :: SwaggerType t
389 SwaggerArray :: SwaggerType t
455 SwaggerArray :: SwaggerType t
390− SwaggerFile :: SwaggerType ParamOtherSchema
456+ SwaggerFile :: SwaggerType 'SwaggerKindParamOtherSchema
391− SwaggerNull :: SwaggerType Schema
457+ SwaggerNull :: SwaggerType 'SwaggerKindSchema
392− SwaggerObject :: SwaggerType Schema
458+ SwaggerObject :: SwaggerType 'SwaggerKindSchema
393 deriving (Typeable)
459 deriving (Typeable)
395deriving instance Eq (SwaggerType t)
461deriving instance Eq (SwaggerType t)
@@ -398,33 +464,33 @@ deriving instance Show (SwaggerType t)
398swaggerTypeConstr :: Data (SwaggerType t) => SwaggerType t -> Constr
464swaggerTypeConstr :: Data (SwaggerType t) => SwaggerType t -> Constr
399swaggerTypeConstr t = mkConstr (dataTypeOf t) (show t) [] Prefix
465swaggerTypeConstr t = mkConstr (dataTypeOf t) (show t) [] Prefix
401−swaggerTypeDataType :: Data (SwaggerType t) => SwaggerType t -> DataType
467+swaggerTypeDataType :: {- Data (SwaggerType t) => -} SwaggerType t -> DataType
402swaggerTypeDataType _ = mkDataType "Data.Swagger.SwaggerType" swaggerTypeConstrs
468swaggerTypeDataType _ = mkDataType "Data.Swagger.SwaggerType" swaggerTypeConstrs
404−swaggerCommonTypes :: [SwaggerType t]
470+swaggerCommonTypes :: [SwaggerType k]
405swaggerCommonTypes = [SwaggerString, SwaggerNumber, SwaggerInteger, SwaggerBoolean, SwaggerArray]
471swaggerCommonTypes = [SwaggerString, SwaggerNumber, SwaggerInteger, SwaggerBoolean, SwaggerArray]
407−swaggerParamTypes :: [SwaggerType ParamOtherSchema]
473+swaggerParamTypes :: [SwaggerType 'SwaggerKindParamOtherSchema]
408swaggerParamTypes = swaggerCommonTypes ++ [SwaggerFile]
474swaggerParamTypes = swaggerCommonTypes ++ [SwaggerFile]
410−swaggerSchemaTypes :: [SwaggerType Schema]
476+swaggerSchemaTypes :: [SwaggerType 'SwaggerKindSchema]
411swaggerSchemaTypes = swaggerCommonTypes ++ [error "SwaggerFile is invalid SwaggerType Schema", SwaggerNull, SwaggerObject]
477swaggerSchemaTypes = swaggerCommonTypes ++ [error "SwaggerFile is invalid SwaggerType Schema", SwaggerNull, SwaggerObject]
413swaggerTypeConstrs :: [Constr]
479swaggerTypeConstrs :: [Constr]
414−swaggerTypeConstrs = map swaggerTypeConstr (swaggerCommonTypes :: [SwaggerType Schema])
480+swaggerTypeConstrs = map swaggerTypeConstr (swaggerCommonTypes :: [SwaggerType 'SwaggerKindSchema])
415 ++ [swaggerTypeConstr SwaggerFile, swaggerTypeConstr SwaggerNull, swaggerTypeConstr SwaggerObject]
481 ++ [swaggerTypeConstr SwaggerFile, swaggerTypeConstr SwaggerNull, swaggerTypeConstr SwaggerObject]
417−instance OVERLAPPABLE_ Typeable t => Data (SwaggerType t) where
483+instance Typeable t => Data (SwaggerType ('SwaggerKindNormal t)) where
418 gunfold = gunfoldEnum "SwaggerType" swaggerCommonTypes
484 gunfold = gunfoldEnum "SwaggerType" swaggerCommonTypes
419 toConstr = swaggerTypeConstr
485 toConstr = swaggerTypeConstr
420 dataTypeOf = swaggerTypeDataType
486 dataTypeOf = swaggerTypeDataType
422−instance OVERLAPPABLE_ Data (SwaggerType ParamOtherSchema) where
488+instance Data (SwaggerType 'SwaggerKindParamOtherSchema) where
423 gunfold = gunfoldEnum "SwaggerType ParamOtherSchema" swaggerParamTypes
489 gunfold = gunfoldEnum "SwaggerType ParamOtherSchema" swaggerParamTypes
424 toConstr = swaggerTypeConstr
490 toConstr = swaggerTypeConstr
425 dataTypeOf = swaggerTypeDataType
491 dataTypeOf = swaggerTypeDataType
427−instance OVERLAPPABLE_ Data (SwaggerType Schema) where
493+instance Data (SwaggerType 'SwaggerKindSchema) where
428 gunfold = gunfoldEnum "SwaggerType Schema" swaggerSchemaTypes
494 gunfold = gunfoldEnum "SwaggerType Schema" swaggerSchemaTypes
429 toConstr = swaggerTypeConstr
495 toConstr = swaggerTypeConstr
430 dataTypeOf = swaggerTypeDataType
496 dataTypeOf = swaggerTypeDataType
@@ -464,7 +530,7 @@ data CollectionFormat t where
464 -- Corresponds to multiple parameter instances
530 -- Corresponds to multiple parameter instances
465 -- instead of multiple values for a single instance @foo=bar&foo=baz@.
531 -- instead of multiple values for a single instance @foo=bar&foo=baz@.
466 -- This is valid only for parameters in @'ParamQuery'@ or @'ParamFormData'@.
532 -- This is valid only for parameters in @'ParamQuery'@ or @'ParamFormData'@.
467− CollectionMulti :: CollectionFormat ParamOtherSchema
533+ CollectionMulti :: CollectionFormat 'SwaggerKindParamOtherSchema
468 deriving (Typeable)
534 deriving (Typeable)
470deriving instance Eq (CollectionFormat t)
536deriving instance Eq (CollectionFormat t)
@@ -480,12 +546,12 @@ collectionFormatDataType = mkDataType "Data.Swagger.CollectionFormat" $
480collectionCommonFormats :: [CollectionFormat t]
546collectionCommonFormats :: [CollectionFormat t]
481collectionCommonFormats = [ CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes ]
547collectionCommonFormats = [ CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes ]
483−instance OVERLAPPABLE_ Data t => Data (CollectionFormat t) where
549+instance Data t => Data (CollectionFormat ('SwaggerKindNormal t)) where
484 gunfold = gunfoldEnum "CollectionFormat" collectionCommonFormats
550 gunfold = gunfoldEnum "CollectionFormat" collectionCommonFormats
485 toConstr = collectionFormatConstr
551 toConstr = collectionFormatConstr
486 dataTypeOf _ = collectionFormatDataType
552 dataTypeOf _ = collectionFormatDataType
488−deriving instance OVERLAPPABLE_ Data (CollectionFormat ParamOtherSchema)
554+deriving instance Data (CollectionFormat 'SwaggerKindParamOtherSchema)
490type ParamName = Text
556type ParamName = Text
@@ -494,9 +560,9 @@ data Schema = Schema
494 , _schemaDescription :: Maybe Text
560 , _schemaDescription :: Maybe Text
495 , _schemaRequired :: [ParamName]
561 , _schemaRequired :: [ParamName]
497− , _schemaAllOf :: Maybe [Schema]
563+ , _schemaAllOf :: Maybe [Referenced Schema]
498 , _schemaProperties :: InsOrdHashMap Text (Referenced Schema)
564 , _schemaProperties :: InsOrdHashMap Text (Referenced Schema)
499− , _schemaAdditionalProperties :: Maybe (Referenced Schema)
565+ , _schemaAdditionalProperties :: Maybe AdditionalProperties
501 , _schemaDiscriminator :: Maybe Text
567 , _schemaDiscriminator :: Maybe Text
502 , _schemaReadOnly :: Maybe Bool
568 , _schemaReadOnly :: Maybe Bool
@@ -507,7 +573,7 @@ data Schema = Schema
507 , _schemaMaxProperties :: Maybe Integer
573 , _schemaMaxProperties :: Maybe Integer
508 , _schemaMinProperties :: Maybe Integer
574 , _schemaMinProperties :: Maybe Integer
510− , _schemaParamSchema :: ParamSchema Schema
576+ , _schemaParamSchema :: ParamSchema 'SwaggerKindSchema
511 } deriving (Eq, Show, Generic, Data, Typeable)
577 } deriving (Eq, Show, Generic, Data, Typeable)
513-- | A @'Schema'@ with an optional name.
579-- | A @'Schema'@ with an optional name.
@@ -520,7 +586,7 @@ data NamedSchema = NamedSchema
520-- | Regex pattern for @string@ type.
586-- | Regex pattern for @string@ type.
521type Pattern = Text
587type Pattern = Text
523−data ParamSchema t = ParamSchema
589+data ParamSchema (t :: SwaggerKind *) = ParamSchema
524 { -- | Declares the value of the parameter that the server will use if none is provided,
590 { -- | Declares the value of the parameter that the server will use if none is provided,
525 -- for example a @"count"@ to control the number of results per page might default to @100@
591 -- for example a @"count"@ to control the number of results per page might default to @100@
526 -- if not supplied by the client in the request.
592 -- if not supplied by the client in the request.
@@ -528,7 +594,7 @@ data ParamSchema t = ParamSchema
528 -- Unlike JSON Schema this value MUST conform to the defined type for this parameter.
594 -- Unlike JSON Schema this value MUST conform to the defined type for this parameter.
529 _paramSchemaDefault :: Maybe Value
595 _paramSchemaDefault :: Maybe Value
531− , _paramSchemaType :: SwaggerType t
597+ , _paramSchemaType :: Maybe (SwaggerType t)
532 , _paramSchemaFormat :: Maybe Format
598 , _paramSchemaFormat :: Maybe Format
533 , _paramSchemaItems :: Maybe (SwaggerItems t)
599 , _paramSchemaItems :: Maybe (SwaggerItems t)
534 , _paramSchemaMaximum :: Maybe Scientific
600 , _paramSchemaMaximum :: Maybe Scientific
@@ -545,7 +611,7 @@ data ParamSchema t = ParamSchema
545 , _paramSchemaMultipleOf :: Maybe Scientific
611 , _paramSchemaMultipleOf :: Maybe Scientific
546 } deriving (Eq, Show, Generic, Typeable)
612 } deriving (Eq, Show, Generic, Typeable)
548−deriving instance (Data t, Data (SwaggerType t), Data (SwaggerItems t)) => Data (ParamSchema t)
614+deriving instance (Typeable k, Data (Maybe (SwaggerType k)), Data (SwaggerItems k)) => Data (ParamSchema k)
550data Xml = Xml
616data Xml = Xml
551 { -- | Replaces the name of the element/attribute used for the described schema property.
617 { -- | Replaces the name of the element/attribute used for the described schema property.
@@ -621,7 +687,7 @@ data Header = Header
621 { -- | A short description of the header.
687 { -- | A short description of the header.
622 _headerDescription :: Maybe Text
688 _headerDescription :: Maybe Text
624− , _headerParamSchema :: ParamSchema Header
690+ , _headerParamSchema :: ParamSchema ('SwaggerKindNormal Header)
625 } deriving (Eq, Show, Generic, Data, Typeable)
691 } deriving (Eq, Show, Generic, Data, Typeable)
627data Example = Example { getExample :: Map MediaType Value }
693data Example = Example { getExample :: Map MediaType Value }
@@ -689,12 +755,28 @@ data SecurityScheme = SecurityScheme
689 , _securitySchemeDescription :: Maybe Text
755 , _securitySchemeDescription :: Maybe Text
690 } deriving (Eq, Show, Generic, Data, Typeable)
756 } deriving (Eq, Show, Generic, Data, Typeable)
759+-- | merge scopes of two OAuth2 security schemes when their flows are identical.
760+-- In other case returns first security scheme
761+mergeSecurityScheme :: SecurityScheme -> SecurityScheme -> SecurityScheme
762+mergeSecurityScheme s1@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 scopes1)) desc)
763+ s2@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow2 scopes2)) _)
764+ = if flow1 == flow2 then
765+ SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 (scopes1 <> scopes2))) desc
768+mergeSecurityScheme s1 _ = s1
770+newtype SecurityDefinitions
771+ = SecurityDefinitions (Definitions SecurityScheme)
772+ deriving (Eq, Show, Generic, Data, Typeable)
692-- | Lists the required security schemes to execute this operation.
774-- | Lists the required security schemes to execute this operation.
693-- The object can have multiple security schemes declared in it which are all required
775-- The object can have multiple security schemes declared in it which are all required
694-- (that is, there is a logical AND between the schemes).
776-- (that is, there is a logical AND between the schemes).
695newtype SecurityRequirement = SecurityRequirement
777newtype SecurityRequirement = SecurityRequirement
696 { getSecurityRequirement :: InsOrdHashMap Text [Text]
778 { getSecurityRequirement :: InsOrdHashMap Text [Text]
697− } deriving (Eq, Read, Show, Monoid, ToJSON, FromJSON, Data, Typeable)
779+ } deriving (Eq, Read, Show, Semigroup, Monoid, ToJSON, FromJSON, Data, Typeable)
699-- | Tag name.
781-- | Tag name.
700type TagName = Text
782type TagName = Text
@@ -713,6 +795,8 @@ data Tag = Tag
713 , _tagExternalDocs :: Maybe ExternalDocs
795 , _tagExternalDocs :: Maybe ExternalDocs
714 } deriving (Eq, Ord, Show, Generic, Data, Typeable)
796 } deriving (Eq, Ord, Show, Generic, Data, Typeable)
798+instance Hashable Tag
716instance IsString Tag where
800instance IsString Tag where
717 fromString s = Tag (fromString s) Nothing Nothing
801 fromString s = Tag (fromString s) Nothing Nothing
@@ -726,6 +810,8 @@ data ExternalDocs = ExternalDocs
726 , _externalDocsUrl :: URL
810 , _externalDocsUrl :: URL
727 } deriving (Eq, Ord, Show, Generic, Data, Typeable)
811 } deriving (Eq, Ord, Show, Generic, Data, Typeable)
813+instance Hashable ExternalDocs
729-- | A simple object to allow referencing other definitions in the specification.
815-- | A simple object to allow referencing other definitions in the specification.
730-- It can be used to reference parameters and responses that are defined at the top level for reuse.
816-- It can be used to reference parameters and responses that are defined at the top level for reuse.
731newtype Reference = Reference { getReference :: Text }
817newtype Reference = Reference { getReference :: Text }
@@ -739,67 +825,111 @@ data Referenced a
739instance IsString a => IsString (Referenced a) where
825instance IsString a => IsString (Referenced a) where
740 fromString = Inline . fromString
826 fromString = Inline . fromString
742−newtype URL = URL { getUrl :: Text } deriving (Eq, Ord, Show, ToJSON, FromJSON, Data, Typeable)
828+newtype URL = URL { getUrl :: Text } deriving (Eq, Ord, Show, Hashable, ToJSON, FromJSON, Data, Typeable)
830+data AdditionalProperties
831+ = AdditionalPropertiesAllowed Bool
832+ | AdditionalPropertiesSchema (Referenced Schema)
833+ deriving (Eq, Show, Data, Typeable)
744-- =======================================================================
835-- =======================================================================
745-- Monoid instances
836-- Monoid instances
746-- =======================================================================
837-- =======================================================================
839+instance Semigroup Swagger where
840+ (<>) = genericMappend
748instance Monoid Swagger where
841instance Monoid Swagger where
749 mempty = genericMempty
842 mempty = genericMempty
750− mappend = genericMappend
843+ mappend = (<>)
845+instance Semigroup Info where
846+ (<>) = genericMappend
752instance Monoid Info where
847instance Monoid Info where
753 mempty = genericMempty
848 mempty = genericMempty
754− mappend = genericMappend
849+ mappend = (<>)
851+instance Semigroup Contact where
852+ (<>) = genericMappend
756instance Monoid Contact where
853instance Monoid Contact where
757 mempty = genericMempty
854 mempty = genericMempty
758− mappend = genericMappend
855+ mappend = (<>)
857+instance Semigroup PathItem where
858+ (<>) = genericMappend
760instance Monoid PathItem where
859instance Monoid PathItem where
761 mempty = genericMempty
860 mempty = genericMempty
762− mappend = genericMappend
861+ mappend = (<>)
863+instance Semigroup Schema where
864+ (<>) = genericMappend
764instance Monoid Schema where
865instance Monoid Schema where
765 mempty = genericMempty
866 mempty = genericMempty
766− mappend = genericMappend
867+ mappend = (<>)
869+instance Semigroup (ParamSchema t) where
870+ (<>) = genericMappend
768instance Monoid (ParamSchema t) where
871instance Monoid (ParamSchema t) where
769 mempty = genericMempty
872 mempty = genericMempty
770− mappend = genericMappend
873+ mappend = (<>)
875+instance Semigroup Param where
876+ (<>) = genericMappend
772instance Monoid Param where
877instance Monoid Param where
773 mempty = genericMempty
878 mempty = genericMempty
774− mappend = genericMappend
879+ mappend = (<>)
881+instance Semigroup ParamOtherSchema where
882+ (<>) = genericMappend
776instance Monoid ParamOtherSchema where
883instance Monoid ParamOtherSchema where
777 mempty = genericMempty
884 mempty = genericMempty
778− mappend = genericMappend
885+ mappend = (<>)
887+instance Semigroup Header where
888+ (<>) = genericMappend
780instance Monoid Header where
889instance Monoid Header where
781 mempty = genericMempty
890 mempty = genericMempty
782− mappend = genericMappend
891+ mappend = (<>)
893+instance Semigroup Responses where
894+ (<>) = genericMappend
784instance Monoid Responses where
895instance Monoid Responses where
785 mempty = genericMempty
896 mempty = genericMempty
786− mappend = genericMappend
897+ mappend = (<>)
899+instance Semigroup Response where
900+ (<>) = genericMappend
788instance Monoid Response where
901instance Monoid Response where
789 mempty = genericMempty
902 mempty = genericMempty
790− mappend = genericMappend
903+ mappend = (<>)
905+instance Semigroup ExternalDocs where
906+ (<>) = genericMappend
792instance Monoid ExternalDocs where
907instance Monoid ExternalDocs where
793 mempty = genericMempty
908 mempty = genericMempty
794− mappend = genericMappend
909+ mappend = (<>)
911+instance Semigroup Operation where
912+ (<>) = genericMappend
796instance Monoid Operation where
913instance Monoid Operation where
797 mempty = genericMempty
914 mempty = genericMempty
798− mappend = genericMappend
915+ mappend = (<>)
917+instance Semigroup Example where
918+ (<>) = genericMappend
800instance Monoid Example where
919instance Monoid Example where
801 mempty = genericMempty
920 mempty = genericMempty
802− mappend = genericMappend
921+ mappend = (<>)
923+instance Semigroup SecurityScheme where
924+ (<>) = mergeSecurityScheme
926+instance Semigroup SecurityDefinitions where
927+ (SecurityDefinitions sd1) <> (SecurityDefinitions sd2) =
928+ SecurityDefinitions $ InsOrdHashMap.unionWith (<>) sd1 sd2
930+instance Monoid SecurityDefinitions where
931+ mempty = SecurityDefinitions $ InsOrdHashMap.empty
804-- =======================================================================
934-- =======================================================================
805-- SwaggerMonoid helper instances
935-- SwaggerMonoid helper instances
@@ -815,6 +945,8 @@ instance SwaggerMonoid Responses
815instance SwaggerMonoid Response
945instance SwaggerMonoid Response
816instance SwaggerMonoid ExternalDocs
946instance SwaggerMonoid ExternalDocs
817instance SwaggerMonoid Operation
947instance SwaggerMonoid Operation
948+instance SwaggerMonoid SecurityDefinitions
949+instance (Eq a, Hashable a) => SwaggerMonoid (InsOrdHashSet a)
819instance SwaggerMonoid MimeList
951instance SwaggerMonoid MimeList
820deriving instance SwaggerMonoid URL
952deriving instance SwaggerMonoid URL
@@ -827,17 +959,13 @@ instance SwaggerMonoid ParamLocation where
827 swaggerMempty = ParamQuery
959 swaggerMempty = ParamQuery
828 swaggerMappend _ y = y
960 swaggerMappend _ y = y
830−instance OVERLAPPING_ SwaggerMonoid (HashMap FilePath PathItem) where
831− swaggerMempty = HashMap.empty
832− swaggerMappend = HashMap.unionWith mappend
834instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap FilePath PathItem) where
962instance OVERLAPPING_ SwaggerMonoid (InsOrdHashMap FilePath PathItem) where
835 swaggerMempty = InsOrdHashMap.empty
963 swaggerMempty = InsOrdHashMap.empty
836 swaggerMappend = InsOrdHashMap.unionWith mappend
964 swaggerMappend = InsOrdHashMap.unionWith mappend
838instance Monoid a => SwaggerMonoid (Referenced a) where
966instance Monoid a => SwaggerMonoid (Referenced a) where
839 swaggerMempty = Inline mempty
967 swaggerMempty = Inline mempty
840− swaggerMappend (Inline x) (Inline y) = Inline (x <> y)
968+ swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
841 swaggerMappend _ y = y
969 swaggerMappend _ y = y
843instance SwaggerMonoid ParamAnySchema where
971instance SwaggerMonoid ParamAnySchema where
@@ -931,8 +1059,8 @@ instance ToJSON OAuth2Flow where
931 , "tokenUrl" .= tokenUrl ]
1059 , "tokenUrl" .= tokenUrl ]
933instance ToJSON OAuth2Params where
1061instance ToJSON OAuth2Params where
934− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "oauth2" &
1062+ toJSON = sopSwaggerGenericToJSON
935− saoSubObject ?~ "flow"
1063+ DEFINE_TOENCODING
937instance ToJSON SecuritySchemeType where
1065instance ToJSON SecuritySchemeType where
938 toJSON SecuritySchemeBasic
1066 toJSON SecuritySchemeBasic
@@ -945,26 +1073,37 @@ instance ToJSON SecuritySchemeType where
945 <+> object [ "type" .= ("oauth2" :: Text) ]
1073 <+> object [ "type" .= ("oauth2" :: Text) ]
947instance ToJSON Swagger where
1075instance ToJSON Swagger where
948− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "swagger" &
1076+ toJSON = sopSwaggerGenericToJSON
949− saoAdditionalPairs .~ [("swagger", "2.0")]
1077+ DEFINE_TOENCODING
951instance ToJSON SecurityScheme where
1079instance ToJSON SecurityScheme where
952− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "securityScheme" &
1080+ toJSON = sopSwaggerGenericToJSON
953− saoSubObject ?~ "type"
1081+ DEFINE_TOENCODING
955instance ToJSON Schema where
1083instance ToJSON Schema where
956− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "schema" &
1084+ toJSON = sopSwaggerGenericToJSON
957− saoSubObject ?~ "paramSchema"
1085+ DEFINE_TOENCODING
959instance ToJSON Header where
1087instance ToJSON Header where
960− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "header" &
1088+ toJSON = sopSwaggerGenericToJSON
961− saoSubObject ?~ "paramSchema"
1089+ DEFINE_TOENCODING
1091+-- | As for nullary schema for 0-arity type constructors, see
1092+-- <https://github.com/GetShopTV/swagger2/issues/167>.
1094+-- >>> encode (SwaggerItemsArray [])
1095+-- "{\"example\":[],\"items\":{},\"maxItems\":0}"
963−instance ToJSON (SwaggerItems t) where
1097+instance ToJSON (ParamSchema t) => ToJSON (SwaggerItems t) where
964 toJSON (SwaggerItemsPrimitive fmt schema) = object
1098 toJSON (SwaggerItemsPrimitive fmt schema) = object
965 [ "collectionFormat" .= fmt
1099 [ "collectionFormat" .= fmt
966 , "items" .= schema ]
1100 , "items" .= schema ]
967 toJSON (SwaggerItemsObject x) = object [ "items" .= x ]
1101 toJSON (SwaggerItemsObject x) = object [ "items" .= x ]
1102+ toJSON (SwaggerItemsArray []) = object
1103+ [ "items" .= object []
1104+ , "maxItems" .= (0 :: Int)
1105+ , "example" .= Array mempty
968 toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
1107 toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
970instance ToJSON Host where
1109instance ToJSON Host where
@@ -977,33 +1116,39 @@ instance ToJSON MimeList where
977 toJSON (MimeList xs) = toJSON (map show xs)
1116 toJSON (MimeList xs) = toJSON (map show xs)
979instance ToJSON Param where
1118instance ToJSON Param where
980− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "param" &
1119+ toJSON = sopSwaggerGenericToJSON
981− saoSubObject ?~ "schema"
1120+ DEFINE_TOENCODING
983instance ToJSON ParamAnySchema where
1122instance ToJSON ParamAnySchema where
984 toJSON (ParamBody s) = object [ "in" .= ("body" :: Text), "schema" .= s ]
1123 toJSON (ParamBody s) = object [ "in" .= ("body" :: Text), "schema" .= s ]
985 toJSON (ParamOther s) = toJSON s
1124 toJSON (ParamOther s) = toJSON s
987instance ToJSON ParamOtherSchema where
1126instance ToJSON ParamOtherSchema where
988− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "paramOtherSchema" &
1127+ toJSON = sopSwaggerGenericToJSON
989− saoSubObject ?~ "paramSchema"
1128+ DEFINE_TOENCODING
991instance ToJSON Responses where
1130instance ToJSON Responses where
992− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "responses" &
1131+ toJSON = sopSwaggerGenericToJSON
993− saoSubObject ?~ "responses"
1132+ DEFINE_TOENCODING
995instance ToJSON Response where
1134instance ToJSON Response where
996− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "response"
1135+ toJSON = sopSwaggerGenericToJSON
998instance ToJSON Operation where
1138instance ToJSON Operation where
999− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "operation"
1139+ toJSON = sopSwaggerGenericToJSON
1001instance ToJSON PathItem where
1142instance ToJSON PathItem where
1002− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "pathItem"
1143+ toJSON = sopSwaggerGenericToJSON
1004instance ToJSON Example where
1146instance ToJSON Example where
1005 toJSON = toJSON . Map.mapKeys show . getExample
1147 toJSON = toJSON . Map.mapKeys show . getExample
1149+instance ToJSON SecurityDefinitions where
1150+ toJSON (SecurityDefinitions sd) = toJSON sd
1007instance ToJSON Reference where
1152instance ToJSON Reference where
1008 toJSON (Reference ref) = object [ "$ref" .= ref ]
1153 toJSON (Reference ref) = object [ "$ref" .= ref ]
@@ -1032,9 +1177,14 @@ instance ToJSON (CollectionFormat t) where
1032 toJSON CollectionPipes = "pipes"
1177 toJSON CollectionPipes = "pipes"
1033 toJSON CollectionMulti = "multi"
1178 toJSON CollectionMulti = "multi"
1035−instance ToJSON (ParamSchema t) where
1180+instance ToJSON (ParamSchema k) where
1181+ -- TODO: this is a bit fishy, why we need sub object only in `ToJSON`?
1182+ toJSON = sopSwaggerGenericToJSONWithOpts $
1036− toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "paramSchema" &
1183+ mkSwaggerAesonOptions "paramSchema" & saoSubObject ?~ "items"
1037− saoSubObject ?~ "items"
1184+
1185+instance ToJSON AdditionalProperties where
1186+ toJSON (AdditionalPropertiesAllowed b) = toJSON b
1187+ toJSON (AdditionalPropertiesSchema s) = toJSON s
1039-- =======================================================================
1189-- =======================================================================
1040-- Manual FromJSON instances
1190-- Manual FromJSON instances
@@ -1054,7 +1204,7 @@ instance FromJSON OAuth2Flow where
1054 parseJSON _ = empty
1204 parseJSON _ = empty
1056instance FromJSON OAuth2Params where
1206instance FromJSON OAuth2Params where
1057− parseJSON = genericParseJSONWithSub "flow" (jsonPrefix "oauth2")
1207+ parseJSON = sopSwaggerGenericParseJSON
1059instance FromJSON SecuritySchemeType where
1209instance FromJSON SecuritySchemeType where
1060 parseJSON js@(Object o) = do
1210 parseJSON js@(Object o) = do
@@ -1067,39 +1217,48 @@ instance FromJSON SecuritySchemeType where
1067 parseJSON _ = empty
1217 parseJSON _ = empty
1069instance FromJSON Swagger where
1219instance FromJSON Swagger where
1070− parseJSON js@(Object o) = do
1220+ parseJSON = sopSwaggerGenericParseJSON
1071− (version :: Text) <- o .: "swagger"
1072− when (version /= "2.0") empty
1073− (genericParseJSON (jsonPrefix "swagger")
1074− `withDefaults` [ "consumes" .= (mempty :: MimeList)
1075− , "produces" .= (mempty :: MimeList)
1076− , "security" .= ([] :: [SecurityRequirement])
1077− , "tags" .= ([] :: [Tag])
1078− , "definitions" .= (mempty :: Definitions Schema)
1079− , "parameters" .= (mempty :: Definitions Param)
1080− , "responses" .= (mempty :: Definitions Response)
1081− , "securityDefinitions" .= (mempty :: Definitions SecurityScheme)
1083− parseJSON _ = empty
1085instance FromJSON SecurityScheme where
1222instance FromJSON SecurityScheme where
1086− parseJSON = genericParseJSONWithSub "type" (jsonPrefix "securityScheme")
1223+ parseJSON = sopSwaggerGenericParseJSON
1088instance FromJSON Schema where
1225instance FromJSON Schema where
1089− parseJSON = genericParseJSONWithSub "paramSchema" (jsonPrefix "schema")
1226+ parseJSON = fmap nullaryCleanup . sopSwaggerGenericParseJSON
1090− `withDefaults` [ "properties" .= (mempty :: InsOrdHashMap Text Schema)
1227+ where nullaryCleanup :: Schema -> Schema
1091− , "required" .= ([] :: [ParamName]) ]
1228+ nullaryCleanup s@Schema{_schemaParamSchema=ps} =
1229+ if _paramSchemaItems ps == Just (SwaggerItemsArray [])
1230+ then s { _schemaExample = Nothing
1231+ , _schemaParamSchema = ps { _paramSchemaMaxItems = Nothing } }
1093instance FromJSON Header where
1234instance FromJSON Header where
1094− parseJSON = genericParseJSONWithSub "paramSchema" (jsonPrefix "header")
1235+ parseJSON = sopSwaggerGenericParseJSON
1096−instance OVERLAPPABLE_ (FromJSON (CollectionFormat t), FromJSON (ParamSchema t)) => FromJSON (SwaggerItems t) where
1237+instance (FromJSON (CollectionFormat ('SwaggerKindNormal t)), FromJSON (ParamSchema ('SwaggerKindNormal t))) => FromJSON (SwaggerItems ('SwaggerKindNormal t)) where
1097 parseJSON = withObject "SwaggerItemsPrimitive" $ \o -> SwaggerItemsPrimitive
1238 parseJSON = withObject "SwaggerItemsPrimitive" $ \o -> SwaggerItemsPrimitive
1098 <$> o .:? "collectionFormat"
1239 <$> o .:? "collectionFormat"
1099 <*> (o .: "items" >>= parseJSON)
1240 <*> (o .: "items" >>= parseJSON)
1242+instance FromJSON (SwaggerItems 'SwaggerKindParamOtherSchema) where
1243+ parseJSON = withObject "SwaggerItemsPrimitive" $ \o -> SwaggerItemsPrimitive
1244+ <$> o .:? "collectionFormat"
1245+ <*> ((o .: "items" >>= parseJSON) <|> fail ("foo" ++ show o))
1249+-- >>> decode "{}" :: Maybe (SwaggerItems 'SwaggerKindSchema)
1250+-- Just (SwaggerItemsArray [])
1252+-- >>> eitherDecode "{\"$ref\":\"#/definitions/example\"}" :: Either String (SwaggerItems 'SwaggerKindSchema)
1253+-- Right (SwaggerItemsObject (Ref (Reference {getReference = "example"})))
1255+-- >>> eitherDecode "[{\"$ref\":\"#/definitions/example\"}]" :: Either String (SwaggerItems 'SwaggerKindSchema)
1256+-- Right (SwaggerItemsArray [Ref (Reference {getReference = "example"})])
1101−instance OVERLAPPABLE_ FromJSON (SwaggerItems Schema) where
1258+instance FromJSON (SwaggerItems 'SwaggerKindSchema) where
1259+ parseJSON js@(Object obj)
1260+ | null obj = pure $ SwaggerItemsArray [] -- Nullary schema.
1102− parseJSON js@(Object _) = SwaggerItemsObject <$> parseJSON js
1261+ | otherwise = SwaggerItemsObject <$> parseJSON js
1103 parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1262 parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1104 parseJSON _ = empty
1263 parseJSON _ = empty
@@ -1116,7 +1275,7 @@ instance FromJSON MimeList where
1116 parseJSON js = (MimeList . map fromString) <$> parseJSON js
1275 parseJSON js = (MimeList . map fromString) <$> parseJSON js
1118instance FromJSON Param where
1277instance FromJSON Param where
1119− parseJSON = genericParseJSONWithSub "schema" (jsonPrefix "param")
1278+ parseJSON = sopSwaggerGenericParseJSON
1121instance FromJSON ParamAnySchema where
1280instance FromJSON ParamAnySchema where
1122 parseJSON js@(Object o) = do
1281 parseJSON js@(Object o) = do
@@ -1129,7 +1288,7 @@ instance FromJSON ParamAnySchema where
1129 parseJSON _ = empty
1288 parseJSON _ = empty
1131instance FromJSON ParamOtherSchema where
1290instance FromJSON ParamOtherSchema where
1132− parseJSON = genericParseJSONWithSub "paramSchema" (jsonPrefix "paramOtherSchema")
1291+ parseJSON = sopSwaggerGenericParseJSON
1134instance FromJSON Responses where
1293instance FromJSON Responses where
1135 parseJSON (Object o) = Responses
1294 parseJSON (Object o) = Responses
@@ -1143,18 +1302,16 @@ instance FromJSON Example where
1143 pure $ Example (Map.mapKeys fromString m)
1302 pure $ Example (Map.mapKeys fromString m)
1145instance FromJSON Response where
1304instance FromJSON Response where
1146− parseJSON = genericParseJSON (jsonPrefix "response")
1305+ parseJSON = sopSwaggerGenericParseJSON
1147− `withDefaults` [ "headers" .= (mempty :: InsOrdHashMap HeaderName Header) ]
1149instance FromJSON Operation where
1307instance FromJSON Operation where
1150− parseJSON = genericParseJSON (jsonPrefix "operation")
1308+ parseJSON = sopSwaggerGenericParseJSON
1151− `withDefaults` [ "security" .= ([] :: [SecurityRequirement])
1152− , "tags" .= ([] :: [Tag])
1153− , "parameters" .= ([] :: [Referenced Param]) ]
1155instance FromJSON PathItem where
1310instance FromJSON PathItem where
1156− parseJSON = genericParseJSON (jsonPrefix "pathItem")
1311+ parseJSON = sopSwaggerGenericParseJSON
1157− `withDefaults` [ "parameters" .= ([] :: [Param]) ]
1312+
1313+instance FromJSON SecurityDefinitions where
1314+ parseJSON js = SecurityDefinitions <$> parseJSON js
1159instance FromJSON Reference where
1316instance FromJSON Reference where
1160 parseJSON (Object o) = Reference <$> o .: "$ref"
1317 parseJSON (Object o) = Reference <$> o .: "$ref"
@@ -1180,28 +1337,35 @@ instance FromJSON (Referenced Response) where parseJSON = referencedParseJSON "#
1180instance FromJSON Xml where
1337instance FromJSON Xml where
1181 parseJSON = genericParseJSON (jsonPrefix "xml")
1338 parseJSON = genericParseJSON (jsonPrefix "xml")
1183−instance FromJSON (SwaggerType Schema) where
1340+instance FromJSON (SwaggerType 'SwaggerKindSchema) where
1184 parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray, SwaggerNull, SwaggerObject]
1341 parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray, SwaggerNull, SwaggerObject]
1186−instance FromJSON (SwaggerType ParamOtherSchema) where
1343+instance FromJSON (SwaggerType 'SwaggerKindParamOtherSchema) where
1187 parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray, SwaggerFile]
1344 parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray, SwaggerFile]
1189−instance OVERLAPPABLE_ FromJSON (SwaggerType t) where
1346+instance FromJSON (SwaggerType ('SwaggerKindNormal t)) where
1190 parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray]
1347 parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray]
1192−instance OVERLAPPABLE_ FromJSON (CollectionFormat t) where
1349+instance FromJSON (CollectionFormat ('SwaggerKindNormal t)) where
1193 parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]
1350 parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]
1352+-- NOTE: There aren't collections of 'Schema'
1195−instance FromJSON (CollectionFormat ParamOtherSchema) where
1353+--instance FromJSON (CollectionFormat (SwaggerKindSchema)) where
1354+-- parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]
1356+instance FromJSON (CollectionFormat 'SwaggerKindParamOtherSchema) where
1196 parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes, CollectionMulti]
1357 parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes, CollectionMulti]
1198−-- NOTE: The constraints @FromJSON (SwaggerType t)@ and
1359+instance (FromJSON (SwaggerType ('SwaggerKindNormal t)), FromJSON (SwaggerItems ('SwaggerKindNormal t))) => FromJSON (ParamSchema ('SwaggerKindNormal t)) where
1199−-- @FromJSON (SwaggerItems t)@ are necessary here!
1360+ parseJSON = sopSwaggerGenericParseJSON
1200−-- Without the constraint the general instance will be used
1361+instance FromJSON (ParamSchema 'SwaggerKindParamOtherSchema) where
1201−-- that only accepts common types (i.e. NOT object, null or file)
1362+ parseJSON = sopSwaggerGenericParseJSON
1202−-- and primitive array items.
1363+instance FromJSON (ParamSchema 'SwaggerKindSchema) where
1203−instance (FromJSON (SwaggerType t), FromJSON (SwaggerItems t)) => FromJSON (ParamSchema t) where
1364+ parseJSON = sopSwaggerGenericParseJSON
1204− parseJSON = genericParseJSONWithSub "items" (jsonPrefix "ParamSchema")
1365+
1366+instance FromJSON AdditionalProperties where
1367+ parseJSON (Bool b) = pure $ AdditionalPropertiesAllowed b
1368+ parseJSON js = AdditionalPropertiesSchema <$> parseJSON js
1206-------------------------------------------------------------------------------
1370-------------------------------------------------------------------------------
1207-- TH splices
1371-- TH splices
@@ -1219,3 +1383,45 @@ deriveGeneric ''SecurityScheme
1219deriveGeneric ''Schema
1383deriveGeneric ''Schema
1220deriveGeneric ''ParamSchema
1384deriveGeneric ''ParamSchema
1221deriveGeneric ''Swagger
1385deriveGeneric ''Swagger
1387+instance HasSwaggerAesonOptions Header where
1388+ swaggerAesonOptions _ = mkSwaggerAesonOptions "header" & saoSubObject ?~ "paramSchema"
1389+instance HasSwaggerAesonOptions OAuth2Params where
1390+ swaggerAesonOptions _ = mkSwaggerAesonOptions "oauth2" & saoSubObject ?~ "flow"
1391+instance HasSwaggerAesonOptions Operation where
1392+ swaggerAesonOptions _ = mkSwaggerAesonOptions "operation"
1393+instance HasSwaggerAesonOptions Param where
1394+ swaggerAesonOptions _ = mkSwaggerAesonOptions "param" & saoSubObject ?~ "schema"
1395+instance HasSwaggerAesonOptions ParamOtherSchema where
1396+ swaggerAesonOptions _ = mkSwaggerAesonOptions "paramOtherSchema" & saoSubObject ?~ "paramSchema"
1397+instance HasSwaggerAesonOptions PathItem where
1398+ swaggerAesonOptions _ = mkSwaggerAesonOptions "pathItem"
1399+instance HasSwaggerAesonOptions Response where
1400+ swaggerAesonOptions _ = mkSwaggerAesonOptions "response"
1401+instance HasSwaggerAesonOptions Responses where
1402+ swaggerAesonOptions _ = mkSwaggerAesonOptions "responses" & saoSubObject ?~ "responses"
1403+instance HasSwaggerAesonOptions SecurityScheme where
1404+ swaggerAesonOptions _ = mkSwaggerAesonOptions "securityScheme" & saoSubObject ?~ "type"
1405+instance HasSwaggerAesonOptions Schema where
1406+ swaggerAesonOptions _ = mkSwaggerAesonOptions "schema" & saoSubObject ?~ "paramSchema"
1407+instance HasSwaggerAesonOptions Swagger where
1408+ swaggerAesonOptions _ = mkSwaggerAesonOptions "swagger" & saoAdditionalPairs .~ [("swagger", "2.0")]
1410+instance HasSwaggerAesonOptions (ParamSchema ('SwaggerKindNormal t)) where
1411+ swaggerAesonOptions _ = mkSwaggerAesonOptions "paramSchema" & saoSubObject ?~ "items"
1412+instance HasSwaggerAesonOptions (ParamSchema 'SwaggerKindParamOtherSchema) where
1413+ swaggerAesonOptions _ = mkSwaggerAesonOptions "paramSchema" & saoSubObject ?~ "items"
1414+-- NOTE: Schema doesn't have 'items' sub object!
1415+instance HasSwaggerAesonOptions (ParamSchema 'SwaggerKindSchema) where
1416+ swaggerAesonOptions _ = mkSwaggerAesonOptions "paramSchema"
1418+instance AesonDefaultValue (ParamSchema s)
1419+instance AesonDefaultValue OAuth2Flow
1420+instance AesonDefaultValue Responses
1421+instance AesonDefaultValue ParamAnySchema
1422+instance AesonDefaultValue SecuritySchemeType
1423+instance AesonDefaultValue (SwaggerType a)
1424+instance AesonDefaultValue MimeList where defaultValue = Just mempty
1425+instance AesonDefaultValue Info
1426+instance AesonDefaultValue ParamLocation
1427+instance AesonDefaultValue SecurityDefinitions where defaultValue = Just $ SecurityDefinitions mempty