@@ -1,6 +1,6 @@
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE DeriveDataTypeable #-}
3−{-# LANGUAGE DeriveFunctor #-}
4{-# LANGUAGE DeriveGeneric #-}
4{-# LANGUAGE DeriveGeneric #-}
5{-# LANGUAGE DeriveTraversable #-}
5{-# LANGUAGE DeriveTraversable #-}
6{-# LANGUAGE FlexibleContexts #-}
6{-# LANGUAGE FlexibleContexts #-}
@@ -14,87 +14,91 @@
14{-# LANGUAGE TemplateHaskell #-}
14{-# LANGUAGE TemplateHaskell #-}
15{-# LANGUAGE TypeFamilies #-}
15{-# LANGUAGE TypeFamilies #-}
16{-# LANGUAGE UndecidableInstances #-}
16{-# LANGUAGE UndecidableInstances #-}
17−module Data.Swagger.Internal where
17+module Data.OpenApi.Internal where
19import Prelude ()
19import Prelude ()
20import Prelude.Compat
20import Prelude.Compat
22−import Control.Lens ((&), (.~), (?~))
23import Control.Applicative
22import Control.Applicative
24−import Data.Aeson
23+import Control.Lens ((&), (.~), (?~))
24+import Data.Aeson hiding (Encoding)
25+#if MIN_VERSION_aeson(2,0,0)
26+import qualified Data.Aeson.KeyMap as KeyMap
25−import qualified Data.Aeson.Types as JSON
28+import qualified Data.Aeson.Types as JSON
26−import Data.Data (Data(..), Typeable, mkConstr, mkDataType, Fixity(..), Constr, DataType, constrIndex)
29+import Data.Data (Constr, Data (..), DataType, Fixity (..), Typeable,
30+ constrIndex, mkConstr, mkDataType)
27−import Data.Hashable (Hashable)
31+import Data.Hashable (Hashable (..))
28−import qualified Data.HashMap.Strict as HashMap
32+import qualified Data.HashMap.Strict as HashMap
29−import Data.HashSet.InsOrd (InsOrdHashSet)
33+import Data.HashSet.InsOrd (InsOrdHashSet)
30−import Data.Map (Map)
34+import Data.Map (Map)
31−import qualified Data.Map as Map
35+import qualified Data.Map as Map
32−import Data.Monoid (Monoid (..))
36+import Data.Monoid (Monoid (..))
37+import Data.Scientific (Scientific)
33−import Data.Semigroup.Compat (Semigroup (..))
38+import Data.Semigroup.Compat (Semigroup (..))
34−import Data.Scientific (Scientific)
35−import Data.String (IsString(..))
39+import Data.String (IsString (..))
36−import Data.Text (Text)
40+import Data.Text (Text)
37−import qualified Data.Text as Text
41+import qualified Data.Text as Text
42+import Data.Text.Encoding (encodeUtf8)
38−import GHC.Generics (Generic)
43+import GHC.Generics (Generic)
39−import Network.Socket (HostName, PortNumber)
44+import Network.HTTP.Media (MediaType, mainType, parameters, parseAccept, subType, (//),
40−import Network.HTTP.Media (MediaType)
45+ (/:))
46+import Network.Socket (HostName, PortNumber)
41−import Text.Read (readMaybe)
47+import Text.Read (readMaybe)
43import Data.HashMap.Strict.InsOrd (InsOrdHashMap)
49import Data.HashMap.Strict.InsOrd (InsOrdHashMap)
44import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
50import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
52+import Data.OpenApi.Aeson.Compat (deleteKey)
53+import Data.OpenApi.Internal.AesonUtils (AesonDefaultValue (..), HasSwaggerAesonOptions (..),
54+ mkSwaggerAesonOptions, saoAdditionalPairs, saoSubObject,
55+ sopSwaggerGenericParseJSON, sopSwaggerGenericToEncoding,
56+ sopSwaggerGenericToJSON, sopSwaggerGenericToJSONWithOpts)
57+import Data.OpenApi.Internal.Utils
46import Generics.SOP.TH (deriveGeneric)
58import Generics.SOP.TH (deriveGeneric)
47−import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToJSON
48− ,sopSwaggerGenericToJSONWithOpts
49− ,sopSwaggerGenericParseJSON
50− ,HasSwaggerAesonOptions(..)
51− ,AesonDefaultValue(..)
52− ,mkSwaggerAesonOptions
55−import Data.Swagger.Internal.Utils
56−import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToEncoding)
59-- >>> :seti -XDataKinds
61-- >>> :seti -XDataKinds
60-- >>> import Data.Aeson
62-- >>> import Data.Aeson
63+-- >>> import Data.ByteString.Lazy.Char8 as BSL
64+-- >>> import Data.OpenApi.Internal.Utils
62-- | A list of definitions that can be used in references.
66-- | A list of definitions that can be used in references.
63type Definitions = InsOrdHashMap Text
67type Definitions = InsOrdHashMap Text
65-- | This is the root document object for the API specification.
69-- | This is the root document object for the API specification.
66−data Swagger = Swagger
70+data OpenApi = OpenApi
67 { -- | Provides metadata about the API.
71 { -- | Provides metadata about the API.
68 -- The metadata can be used by the clients if needed.
72 -- The metadata can be used by the clients if needed.
69− _swaggerInfo :: Info
73+ _openApiInfo :: Info
71 -- | An array of Server Objects, which provide connectivity information
75 -- | An array of Server Objects, which provide connectivity information
72 -- to a target server. If the servers property is not provided, or is an empty array,
76 -- to a target server. If the servers property is not provided, or is an empty array,
73 -- the default value would be a 'Server' object with a url value of @/@.
77 -- the default value would be a 'Server' object with a url value of @/@.
74− , _swaggerServers :: [Server]
78+ , _openApiServers :: [Server]
76 -- | The available paths and operations for the API.
80 -- | The available paths and operations for the API.
77− , _swaggerPaths :: InsOrdHashMap FilePath PathItem
81+ , _openApiPaths :: InsOrdHashMap FilePath PathItem
79 -- | An element to hold various schemas for the specification.
83 -- | An element to hold various schemas for the specification.
80− , _swaggerComponents :: Components
84+ , _openApiComponents :: Components
82 -- | A declaration of which security mechanisms can be used across the API.
86 -- | A declaration of which security mechanisms can be used across the API.
83 -- The list of values includes alternative security requirement objects that can be used.
87 -- The list of values includes alternative security requirement objects that can be used.
84 -- Only one of the security requirement objects need to be satisfied to authorize a request.
88 -- Only one of the security requirement objects need to be satisfied to authorize a request.
85 -- Individual operations can override this definition.
89 -- Individual operations can override this definition.
86 -- To make security optional, an empty security requirement can be included in the array.
90 -- To make security optional, an empty security requirement can be included in the array.
87− , _swaggerSecurity :: [SecurityRequirement]
91+ , _openApiSecurity :: [SecurityRequirement]
89 -- | A list of tags used by the specification with additional metadata.
93 -- | A list of tags used by the specification with additional metadata.
90 -- The order of the tags can be used to reflect on their order by the parsing tools.
94 -- The order of the tags can be used to reflect on their order by the parsing tools.
91 -- Not all tags that are used by the 'Operation' Object must be declared.
95 -- Not all tags that are used by the 'Operation' Object must be declared.
92 -- The tags that are not declared MAY be organized randomly or based on the tools' logic.
96 -- The tags that are not declared MAY be organized randomly or based on the tools' logic.
93 -- Each tag name in the list MUST be unique.
97 -- Each tag name in the list MUST be unique.
94− , _swaggerTags :: InsOrdHashSet Tag
98+ , _openApiTags :: InsOrdHashSet Tag
96 -- | Additional external documentation.
100 -- | Additional external documentation.
97− , _swaggerExternalDocs :: Maybe ExternalDocs
101+ , _openApiExternalDocs :: Maybe ExternalDocs
98 } deriving (Eq, Show, Generic, Data, Typeable)
102 } deriving (Eq, Show, Generic, Data, Typeable)
100-- | The object provides metadata about the API.
104-- | The object provides metadata about the API.
@@ -179,51 +183,24 @@ data ServerVariable = ServerVariable
179 , _serverVariableDescription :: Maybe Text
183 , _serverVariableDescription :: Maybe Text
180 } deriving (Eq, Show, Generic, Data, Typeable)
184 } deriving (Eq, Show, Generic, Data, Typeable)
186+instance IsString Server where
187+ fromString s = Server (fromString s) Nothing mempty
182-- | Holds a set of reusable objects for different aspects of the OAS.
189-- | Holds a set of reusable objects for different aspects of the OAS.
183-- All objects defined within the components object will have no effect on the API
190-- All objects defined within the components object will have no effect on the API
184-- unless they are explicitly referenced from properties outside the components object.
191-- unless they are explicitly referenced from properties outside the components object.
185data Components = Components
192data Components = Components
186− { _componentsSchemas :: Definitions Schema -- TODO check Schema itself
193+ { _componentsSchemas :: Definitions Schema
187 , _componentsResponses :: Definitions Response
194 , _componentsResponses :: Definitions Response
188 , _componentsParameters :: Definitions Param
195 , _componentsParameters :: Definitions Param
189−-- , _componentsExamples
196+ , _componentsExamples :: Definitions Example
190 , _componentsRequestBodies :: Definitions RequestBody
197 , _componentsRequestBodies :: Definitions RequestBody
191− , _componentsHeader :: Definitions Header
198+ , _componentsHeaders :: Definitions Header
192− , _componentsSecuritySchemes :: Definitions SecurityScheme
199+ , _componentsSecuritySchemes :: SecurityDefinitions
193−-- , _componentsLinks
200+ , _componentsLinks :: Definitions Link
194−-- , _componentsCallbacks
201+ , _componentsCallbacks :: Definitions Callback
195 } deriving (Eq, Show, Generic, Data, Typeable)
202 } deriving (Eq, Show, Generic, Data, Typeable)
197−-- | The host (name or ip) serving the API. It MAY include a port.
199− { _hostName :: HostName -- ^ Host name.
200− , _hostPort :: Maybe PortNumber -- ^ Optional port.
201− } deriving (Eq, Show, Generic, Typeable)
203−instance IsString Host where
204− fromString s = Host s Nothing
207−hostConstr = mkConstr hostDataType "Host" [] Prefix
209−hostDataType :: DataType
210−hostDataType = mkDataType "Data.Swagger.Host" [hostConstr]
212−instance Data Host where
213− gunfold k z c = case constrIndex c of
214− 1 -> k (k (z (\name mport -> Host name (fromInteger <$> mport))))
215− _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type Host."
216− toConstr (Host _ _) = hostConstr
217− dataTypeOf _ = hostDataType
219−-- | The transfer protocol of the API.
225− deriving (Eq, Show, Generic, Data, Typeable)
227-- | Describes the operations available on a single path.
204-- | Describes the operations available on a single path.
228-- A @'PathItem'@ may be empty, due to ACL constraints.
205-- A @'PathItem'@ may be empty, due to ACL constraints.
229-- The path itself is still exposed to the documentation viewer
206-- The path itself is still exposed to the documentation viewer
@@ -311,7 +288,11 @@ data Operation = Operation
311 -- | The list of possible responses as they are returned from executing this operation.
288 -- | The list of possible responses as they are returned from executing this operation.
312 , _operationResponses :: Responses
289 , _operationResponses :: Responses
314− -- TODO callbacks
291+ -- | A map of possible out-of band callbacks related to the parent operation.
292+ -- The key is a unique identifier for the 'Callback' Object.
293+ -- Each value in the map is a 'Callback' Object that describes a request
294+ -- that may be initiated by the API provider and the expected responses.
295+ , _operationCallbacks :: InsOrdHashMap Text (Referenced Callback)
316 -- | Declares this operation to be deprecated.
297 -- | Declares this operation to be deprecated.
317 -- Usage of the declared operation should be refrained.
298 -- Usage of the declared operation should be refrained.
@@ -331,6 +312,22 @@ data Operation = Operation
331 , _operationServers :: [Server]
312 , _operationServers :: [Server]
332 } deriving (Eq, Show, Generic, Data, Typeable)
313 } deriving (Eq, Show, Generic, Data, Typeable)
315+-- This instance should be in @http-media@.
316+instance Data MediaType where
317+ gunfold k z c = case constrIndex c of
318+ 1 -> k (k (k (z (\main sub params -> foldl (/:) (main // sub) (Map.toList params)))))
319+ _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type MediaType."
321+ toConstr _ = mediaTypeConstr
323+ dataTypeOf _ = mediaTypeData
325+mediaTypeConstr = mkConstr mediaTypeData "MediaType" [] Prefix
326+mediaTypeData = mkDataType "MediaType" [mediaTypeConstr]
328+instance Hashable MediaType where
329+ hashWithSalt salt mt = salt `hashWithSalt` show mt
334-- | Describes a single request body.
331-- | Describes a single request body.
335data RequestBody = RequestBody
332data RequestBody = RequestBody
336 { -- | A brief description of the request body. This could contain examples of use.
333 { -- | A brief description of the request body. This could contain examples of use.
@@ -340,21 +337,94 @@ data RequestBody = RequestBody
340 -- | The content of the request body.
337 -- | The content of the request body.
341 -- The key is a media type or media type range and the value describes it.
338 -- The key is a media type or media type range and the value describes it.
342 -- For requests that match multiple keys, only the most specific key is applicable.
339 -- For requests that match multiple keys, only the most specific key is applicable.
343− -- e.g. @text/plain@ overrides @text/*@
340+ -- e.g. @text/plain@ overrides @text/\*@
344− , _requestBodyContent :: InsOrdHashMap {-MediaType-} Text MediaTypeObject -- FIXME Data MediaType
341+ , _requestBodyContent :: InsOrdHashMap MediaType MediaTypeObject
343+ -- | Determines if the request body is required in the request.
344+ -- Defaults to 'False'.
346 , _requestBodyRequired :: Maybe Bool
345 , _requestBodyRequired :: Maybe Bool
347 } deriving (Eq, Show, Generic, Data, Typeable)
346 } deriving (Eq, Show, Generic, Data, Typeable)
349-- | Each Media Type Object provides schema and examples for the media type identified by its key.
348-- | Each Media Type Object provides schema and examples for the media type identified by its key.
350data MediaTypeObject = MediaTypeObject
349data MediaTypeObject = MediaTypeObject
351− { _mediaTypeSchema :: Maybe (Referenced Schema)
350+ { _mediaTypeObjectSchema :: Maybe (Referenced Schema)
353−-- TODO
352+ -- | Example of the media type.
354−-- , _mediaTypeExample
353+ -- The example object SHOULD be in the correct format as specified by the media type.
355−-- , _mediaTypeExamples
354+ , _mediaTypeObjectExample :: Maybe Value
356+ -- | Examples of the media type.
357+ -- Each example object SHOULD match the media type and specified schema if present.
358+ , _mediaTypeObjectExamples :: InsOrdHashMap Text (Referenced Example)
360+ -- | A map between a property name and its encoding information.
361+ -- The key, being the property name, MUST exist in the schema as a property.
362+ -- The encoding object SHALL only apply to 'RequestBody' objects when the media type
363+ -- is @multipart@ or @application/x-www-form-urlencoded@.
357−-- , _mediaTypeEncoding :: InsOrdHashMap Text Encoding
364+ , _mediaTypeObjectEncoding :: InsOrdHashMap Text Encoding
365+ } deriving (Eq, Show, Generic, Data, Typeable)
367+-- | In order to support common ways of serializing simple parameters, a set of style values are defined.
370+ -- ^ Path-style parameters defined by [RFC6570](https://tools.ietf.org/html/rfc6570#section-3.2.7).
372+ -- ^ Label style parameters defined by [RFC6570](https://tools.ietf.org/html/rfc6570#section-3.2.7).
374+ -- ^ Form style parameters defined by [RFC6570](https://tools.ietf.org/html/rfc6570#section-3.2.7).
375+ -- This option replaces @collectionFormat@ with a @csv@ (when @explode@ is false) or @multi@
376+ -- (when explode is true) value from OpenAPI 2.0.
378+ -- ^ Simple style parameters defined by [RFC6570](https://tools.ietf.org/html/rfc6570#section-3.2.7).
379+ -- This option replaces @collectionFormat@ with a @csv@ value from OpenAPI 2.0.
380+ | StyleSpaceDelimited
381+ -- ^ Space separated array values.
382+ -- This option replaces @collectionFormat@ equal to @ssv@ from OpenAPI 2.0.
383+ | StylePipeDelimited
384+ -- ^ Pipe separated array values.
385+ -- This option replaces @collectionFormat@ equal to @pipes@ from OpenAPI 2.0.
387+ -- ^ Provides a simple way of rendering nested objects using form parameters.
388+ deriving (Eq, Show, Generic, Data, Typeable)
390+data Encoding = Encoding
391+ { -- | The Content-Type for encoding a specific property.
392+ -- Default value depends on the property type: for @string@
393+ -- with format being @binary@ – @application/octet-stream@;
394+ -- for other primitive types – @text/plain@; for object - @application/json@;
395+ -- for array – the default is defined based on the inner type.
396+ -- The value can be a specific media type (e.g. @application/json@),
397+ -- a wildcard media type (e.g. @image/\*@), or a comma-separated list of the two types.
398+ _encodingContentType :: Maybe MediaType
400+ -- | A map allowing additional information to be provided as headers,
401+ -- for example @Content-Disposition@. @Content-Type@ is described separately
402+ -- and SHALL be ignored in this section.
403+ -- This property SHALL be ignored if the request body media type is not a @multipart@.
404+ , _encodingHeaders :: InsOrdHashMap Text (Referenced Header)
406+ -- | Describes how a specific property value will be serialized depending on its type.
407+ -- See 'Param' Object for details on the style property.
408+ -- The behavior follows the same values as query parameters, including default values.
409+ -- This property SHALL be ignored if the request body media type
410+ -- is not @application/x-www-form-urlencoded@.
411+ , _encodingStyle :: Maybe Style
413+ -- | When this is true, property values of type @array@ or @object@ generate
414+ -- separate parameters for each value of the array,
415+ -- or key-value-pair of the map.
416+ -- For other types of properties this property has no effect.
417+ -- When style is form, the default value is @true@. For all other styles,
418+ -- the default value is @false@. This property SHALL be ignored
419+ -- if the request body media type is not @application/x-www-form-urlencoded@.
420+ , _encodingExplode :: Maybe Bool
422+ -- | Determines whether the parameter value SHOULD allow reserved characters,
423+ -- as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-2.2)
424+ -- @:/?#[]@!$&'()*+,;=@ to be included without percent-encoding.
425+ -- The default value is @false@. This property SHALL be ignored if the request body media type
426+ -- is not @application/x-www-form-urlencoded@.
427+ , _encodingAllowReserved :: Maybe Bool
358 } deriving (Eq, Show, Generic, Data, Typeable)
428 } deriving (Eq, Show, Generic, Data, Typeable)
360newtype MimeList = MimeList { getMimeList :: [MediaType] }
430newtype MimeList = MimeList { getMimeList :: [MediaType] }
@@ -364,11 +434,11 @@ mimeListConstr :: Constr
364mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
434mimeListConstr = mkConstr mimeListDataType "MimeList" ["getMimeList"] Prefix
366mimeListDataType :: DataType
436mimeListDataType :: DataType
367−mimeListDataType = mkDataType "Data.Swagger.MimeList" [mimeListConstr]
437+mimeListDataType = mkDataType "Data.OpenApi.MimeList" [mimeListConstr]
369instance Data MimeList where
439instance Data MimeList where
370 gunfold k z c = case constrIndex c of
440 gunfold k z c = case constrIndex c of
371− 1 -> k (z (\xs -> MimeList (map fromString xs)))
441+ 1 -> k (z (MimeList . map fromString))
372 _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type MimeList."
442 _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type MimeList."
373 toConstr (MimeList _) = mimeListConstr
443 toConstr (MimeList _) = mimeListConstr
374 dataTypeOf _ = mimeListDataType
444 dataTypeOf _ = mimeListDataType
@@ -382,7 +452,7 @@ data Param = Param
383 -- | A brief description of the parameter.
453 -- | A brief description of the parameter.
384 -- This could contain examples of use.
454 -- This could contain examples of use.
385− -- GFM syntax can be used for rich text representation.
455+ -- CommonMark syntax MAY be used for rich text representation.
386 , _paramDescription :: Maybe Text
456 , _paramDescription :: Maybe Text
388 -- | Determines whether this parameter is mandatory.
458 -- | Determines whether this parameter is mandatory.
@@ -390,159 +460,141 @@ data Param = Param
390 -- Otherwise, the property MAY be included and its default value is @False@.
460 -- Otherwise, the property MAY be included and its default value is @False@.
391 , _paramRequired :: Maybe Bool
461 , _paramRequired :: Maybe Bool
393− -- | Parameter schema.
463+ -- | Specifies that a parameter is deprecated and SHOULD be transitioned out of usage.
394− , _paramSchema :: ParamAnySchema
464+ -- Default value is @false@.
395− } deriving (Eq, Show, Generic, Data, Typeable)
465+ , _paramDeprecated :: Maybe Bool
398− = ParamBody (Referenced Schema)
399− | ParamOther ParamOtherSchema
400− deriving (Eq, Show, Generic, Data, Typeable)
402−data ParamOtherSchema = ParamOtherSchema
403− { -- | The location of the parameter.
467+ -- | The location of the parameter.
404− _paramOtherSchemaIn :: ParamLocation
468+ , _paramIn :: ParamLocation
406 -- | Sets the ability to pass empty-valued parameters.
470 -- | Sets the ability to pass empty-valued parameters.
407− -- This is valid only for either @'ParamQuery'@ or @'ParamFormData'@
471+ -- This is valid only for 'ParamQuery' parameters and allows sending
408− -- and allows you to send a parameter with a name only or an empty value.
472+ -- a parameter with an empty value. Default value is @false@.
409− -- Default value is @False@.
473+ , _paramAllowEmptyValue :: Maybe Bool
410− , _paramOtherSchemaAllowEmptyValue :: Maybe Bool
474+
475+ -- | Determines whether the parameter value SHOULD allow reserved characters,
476+ -- as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-2.2)
477+ -- @:/?#[]@!$&'()*+,;=@ to be included without percent-encoding.
478+ -- This property only applies to parameters with an '_paramIn' value of 'ParamQuery'.
479+ -- The default value is 'False'.
480+ , _paramAllowReserved :: Maybe Bool
482+ -- | Parameter schema.
483+ , _paramSchema :: Maybe (Referenced Schema)
485+ -- | Describes how the parameter value will be serialized depending
486+ -- on the type of the parameter value. Default values (based on value of '_paramIn'):
487+ -- for 'ParamQuery' - 'StyleForm'; for 'ParamPath' - 'StyleSimple'; for 'ParamHeader' - 'StyleSimple';
488+ -- for 'ParamCookie' - 'StyleForm'.
489+ , _paramStyle :: Maybe Style
491+ -- | When this is true, parameter values of type @array@ or @object@
492+ -- generate separate parameters for each value of the array or key-value pair of the map.
493+ -- For other types of parameters this property has no effect.
494+ -- When style is @form@, the default value is true. For all other styles, the default value is false.
495+ , _paramExplode :: Maybe Bool
497+ -- | Example of the parameter's potential value.
498+ -- The example SHOULD match the specified schema and encoding properties if present.
499+ -- The '_paramExample' field is mutually exclusive of the '_paramExamples' field.
500+ -- Furthermore, if referencing a schema that contains an example, the example value
501+ -- SHALL override the example provided by the schema. To represent examples of media types
502+ -- that cannot naturally be represented in JSON or YAML, a string value can contain
503+ -- the example with escaping where necessary.
504+ , _paramExample :: Maybe Value
506+ -- | Examples of the parameter's potential value.
507+ -- Each example SHOULD contain a value in the correct format as specified
508+ -- in the parameter encoding. The '_paramExamples' field is mutually exclusive of the '_paramExample' field.
509+ -- Furthermore, if referencing a schema that contains an example,
510+ -- the examples value SHALL override the example provided by the schema.
511+ , _paramExamples :: InsOrdHashMap Text (Referenced Example)
514+ -- _paramContent :: InsOrdHashMap MediaType MediaTypeObject
515+ -- should be singleton. mutually exclusive with _paramSchema.
516+ } deriving (Eq, Show, Generic, Data, Typeable)
518+data Example = Example
519+ { -- | Short description for the example.
520+ _exampleSummary :: Maybe Text
522+ -- | Long description for the example.
523+ -- CommonMark syntax MAY be used for rich text representation.
524+ , _exampleDescription :: Maybe Text
526+ -- | Embedded literal example.
527+ -- The '_exampleValue' field and '_exampleExternalValue' field are mutually exclusive.
529+ -- To represent examples of media types that cannot naturally represented in JSON or YAML,
530+ -- use a string value to contain the example, escaping where necessary.
531+ , _exampleValue :: Maybe Value
533+ -- | A URL that points to the literal example.
534+ -- This provides the capability to reference examples that cannot easily be included
535+ -- in JSON or YAML documents. The '_exampleValue' field
536+ -- and '_exampleExternalValue' field are mutually exclusive.
537+ , _exampleExternalValue :: Maybe URL
538+ } deriving (Eq, Show, Generic, Typeable, Data)
412− , _paramOtherSchemaParamSchema :: ParamSchema 'SwaggerKindParamOtherSchema
540+data ExpressionOrValue
543+ deriving (Eq, Show, Generic, Typeable, Data)
545+-- | The Link object represents a possible design-time link for a response.
546+-- The presence of a link does not guarantee the caller's ability to successfully invoke it,
547+-- rather it provides a known relationship and traversal mechanism between responses and other operations.
549+ { -- | A relative or absolute URI reference to an OAS operation.
550+ -- This field is mutually exclusive of the '_linkOperationId' field,
551+ -- and MUST point to an 'Operation' Object. Relative '_linkOperationRef'
552+ -- values MAY be used to locate an existing 'Operation' Object in the OpenAPI definition.
553+ _linkOperationRef :: Maybe Text
555+ -- | The name of an /existing/, resolvable OAS operation, as defined with a unique
556+ -- '_operationOperationId'. This field is mutually exclusive of the '_linkOperationRef' field.
557+ , _linkOperationId :: Maybe Text
559+ -- | A map representing parameters to pass to an operation as specified with '_linkOperationId'
560+ -- or identified via '_linkOperationRef'. The key is the parameter name to be used, whereas
561+ -- the value can be a constant or an expression to be evaluated and passed to the linked operation.
562+ -- The parameter name can be qualified using the parameter location @[{in}.]{name}@
563+ -- for operations that use the same parameter name in different locations (e.g. path.id).
564+ , _linkParameters :: InsOrdHashMap Text ExpressionOrValue
566+ -- | A literal value or @{expression}@ to use as a request body when calling the target operation.
567+ , _linkRequestBody :: Maybe ExpressionOrValue
569+ -- | A description of the link.
570+ , _linkDescription :: Maybe Text
572+ -- | A server object to be used by the target operation.
573+ , _linkServer :: Maybe Server
413 } deriving (Eq, Show, Generic, Typeable, Data)
574 } deriving (Eq, Show, Generic, Typeable, Data)
415−-- | Items for @'SwaggerArray'@ schemas.
576+-- | Items for @'OpenApiArray'@ schemas.
417−-- @'SwaggerItemsPrimitive'@ should be used only for query params, headers and path pieces.
578+-- __Warning__: OpenAPI 3.0 does not support tuple arrays. However, OpenAPI 3.1 will, as
418−-- The @'CollectionFormat' t@ parameter specifies how elements of an array should be displayed.
579+-- it will incorporate Json Schema mostly verbatim.
419−-- Note that @fmt@ in @'SwaggerItemsPrimitive' fmt schema@ specifies format for elements of type @schema@.
420−-- This is different from the original Swagger's <http://swagger.io/specification/#itemsObject Items Object>.
422−-- @'SwaggerItemsObject'@ should be used to specify homogenous array @'Schema'@s.
581+-- @'OpenApiItemsObject'@ should be used to specify homogenous array @'Schema'@s.
424−-- @'SwaggerItemsArray'@ should be used to specify tuple @'Schema'@s.
583+-- @'OpenApiItemsArray'@ should be used to specify tuple @'Schema'@s.
425−data SwaggerItems t where
584+data OpenApiItems where
426− SwaggerItemsPrimitive :: Maybe (CollectionFormat k) -> ParamSchema k-> SwaggerItems k
585+ OpenApiItemsObject :: Referenced Schema -> OpenApiItems
427− SwaggerItemsObject :: Referenced Schema -> SwaggerItems 'SwaggerKindSchema
586+ OpenApiItemsArray :: [Referenced Schema] -> OpenApiItems
428− SwaggerItemsArray :: [Referenced Schema] -> SwaggerItems 'SwaggerKindSchema
587+ deriving (Eq, Show, Typeable, Data)
429− deriving (Typeable)
588+
430−
589+data OpenApiType where
431−deriving instance Eq (SwaggerItems t)
590+ OpenApiString :: OpenApiType
432−deriving instance Show (SwaggerItems t)
591+ OpenApiNumber :: OpenApiType
433−--deriving instance Typeable (SwaggerItems t)
592+ OpenApiInteger :: OpenApiType
434−
593+ OpenApiBoolean :: OpenApiType
435−swaggerItemsPrimitiveConstr :: Constr
594+ OpenApiArray :: OpenApiType
436−swaggerItemsPrimitiveConstr = mkConstr swaggerItemsDataType "SwaggerItemsPrimitive" [] Prefix
595+ OpenApiNull :: OpenApiType
437−
596+ OpenApiObject :: OpenApiType
438−swaggerItemsObjectConstr :: Constr
597+ deriving (Eq, Show, Typeable, Generic, Data)
439−swaggerItemsObjectConstr = mkConstr swaggerItemsDataType "SwaggerItemsObject" [] Prefix
441−swaggerItemsArrayConstr :: Constr
442−swaggerItemsArrayConstr = mkConstr swaggerItemsDataType "SwaggerItemsArray" [] Prefix
444−swaggerItemsDataType :: DataType
445−swaggerItemsDataType = mkDataType "Data.Swagger.SwaggerItems" [swaggerItemsPrimitiveConstr]
447−-- Note: unfortunately we have to write these Data instances by hand,
448−-- to get better contexts / avoid duplicate name when using standalone deriving
450−instance Data t => Data (SwaggerItems ('SwaggerKindNormal t)) where
451− -- TODO: define gfoldl
452− gunfold k z c = case constrIndex c of
453− 1 -> k (k (z SwaggerItemsPrimitive))
454− _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems t)."
455− toConstr _ = swaggerItemsPrimitiveConstr
456− dataTypeOf _ = swaggerItemsDataType
458−-- SwaggerItems SwaggerKindParamOtherSchema can be constructed using SwaggerItemsPrimitive only
459−instance Data (SwaggerItems 'SwaggerKindParamOtherSchema) where
460− -- TODO: define gfoldl
461− gunfold k z c = case constrIndex c of
462− 1 -> k (k (z SwaggerItemsPrimitive))
463− _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems SwaggerKindParamOtherSchema)."
464− toConstr _ = swaggerItemsPrimitiveConstr
465− dataTypeOf _ = swaggerItemsDataType
467−instance Data (SwaggerItems 'SwaggerKindSchema) where
468− gfoldl _ _ (SwaggerItemsPrimitive _ _) = error " Data.Data.gfoldl: Constructor SwaggerItemsPrimitive used to construct SwaggerItems SwaggerKindSchema"
469− gfoldl k z (SwaggerItemsObject ref) = z SwaggerItemsObject `k` ref
470− gfoldl k z (SwaggerItemsArray ref) = z SwaggerItemsArray `k` ref
472− gunfold k z c = case constrIndex c of
473− 2 -> k (z SwaggerItemsObject)
474− 3 -> k (z SwaggerItemsArray)
475− _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type (SwaggerItems SwaggerKindSchema)."
477− toConstr (SwaggerItemsPrimitive _ _) = error "Not supported"
478− toConstr (SwaggerItemsObject _) = swaggerItemsObjectConstr
479− toConstr (SwaggerItemsArray _) = swaggerItemsArrayConstr
481− dataTypeOf _ = swaggerItemsDataType
483−-- | Type used as a kind to avoid overlapping instances.
485− = SwaggerKindNormal t
486− | SwaggerKindParamOtherSchema
490−deriving instance Typeable 'SwaggerKindNormal
491−deriving instance Typeable 'SwaggerKindParamOtherSchema
492−deriving instance Typeable 'SwaggerKindSchema
494−type family SwaggerKindType (k :: SwaggerKind *) :: *
495−type instance SwaggerKindType ('SwaggerKindNormal t) = t
496−type instance SwaggerKindType 'SwaggerKindSchema = Schema
497−type instance SwaggerKindType 'SwaggerKindParamOtherSchema = ParamOtherSchema
499−data SwaggerType t where
500− SwaggerString :: SwaggerType t
501− SwaggerNumber :: SwaggerType t
502− SwaggerInteger :: SwaggerType t
503− SwaggerBoolean :: SwaggerType t
504− SwaggerArray :: SwaggerType t
505− SwaggerFile :: SwaggerType 'SwaggerKindParamOtherSchema
506− SwaggerNull :: SwaggerType 'SwaggerKindSchema
507− SwaggerObject :: SwaggerType 'SwaggerKindSchema
510−deriving instance Eq (SwaggerType t)
511−deriving instance Show (SwaggerType t)
513−swaggerTypeConstr :: Data (SwaggerType t) => SwaggerType t -> Constr
514−swaggerTypeConstr t = mkConstr (dataTypeOf t) (show t) [] Prefix
516−swaggerTypeDataType :: {- Data (SwaggerType t) => -} SwaggerType t -> DataType
517−swaggerTypeDataType _ = mkDataType "Data.Swagger.SwaggerType" swaggerTypeConstrs
519−swaggerCommonTypes :: [SwaggerType k]
520−swaggerCommonTypes = [SwaggerString, SwaggerNumber, SwaggerInteger, SwaggerBoolean, SwaggerArray]
522−swaggerParamTypes :: [SwaggerType 'SwaggerKindParamOtherSchema]
523−swaggerParamTypes = swaggerCommonTypes ++ [SwaggerFile]
525−swaggerSchemaTypes :: [SwaggerType 'SwaggerKindSchema]
526−swaggerSchemaTypes = swaggerCommonTypes ++ [error "SwaggerFile is invalid SwaggerType Schema", SwaggerNull, SwaggerObject]
528−swaggerTypeConstrs :: [Constr]
529−swaggerTypeConstrs = map swaggerTypeConstr (swaggerCommonTypes :: [SwaggerType 'SwaggerKindSchema])
530− ++ [swaggerTypeConstr SwaggerFile, swaggerTypeConstr SwaggerNull, swaggerTypeConstr SwaggerObject]
532−instance Typeable t => Data (SwaggerType ('SwaggerKindNormal t)) where
533− gunfold = gunfoldEnum "SwaggerType" swaggerCommonTypes
534− toConstr = swaggerTypeConstr
535− dataTypeOf = swaggerTypeDataType
537−instance Data (SwaggerType 'SwaggerKindParamOtherSchema) where
538− gunfold = gunfoldEnum "SwaggerType ParamOtherSchema" swaggerParamTypes
539− toConstr = swaggerTypeConstr
540− dataTypeOf = swaggerTypeDataType
542−instance Data (SwaggerType 'SwaggerKindSchema) where
543− gunfold = gunfoldEnum "SwaggerType Schema" swaggerSchemaTypes
544− toConstr = swaggerTypeConstr
545− dataTypeOf = swaggerTypeDataType
547data ParamLocation
599data ParamLocation
548 = -- | Parameters that are appended to the URL.
600 = -- | Parameters that are appended to the URL.
@@ -560,42 +612,6 @@ data ParamLocation
561type Format = Text
613type Format = Text
563−-- | Determines the format of the array.
564−data CollectionFormat t where
565− -- Comma separated values: @foo,bar@.
566− CollectionCSV :: CollectionFormat t
567− -- Space separated values: @foo bar@.
568− CollectionSSV :: CollectionFormat t
569− -- Tab separated values: @foo\\tbar@.
570− CollectionTSV :: CollectionFormat t
571− -- Pipe separated values: @foo|bar@.
572− CollectionPipes :: CollectionFormat t
573− -- Corresponds to multiple parameter instances
574− -- instead of multiple values for a single instance @foo=bar&foo=baz@.
575− -- This is valid only for parameters in @'ParamQuery'@ or @'ParamFormData'@.
576− CollectionMulti :: CollectionFormat 'SwaggerKindParamOtherSchema
579−deriving instance Eq (CollectionFormat t)
580−deriving instance Show (CollectionFormat t)
582−collectionFormatConstr :: CollectionFormat t -> Constr
583−collectionFormatConstr cf = mkConstr collectionFormatDataType (show cf) [] Prefix
585−collectionFormatDataType :: DataType
586−collectionFormatDataType = mkDataType "Data.Swagger.CollectionFormat" $
587− map collectionFormatConstr collectionCommonFormats
589−collectionCommonFormats :: [CollectionFormat t]
590−collectionCommonFormats = [ CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes ]
592−instance Data t => Data (CollectionFormat ('SwaggerKindNormal t)) where
593− gunfold = gunfoldEnum "CollectionFormat" collectionCommonFormats
594− toConstr = collectionFormatConstr
595− dataTypeOf _ = collectionFormatDataType
597−deriving instance Data (CollectionFormat 'SwaggerKindParamOtherSchema)
599type ParamName = Text
615type ParamName = Text
601data Schema = Schema
617data Schema = Schema
@@ -603,20 +619,58 @@ data Schema = Schema
603 , _schemaDescription :: Maybe Text
619 , _schemaDescription :: Maybe Text
604 , _schemaRequired :: [ParamName]
620 , _schemaRequired :: [ParamName]
622+ , _schemaNullable :: Maybe Bool
606 , _schemaAllOf :: Maybe [Referenced Schema]
623 , _schemaAllOf :: Maybe [Referenced Schema]
624+ , _schemaOneOf :: Maybe [Referenced Schema]
625+ , _schemaNot :: Maybe (Referenced Schema)
626+ , _schemaAnyOf :: Maybe [Referenced Schema]
607 , _schemaProperties :: InsOrdHashMap Text (Referenced Schema)
627 , _schemaProperties :: InsOrdHashMap Text (Referenced Schema)
608 , _schemaAdditionalProperties :: Maybe AdditionalProperties
628 , _schemaAdditionalProperties :: Maybe AdditionalProperties
610− , _schemaDiscriminator :: Maybe Text
630+ , _schemaDiscriminator :: Maybe Discriminator
611 , _schemaReadOnly :: Maybe Bool
631 , _schemaReadOnly :: Maybe Bool
632+ , _schemaWriteOnly :: Maybe Bool
612 , _schemaXml :: Maybe Xml
633 , _schemaXml :: Maybe Xml
613 , _schemaExternalDocs :: Maybe ExternalDocs
634 , _schemaExternalDocs :: Maybe ExternalDocs
614 , _schemaExample :: Maybe Value
635 , _schemaExample :: Maybe Value
636+ , _schemaDeprecated :: Maybe Bool
616 , _schemaMaxProperties :: Maybe Integer
638 , _schemaMaxProperties :: Maybe Integer
617 , _schemaMinProperties :: Maybe Integer
639 , _schemaMinProperties :: Maybe Integer
619− , _schemaParamSchema :: ParamSchema 'SwaggerKindSchema
641+ , -- | Declares the value of the parameter that the server will use if none is provided,
642+ -- for example a @"count"@ to control the number of results per page might default to @100@
643+ -- if not supplied by the client in the request.
644+ -- (Note: "default" has no meaning for required parameters.)
645+ -- Unlike JSON Schema this value MUST conform to the defined type for this parameter.
646+ _schemaDefault :: Maybe Value
648+ , _schemaType :: Maybe OpenApiType
649+ , _schemaFormat :: Maybe Format
650+ , _schemaItems :: Maybe OpenApiItems
651+ , _schemaMaximum :: Maybe Scientific
652+ , _schemaExclusiveMaximum :: Maybe Bool
653+ , _schemaMinimum :: Maybe Scientific
654+ , _schemaExclusiveMinimum :: Maybe Bool
655+ , _schemaMaxLength :: Maybe Integer
656+ , _schemaMinLength :: Maybe Integer
657+ , _schemaPattern :: Maybe Pattern
658+ , _schemaMaxItems :: Maybe Integer
659+ , _schemaMinItems :: Maybe Integer
660+ , _schemaUniqueItems :: Maybe Bool
661+ , _schemaEnum :: Maybe [Value]
662+ , _schemaMultipleOf :: Maybe Scientific
663+ } deriving (Eq, Show, Generic, Data, Typeable)
665+-- | Regex pattern for @string@ type.
668+data Discriminator = Discriminator
669+ { -- | The name of the property in the payload that will hold the discriminator value.
670+ _discriminatorPropertyName :: Text
672+ -- | An object to hold mappings between payload values and schema names or references.
673+ , _discriminatorMapping :: InsOrdHashMap Text Text
620 } deriving (Eq, Show, Generic, Data, Typeable)
674 } deriving (Eq, Show, Generic, Data, Typeable)
622-- | A @'Schema'@ with an optional name.
676-- | A @'Schema'@ with an optional name.
@@ -626,39 +680,9 @@ data NamedSchema = NamedSchema
626 , _namedSchemaSchema :: Schema
680 , _namedSchemaSchema :: Schema
627 } deriving (Eq, Show, Generic, Data, Typeable)
681 } deriving (Eq, Show, Generic, Data, Typeable)
629−-- | Regex pattern for @string@ type.
632−data ParamSchema (t :: SwaggerKind *) = ParamSchema
633− { -- | Declares the value of the parameter that the server will use if none is provided,
634− -- for example a @"count"@ to control the number of results per page might default to @100@
635− -- if not supplied by the client in the request.
636− -- (Note: "default" has no meaning for required parameters.)
637− -- Unlike JSON Schema this value MUST conform to the defined type for this parameter.
638− _paramSchemaDefault :: Maybe Value
640− , _paramSchemaType :: Maybe (SwaggerType t)
641− , _paramSchemaFormat :: Maybe Format
642− , _paramSchemaItems :: Maybe (SwaggerItems t)
643− , _paramSchemaMaximum :: Maybe Scientific
644− , _paramSchemaExclusiveMaximum :: Maybe Bool
645− , _paramSchemaMinimum :: Maybe Scientific
646− , _paramSchemaExclusiveMinimum :: Maybe Bool
647− , _paramSchemaMaxLength :: Maybe Integer
648− , _paramSchemaMinLength :: Maybe Integer
649− , _paramSchemaPattern :: Maybe Pattern
650− , _paramSchemaMaxItems :: Maybe Integer
651− , _paramSchemaMinItems :: Maybe Integer
652− , _paramSchemaUniqueItems :: Maybe Bool
653− , _paramSchemaEnum :: Maybe [Value]
654− , _paramSchemaMultipleOf :: Maybe Scientific
655− } deriving (Eq, Show, Generic, Typeable)
657−deriving instance (Typeable k, Data (Maybe (SwaggerType k)), Data (SwaggerItems k)) => Data (ParamSchema k)
659data Xml = Xml
683data Xml = Xml
660 { -- | Replaces the name of the element/attribute used for the described schema property.
684 { -- | Replaces the name of the element/attribute used for the described schema property.
661− -- When defined within the @'SwaggerItems'@ (items), it will affect the name of the individual XML elements within the list.
685+ -- When defined within the @'OpenApiItems'@ (items), it will affect the name of the individual XML elements within the list.
662 -- When defined alongside type being array (outside the items),
686 -- When defined alongside type being array (outside the items),
663 -- it will affect the wrapping element and only if wrapped is true.
687 -- it will affect the wrapping element and only if wrapped is true.
664 -- If wrapped is false, it will be ignored.
688 -- If wrapped is false, it will be ignored.
@@ -710,42 +734,47 @@ data Response = Response
710 -- | A map containing descriptions of potential response payloads.
734 -- | A map containing descriptions of potential response payloads.
711 -- The key is a media type or media type range and the value describes it.
735 -- The key is a media type or media type range and the value describes it.
712 -- For responses that match multiple keys, only the most specific key is applicable.
736 -- For responses that match multiple keys, only the most specific key is applicable.
713− -- e.g. @text/plain@ overrides @text/*@.
737+ -- e.g. @text/plain@ overrides @text/\*@.
714− , _responseContent :: InsOrdHashMap Text MediaTypeObject
738+ , _responseContent :: InsOrdHashMap MediaType MediaTypeObject
716 -- | Maps a header name to its definition.
740 -- | Maps a header name to its definition.
717− , _responseHeaders :: InsOrdHashMap HeaderName Header -- FIXME Referenced
741+ , _responseHeaders :: InsOrdHashMap HeaderName (Referenced Header)
719− -- TODO links
743+ -- | A map of operations links that can be followed from the response.
744+ -- The key of the map is a short name for the link, following the naming
745+ -- constraints of the names for 'Component' Objects.
746+ , _responseLinks :: InsOrdHashMap Text (Referenced Link)
720 } deriving (Eq, Show, Generic, Data, Typeable)
747 } deriving (Eq, Show, Generic, Data, Typeable)
722instance IsString Response where
749instance IsString Response where
723− fromString s = Response (fromString s) mempty mempty
750+ fromString s = Response (fromString s) mempty mempty mempty
752+-- | A map of possible out-of band callbacks related to the parent operation.
753+-- Each value in the map is a 'PathItem' Object that describes a set of requests that
754+-- may be initiated by the API provider and the expected responses.
755+-- The key value used to identify the path item object is an expression, evaluated at runtime,
756+-- that identifies a URL to use for the callback operation.
757+newtype Callback = Callback (InsOrdHashMap Text PathItem)
758+ deriving (Eq, Show, Generic, Data, Typeable)
725type HeaderName = Text
760type HeaderName = Text
762+-- | Header fields have the same meaning as for 'Param'.
764+-- Style is always treated as 'StyleSimple', as it is the only value allowed for headers.
727data Header = Header
765data Header = Header
728 { -- | A short description of the header.
766 { -- | A short description of the header.
729− _headerDescription :: Maybe Text
767+ _headerDescription :: Maybe HeaderName
731− , _headerParamSchema :: ParamSchema ('SwaggerKindNormal Header)
732− } deriving (Eq, Show, Generic, Data, Typeable)
734−data Example = Example { getExample :: Map MediaType Value }
769+ , _headerRequired :: Maybe Bool
735− deriving (Eq, Show, Generic, Typeable)
770+ , _headerDeprecated :: Maybe Bool
771+ , _headerAllowEmptyValue :: Maybe Bool
772+ , _headerExplode :: Maybe Bool
773+ , _headerExample :: Maybe Value
774+ , _headerExamples :: InsOrdHashMap Text (Referenced Example)
737−exampleConstr :: Constr
776+ , _headerSchema :: Maybe (Referenced Schema)
738−exampleConstr = mkConstr exampleDataType "Example" ["getExample"] Prefix
777+ } deriving (Eq, Show, Generic, Data, Typeable)
740−exampleDataType :: DataType
741−exampleDataType = mkDataType "Data.Swagger.Example" [exampleConstr]
743−instance Data Example where
744− gunfold k z c = case constrIndex c of
745− 1 -> k (z (\m -> Example (Map.mapKeys fromString m)))
746− _ -> error $ "Data.Data.gunfold: Constructor " ++ show c ++ " is not of type Example."
747− toConstr (Example _) = exampleConstr
748− dataTypeOf _ = exampleDataType
750-- | The location of the API key.
779-- | The location of the API key.
751data ApiKeyLocation
780data ApiKeyLocation
@@ -768,26 +797,96 @@ type AuthorizationURL = Text
768-- | The token URL to be used for OAuth2 flow. This SHOULD be in the form of a URL.
797-- | The token URL to be used for OAuth2 flow. This SHOULD be in the form of a URL.
769type TokenURL = Text
798type TokenURL = Text
771−data OAuth2Flow
800+newtype OAuth2ImplicitFlow
772− = OAuth2Implicit AuthorizationURL
801+ = OAuth2ImplicitFlow {_oAuth2ImplicitFlowAuthorizationUrl :: AuthorizationURL}
773− | OAuth2Password TokenURL
802+ deriving (Eq, Show, Generic, Data, Typeable)
774− | OAuth2Application TokenURL
803+
775− | OAuth2AccessCode AuthorizationURL TokenURL
804+newtype OAuth2PasswordFlow
805+ = OAuth2PasswordFlow {_oAuth2PasswordFlowTokenUrl :: TokenURL}
776 deriving (Eq, Show, Generic, Data, Typeable)
806 deriving (Eq, Show, Generic, Data, Typeable)
778−data OAuth2Params = OAuth2Params
808+newtype OAuth2ClientCredentialsFlow
779− { -- | The flow used by the OAuth2 security scheme.
809+ = OAuth2ClientCredentialsFlow {_oAuth2ClientCredentialsFlowTokenUrl :: TokenURL}
780− _oauth2Flow :: OAuth2Flow
810+ deriving (Eq, Show, Generic, Data, Typeable)
812+data OAuth2AuthorizationCodeFlow = OAuth2AuthorizationCodeFlow
813+ { _oAuth2AuthorizationCodeFlowAuthorizationUrl :: AuthorizationURL
814+ , _oAuth2AuthorizationCodeFlowTokenUrl :: TokenURL
815+ } deriving (Eq, Show, Generic, Data, Typeable)
817+data OAuth2Flow p = OAuth2Flow
818+ { _oAuth2Params :: p
820+ -- | The URL to be used for obtaining refresh tokens.
821+ , _oAath2RefreshUrl :: Maybe URL
782 -- | The available scopes for the OAuth2 security scheme.
823 -- | The available scopes for the OAuth2 security scheme.
824+ -- A map between the scope name and a short description for it.
825+ -- The map MAY be empty.
783− , _oauth2Scopes :: InsOrdHashMap Text Text
826+ , _oAuth2Scopes :: InsOrdHashMap Text Text
827+ } deriving (Eq, Show, Generic, Data, Typeable)
829+data OAuth2Flows = OAuth2Flows
830+ { -- | Configuration for the OAuth Implicit flow
831+ _oAuth2FlowsImplicit :: Maybe (OAuth2Flow OAuth2ImplicitFlow)
833+ -- | Configuration for the OAuth Resource Owner Password flow
834+ , _oAuth2FlowsPassword :: Maybe (OAuth2Flow OAuth2PasswordFlow)
836+ -- | Configuration for the OAuth Client Credentials flow
837+ , _oAuth2FlowsClientCredentials :: Maybe (OAuth2Flow OAuth2ClientCredentialsFlow)
839+ -- | Configuration for the OAuth Authorization Code flow
840+ , _oAuth2FlowsAuthorizationCode :: Maybe (OAuth2Flow OAuth2AuthorizationCodeFlow)
784 } deriving (Eq, Show, Generic, Data, Typeable)
841 } deriving (Eq, Show, Generic, Data, Typeable)
843+type BearerFormat = Text
846+ = HttpSchemeBearer (Maybe BearerFormat)
848+ | HttpSchemeCustom Text
849+ deriving (Eq, Show, Generic, Data, Typeable)
853+-- >>> BSL.putStrLn $ encodePretty (SecuritySchemeHttp (HttpSchemeBearer Nothing))
855+-- "scheme": "bearer",
859+-- >>> BSL.putStrLn $ encodePretty (SecuritySchemeHttp (HttpSchemeBearer (Just "jwt")))
861+-- "bearerFormat": "jwt",
862+-- "scheme": "bearer",
866+-- >>> BSL.putStrLn $ encodePretty (SecuritySchemeHttp HttpSchemeBasic)
868+-- "scheme": "basic",
872+-- >>> BSL.putStrLn $ encodePretty (SecuritySchemeHttp (HttpSchemeCustom "CANARY"))
874+-- "scheme": "CANARY",
878+-- >>> BSL.putStrLn $ encodePretty (SecuritySchemeApiKey (ApiKeyParams "id" ApiKeyCookie))
786data SecuritySchemeType
885data SecuritySchemeType
787− = SecuritySchemeHttp
886+ = SecuritySchemeHttp HttpSchemeType
788 | SecuritySchemeApiKey ApiKeyParams
887 | SecuritySchemeApiKey ApiKeyParams
789− | SecuritySchemeOAuth2 OAuth2Params
888+ | SecuritySchemeOAuth2 OAuth2Flows
790−-- | SecuritySchemeOpenIdConnect -- FIXME
889+ | SecuritySchemeOpenIdConnect URL
791 deriving (Eq, Show, Generic, Data, Typeable)
890 deriving (Eq, Show, Generic, Data, Typeable)
793data SecurityScheme = SecurityScheme
892data SecurityScheme = SecurityScheme
@@ -798,18 +897,6 @@ data SecurityScheme = SecurityScheme
798 , _securitySchemeDescription :: Maybe Text
897 , _securitySchemeDescription :: Maybe Text
799 } deriving (Eq, Show, Generic, Data, Typeable)
898 } deriving (Eq, Show, Generic, Data, Typeable)
802−-- | merge scopes of two OAuth2 security schemes when their flows are identical.
803−-- In other case returns first security scheme
804−mergeSecurityScheme :: SecurityScheme -> SecurityScheme -> SecurityScheme
805−mergeSecurityScheme s1@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 scopes1)) desc)
806− s2@(SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow2 scopes2)) _)
807− = if flow1 == flow2 then
808− SecurityScheme (SecuritySchemeOAuth2 (OAuth2Params flow1 (scopes1 <> scopes2))) desc
811−mergeSecurityScheme s1 _ = s1
813newtype SecurityDefinitions
900newtype SecurityDefinitions
814 = SecurityDefinitions (Definitions SecurityScheme)
901 = SecurityDefinitions (Definitions SecurityScheme)
815 deriving (Eq, Show, Generic, Data, Typeable)
902 deriving (Eq, Show, Generic, Data, Typeable)
@@ -831,7 +918,7 @@ data Tag = Tag
831 _tagName :: TagName
918 _tagName :: TagName
833 -- | A short description for the tag.
920 -- | A short description for the tag.
834− -- GFM syntax can be used for rich text representation.
921+ -- [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation.
835 , _tagDescription :: Maybe Text
922 , _tagDescription :: Maybe Text
837 -- | Additional external documentation for this tag.
924 -- | Additional external documentation for this tag.
@@ -846,7 +933,7 @@ instance IsString Tag where
846-- | Allows referencing an external resource for extended documentation.
933-- | Allows referencing an external resource for extended documentation.
847data ExternalDocs = ExternalDocs
934data ExternalDocs = ExternalDocs
848 { -- | A short description of the target documentation.
935 { -- | A short description of the target documentation.
849− -- GFM syntax can be used for rich text representation.
936+ -- [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation.
850 _externalDocsDescription :: Maybe Text
937 _externalDocsDescription :: Maybe Text
852 -- | The URL for the target documentation.
939 -- | The URL for the target documentation.
@@ -879,12 +966,13 @@ data AdditionalProperties
879-- Generic instances
966-- Generic instances
880-------------------------------------------------------------------------------
967-------------------------------------------------------------------------------
969+deriveGeneric ''Server
882deriveGeneric ''Components
970deriveGeneric ''Components
883deriveGeneric ''Header
971deriveGeneric ''Header
884−deriveGeneric ''OAuth2Params
972+deriveGeneric ''OAuth2Flow
973+deriveGeneric ''OAuth2Flows
885deriveGeneric ''Operation
974deriveGeneric ''Operation
886deriveGeneric ''Param
975deriveGeneric ''Param
887−deriveGeneric ''ParamOtherSchema
888deriveGeneric ''PathItem
976deriveGeneric ''PathItem
889deriveGeneric ''Response
977deriveGeneric ''Response
890deriveGeneric ''RequestBody
978deriveGeneric ''RequestBody
@@ -892,16 +980,18 @@ deriveGeneric ''MediaTypeObject
892deriveGeneric ''Responses
980deriveGeneric ''Responses
893deriveGeneric ''SecurityScheme
981deriveGeneric ''SecurityScheme
894deriveGeneric ''Schema
982deriveGeneric ''Schema
895−deriveGeneric ''ParamSchema
983+deriveGeneric ''OpenApi
984+deriveGeneric ''Example
985+deriveGeneric ''Encoding
896−deriveGeneric ''Swagger
986+deriveGeneric ''Link
898-- =======================================================================
988-- =======================================================================
899-- Monoid instances
989-- Monoid instances
900-- =======================================================================
990-- =======================================================================
902−instance Semigroup Swagger where
992+instance Semigroup OpenApi where
903 (<>) = genericMappend
993 (<>) = genericMappend
904−instance Monoid Swagger where
994+instance Monoid OpenApi where
905 mempty = genericMempty
995 mempty = genericMempty
906 mappend = (<>)
996 mappend = (<>)
@@ -935,24 +1025,12 @@ instance Monoid Schema where
935 mempty = genericMempty
1025 mempty = genericMempty
936 mappend = (<>)
1026 mappend = (<>)
938−instance Semigroup (ParamSchema t) where
939− (<>) = genericMappend
940−instance Monoid (ParamSchema t) where
941− mempty = genericMempty
944instance Semigroup Param where
1028instance Semigroup Param where
945 (<>) = genericMappend
1029 (<>) = genericMappend
946instance Monoid Param where
1030instance Monoid Param where
947 mempty = genericMempty
1031 mempty = genericMempty
948 mappend = (<>)
1032 mappend = (<>)
950−instance Semigroup ParamOtherSchema where
951− (<>) = genericMappend
952−instance Monoid ParamOtherSchema where
953− mempty = genericMempty
956instance Semigroup Header where
1034instance Semigroup Header where
957 (<>) = genericMappend
1035 (<>) = genericMappend
958instance Monoid Header where
1036instance Monoid Header where
@@ -971,6 +1049,18 @@ instance Monoid Response where
971 mempty = genericMempty
1049 mempty = genericMempty
972 mappend = (<>)
1050 mappend = (<>)
1052+instance Semigroup MediaTypeObject where
1053+ (<>) = genericMappend
1054+instance Monoid MediaTypeObject where
1055+ mempty = genericMempty
1058+instance Semigroup Encoding where
1059+ (<>) = genericMappend
1060+instance Monoid Encoding where
1061+ mempty = genericMempty
974instance Semigroup ExternalDocs where
1064instance Semigroup ExternalDocs where
975 (<>) = genericMappend
1065 (<>) = genericMappend
976instance Monoid ExternalDocs where
1066instance Monoid ExternalDocs where
@@ -983,14 +1073,29 @@ instance Monoid Operation where
983 mempty = genericMempty
1073 mempty = genericMempty
984 mappend = (<>)
1074 mappend = (<>)
986−instance Semigroup Example where
1076+instance Semigroup (OAuth2Flow p) where
987− (<>) = genericMappend
1077+ l@OAuth2Flow{ _oAath2RefreshUrl = lUrl, _oAuth2Scopes = lScopes }
1078+ <> OAuth2Flow { _oAath2RefreshUrl = rUrl, _oAuth2Scopes = rScopes } =
1079+ l { _oAath2RefreshUrl = swaggerMappend lUrl rUrl, _oAuth2Scopes = lScopes <> rScopes }
1081+-- swaggerMappend has First-like semantics, and here we need mappend'ing under Maybes.
1082+instance Semigroup OAuth2Flows where
1083+ l <> r = OAuth2Flows
1084+ { _oAuth2FlowsImplicit = _oAuth2FlowsImplicit l <> _oAuth2FlowsImplicit r
1085+ , _oAuth2FlowsPassword = _oAuth2FlowsPassword l <> _oAuth2FlowsPassword r
1086+ , _oAuth2FlowsClientCredentials = _oAuth2FlowsClientCredentials l <> _oAuth2FlowsClientCredentials r
1087+ , _oAuth2FlowsAuthorizationCode = _oAuth2FlowsAuthorizationCode l <> _oAuth2FlowsAuthorizationCode r
988−instance Monoid Example where
1090+instance Monoid OAuth2Flows where
989 mempty = genericMempty
1091 mempty = genericMempty
990 mappend = (<>)
1092 mappend = (<>)
992instance Semigroup SecurityScheme where
1094instance Semigroup SecurityScheme where
993− (<>) = mergeSecurityScheme
1095+ SecurityScheme (SecuritySchemeOAuth2 lFlows) lDesc
1096+ <> SecurityScheme (SecuritySchemeOAuth2 rFlows) rDesc =
1097+ SecurityScheme (SecuritySchemeOAuth2 $ lFlows <> rFlows) (swaggerMappend lDesc rDesc)
995instance Semigroup SecurityDefinitions where
1100instance Semigroup SecurityDefinitions where
996 (SecurityDefinitions sd1) <> (SecurityDefinitions sd2) =
1101 (SecurityDefinitions sd1) <> (SecurityDefinitions sd2) =
@@ -1000,6 +1105,12 @@ instance Monoid SecurityDefinitions where
1000 mempty = SecurityDefinitions InsOrdHashMap.empty
1105 mempty = SecurityDefinitions InsOrdHashMap.empty
1001 mappend = (<>)
1106 mappend = (<>)
1108+instance Semigroup RequestBody where
1109+ (<>) = genericMappend
1110+instance Monoid RequestBody where
1111+ mempty = genericMempty
1003-- =======================================================================
1114-- =======================================================================
1004-- SwaggerMonoid helper instances
1115-- SwaggerMonoid helper instances
1005-- =======================================================================
1116-- =======================================================================
@@ -1008,21 +1119,19 @@ instance SwaggerMonoid Info
1008instance SwaggerMonoid Components
1119instance SwaggerMonoid Components
1009instance SwaggerMonoid PathItem
1120instance SwaggerMonoid PathItem
1010instance SwaggerMonoid Schema
1121instance SwaggerMonoid Schema
1011−instance SwaggerMonoid (ParamSchema t)
1012instance SwaggerMonoid Param
1122instance SwaggerMonoid Param
1013−instance SwaggerMonoid ParamOtherSchema
1014instance SwaggerMonoid Responses
1123instance SwaggerMonoid Responses
1015instance SwaggerMonoid Response
1124instance SwaggerMonoid Response
1016instance SwaggerMonoid ExternalDocs
1125instance SwaggerMonoid ExternalDocs
1017instance SwaggerMonoid Operation
1126instance SwaggerMonoid Operation
1018−instance SwaggerMonoid SecurityDefinitions
1019instance (Eq a, Hashable a) => SwaggerMonoid (InsOrdHashSet a)
1127instance (Eq a, Hashable a) => SwaggerMonoid (InsOrdHashSet a)
1128+instance SwaggerMonoid SecurityDefinitions
1021instance SwaggerMonoid MimeList
1130instance SwaggerMonoid MimeList
1022deriving instance SwaggerMonoid URL
1131deriving instance SwaggerMonoid URL
1024−instance SwaggerMonoid (SwaggerType t) where
1133+instance SwaggerMonoid OpenApiType where
1025− swaggerMempty = SwaggerString
1134+ swaggerMempty = OpenApiString
1026 swaggerMappend _ y = y
1135 swaggerMappend _ y = y
1028instance SwaggerMonoid ParamLocation where
1137instance SwaggerMonoid ParamLocation where
@@ -1038,16 +1147,16 @@ instance Monoid a => SwaggerMonoid (Referenced a) where
1038 swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
1147 swaggerMappend (Inline x) (Inline y) = Inline (mappend x y)
1039 swaggerMappend _ y = y
1148 swaggerMappend _ y = y
1041−instance SwaggerMonoid ParamAnySchema where
1042− swaggerMempty = ParamOther swaggerMempty
1043− swaggerMappend (ParamBody x) (ParamBody y) = ParamBody (swaggerMappend x y)
1044− swaggerMappend (ParamOther x) (ParamOther y) = ParamOther (swaggerMappend x y)
1045− swaggerMappend _ y = y
1047-- =======================================================================
1150-- =======================================================================
1048-- Simple Generic-based ToJSON instances
1151-- Simple Generic-based ToJSON instances
1049-- =======================================================================
1152-- =======================================================================
1154+instance ToJSON Style where
1155+ toJSON = genericToJSON (jsonPrefix "Style")
1157+instance ToJSON OpenApiType where
1158+ toJSON = genericToJSON (jsonPrefix "Swagger")
1051instance ToJSON ParamLocation where
1160instance ToJSON ParamLocation where
1052 toJSON = genericToJSON (jsonPrefix "Param")
1161 toJSON = genericToJSON (jsonPrefix "Param")
@@ -1060,9 +1169,6 @@ instance ToJSON Contact where
1060instance ToJSON License where
1169instance ToJSON License where
1061 toJSON = genericToJSON (jsonPrefix "License")
1170 toJSON = genericToJSON (jsonPrefix "License")
1063−instance ToJSON Server where
1064− toJSON = genericToJSON (jsonPrefix "Server")
1066instance ToJSON ServerVariable where
1172instance ToJSON ServerVariable where
1067 toJSON = genericToJSON (jsonPrefix "ServerVariable")
1173 toJSON = genericToJSON (jsonPrefix "ServerVariable")
@@ -1072,9 +1178,6 @@ instance ToJSON ApiKeyLocation where
1072instance ToJSON ApiKeyParams where
1178instance ToJSON ApiKeyParams where
1073 toJSON = genericToJSON (jsonPrefix "apiKey")
1179 toJSON = genericToJSON (jsonPrefix "apiKey")
1075−instance ToJSON Scheme where
1076− toJSON = genericToJSON (jsonPrefix "")
1078instance ToJSON Tag where
1181instance ToJSON Tag where
1079 toJSON = genericToJSON (jsonPrefix "Tag")
1182 toJSON = genericToJSON (jsonPrefix "Tag")
@@ -1084,10 +1187,31 @@ instance ToJSON ExternalDocs where
1084instance ToJSON Xml where
1187instance ToJSON Xml where
1085 toJSON = genericToJSON (jsonPrefix "Xml")
1188 toJSON = genericToJSON (jsonPrefix "Xml")
1190+instance ToJSON Discriminator where
1191+ toJSON = genericToJSON (jsonPrefix "Discriminator")
1193+instance ToJSON OAuth2ImplicitFlow where
1194+ toJSON = genericToJSON (jsonPrefix "OAuth2ImplicitFlow")
1196+instance ToJSON OAuth2PasswordFlow where
1197+ toJSON = genericToJSON (jsonPrefix "OAuth2PasswordFlow")
1199+instance ToJSON OAuth2ClientCredentialsFlow where
1200+ toJSON = genericToJSON (jsonPrefix "OAuth2ClientCredentialsFlow")
1202+instance ToJSON OAuth2AuthorizationCodeFlow where
1203+ toJSON = genericToJSON (jsonPrefix "OAuth2AuthorizationCodeFlow")
1087-- =======================================================================
1205-- =======================================================================
1088-- Simple Generic-based FromJSON instances
1206-- Simple Generic-based FromJSON instances
1089-- =======================================================================
1207-- =======================================================================
1209+instance FromJSON Style where
1210+ parseJSON = genericParseJSON (jsonPrefix "Style")
1212+instance FromJSON OpenApiType where
1213+ parseJSON = genericParseJSON (jsonPrefix "Swagger")
1091instance FromJSON ParamLocation where
1215instance FromJSON ParamLocation where
1092 parseJSON = genericParseJSON (jsonPrefix "Param")
1216 parseJSON = genericParseJSON (jsonPrefix "Param")
@@ -1100,9 +1224,6 @@ instance FromJSON Contact where
1100instance FromJSON License where
1224instance FromJSON License where
1101 parseJSON = genericParseJSON (jsonPrefix "License")
1225 parseJSON = genericParseJSON (jsonPrefix "License")
1103−instance FromJSON Server where
1104− parseJSON = genericParseJSON (jsonPrefix "Server")
1106instance FromJSON ServerVariable where
1227instance FromJSON ServerVariable where
1107 parseJSON = genericParseJSON (jsonPrefix "ServerVariable")
1228 parseJSON = genericParseJSON (jsonPrefix "ServerVariable")
@@ -1112,63 +1233,91 @@ instance FromJSON ApiKeyLocation where
1112instance FromJSON ApiKeyParams where
1233instance FromJSON ApiKeyParams where
1113 parseJSON = genericParseJSON (jsonPrefix "apiKey")
1234 parseJSON = genericParseJSON (jsonPrefix "apiKey")
1115−instance FromJSON Scheme where
1116− parseJSON = genericParseJSON (jsonPrefix "")
1118instance FromJSON Tag where
1236instance FromJSON Tag where
1119 parseJSON = genericParseJSON (jsonPrefix "Tag")
1237 parseJSON = genericParseJSON (jsonPrefix "Tag")
1121instance FromJSON ExternalDocs where
1239instance FromJSON ExternalDocs where
1122 parseJSON = genericParseJSON (jsonPrefix "ExternalDocs")
1240 parseJSON = genericParseJSON (jsonPrefix "ExternalDocs")
1242+instance FromJSON Discriminator where
1243+ parseJSON = genericParseJSON (jsonPrefix "Discriminator")
1245+instance FromJSON OAuth2ImplicitFlow where
1246+ parseJSON = genericParseJSON (jsonPrefix "OAuth2ImplicitFlow")
1248+instance FromJSON OAuth2PasswordFlow where
1249+ parseJSON = genericParseJSON (jsonPrefix "OAuth2PasswordFlow")
1251+instance FromJSON OAuth2ClientCredentialsFlow where
1252+ parseJSON = genericParseJSON (jsonPrefix "OAuth2ClientCredentialsFlow")
1254+instance FromJSON OAuth2AuthorizationCodeFlow where
1255+ parseJSON = genericParseJSON (jsonPrefix "OAuth2AuthorizationCodeFlow")
1124-- =======================================================================
1257-- =======================================================================
1125-- Manual ToJSON instances
1258-- Manual ToJSON instances
1126-- =======================================================================
1259-- =======================================================================
1128−instance ToJSON OAuth2Flow where
1261+instance ToJSON MediaType where
1129− toJSON (OAuth2Implicit authUrl) = object
1262+ toJSON = toJSON . show
1130− [ "flow" .= ("implicit" :: Text)
1263+ toEncoding = toEncoding . show
1131− , "authorizationUrl" .= authUrl ]
1264+
1132− toJSON (OAuth2Password tokenUrl) = object
1265+instance ToJSONKey MediaType where
1133− [ "flow" .= ("password" :: Text)
1266+ toJSONKey = JSON.toJSONKeyText (Text.pack . show)
1134− , "tokenUrl" .= tokenUrl ]
1267+
1135− toJSON (OAuth2Application tokenUrl) = object
1268+instance (Eq p, ToJSON p, AesonDefaultValue p) => ToJSON (OAuth2Flow p) where
1136− [ "flow" .= ("application" :: Text)
1269+ toJSON = sopSwaggerGenericToJSON
1137− , "tokenUrl" .= tokenUrl ]
1270+ toEncoding = sopSwaggerGenericToEncoding
1138− toJSON (OAuth2AccessCode authUrl tokenUrl) = object
1271+
1139− [ "flow" .= ("accessCode" :: Text)
1140− , "authorizationUrl" .= authUrl
1141− , "tokenUrl" .= tokenUrl ]
1143−instance ToJSON OAuth2Params where
1272+instance ToJSON OAuth2Flows where
1144 toJSON = sopSwaggerGenericToJSON
1273 toJSON = sopSwaggerGenericToJSON
1145 toEncoding = sopSwaggerGenericToEncoding
1274 toEncoding = sopSwaggerGenericToEncoding
1147instance ToJSON SecuritySchemeType where
1276instance ToJSON SecuritySchemeType where
1148− toJSON SecuritySchemeHttp
1277+ toJSON (SecuritySchemeHttp ty) = case ty of
1278+ HttpSchemeBearer mFmt ->
1279+ object $ [ "type" .= ("http" :: Text)
1280+ , "scheme" .= ("bearer" :: Text)
1281+ ] <> maybe [] (\t -> ["bearerFormat" .= t]) mFmt
1283+ object [ "type" .= ("http" :: Text)
1284+ , "scheme" .= ("basic" :: Text)
1286+ HttpSchemeCustom t ->
1149− = object [ "type" .= ("http" :: Text) ]
1287+ object [ "type" .= ("http" :: Text)
1150 toJSON (SecuritySchemeApiKey params)
1290 toJSON (SecuritySchemeApiKey params)
1151 = toJSON params
1291 = toJSON params
1152 <+> object [ "type" .= ("apiKey" :: Text) ]
1292 <+> object [ "type" .= ("apiKey" :: Text) ]
1153− toJSON (SecuritySchemeOAuth2 params)
1293+ toJSON (SecuritySchemeOAuth2 params) = object
1155− <+> object [ "type" .= ("oauth2" :: Text) ]
1294+ [ "type" .= ("oauth2" :: Text)
1295+ , "flows" .= toJSON params
1297+ toJSON (SecuritySchemeOpenIdConnect url) = object
1298+ [ "type" .= ("openIdConnect" :: Text)
1299+ , "openIdConnectUrl" .= url
1157−instance ToJSON Swagger where
1302+instance ToJSON OpenApi where
1158 toJSON a = sopSwaggerGenericToJSON a &
1303 toJSON a = sopSwaggerGenericToJSON a &
1159− if InsOrdHashMap.null (_swaggerPaths a)
1304+ if InsOrdHashMap.null (_openApiPaths a)
1160 then (<+> object ["paths" .= object []])
1305 then (<+> object ["paths" .= object []])
1162 toEncoding = sopSwaggerGenericToEncoding
1307 toEncoding = sopSwaggerGenericToEncoding
1164−instance ToJSON SecurityScheme where
1309+instance ToJSON Server where
1165 toJSON = sopSwaggerGenericToJSON
1310 toJSON = sopSwaggerGenericToJSON
1166 toEncoding = sopSwaggerGenericToEncoding
1311 toEncoding = sopSwaggerGenericToEncoding
1168−instance ToJSON Schema where
1313+instance ToJSON SecurityScheme where
1169 toJSON = sopSwaggerGenericToJSON
1314 toJSON = sopSwaggerGenericToJSON
1170 toEncoding = sopSwaggerGenericToEncoding
1315 toEncoding = sopSwaggerGenericToEncoding
1317+instance ToJSON Schema where
1318+ toJSON = sopSwaggerGenericToJSONWithOpts $
1319+ mkSwaggerAesonOptions "schema" & saoSubObject ?~ "items"
1172instance ToJSON Header where
1321instance ToJSON Header where
1173 toJSON = sopSwaggerGenericToJSON
1322 toJSON = sopSwaggerGenericToJSON
1174 toEncoding = sopSwaggerGenericToEncoding
1323 toEncoding = sopSwaggerGenericToEncoding
@@ -1176,31 +1325,26 @@ instance ToJSON Header where
1176-- | As for nullary schema for 0-arity type constructors, see
1325-- | As for nullary schema for 0-arity type constructors, see
1177-- <https://github.com/GetShopTV/swagger2/issues/167>.
1326-- <https://github.com/GetShopTV/swagger2/issues/167>.
1179−-- >>> encode (SwaggerItemsArray [])
1328+-- >>> BSL.putStrLn $ encodePretty (OpenApiItemsArray [])
1180−-- "{\"example\":[],\"items\":{},\"maxItems\":0}"
1332+-- "maxItems": 0
1182−instance ToJSON (ParamSchema t) => ToJSON (SwaggerItems t) where
1335+instance ToJSON OpenApiItems where
1183− toJSON (SwaggerItemsPrimitive fmt schema) = object
1336+ toJSON (OpenApiItemsObject x) = object [ "items" .= x ]
1184− [ "collectionFormat" .= fmt
1185− , "items" .= schema ]
1186− toJSON (SwaggerItemsObject x) = object [ "items" .= x ]
1187− toJSON (SwaggerItemsArray []) = object
1337+ toJSON (OpenApiItemsArray []) = object
1188 [ "items" .= object []
1338 [ "items" .= object []
1189 , "maxItems" .= (0 :: Int)
1339 , "maxItems" .= (0 :: Int)
1190 , "example" .= Array mempty
1340 , "example" .= Array mempty
1192− toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
1342+ toJSON (OpenApiItemsArray x) = object [ "items" .= x ]
1194instance ToJSON Components where
1344instance ToJSON Components where
1195 toJSON = sopSwaggerGenericToJSON
1345 toJSON = sopSwaggerGenericToJSON
1196 toEncoding = sopSwaggerGenericToEncoding
1346 toEncoding = sopSwaggerGenericToEncoding
1198−instance ToJSON Host where
1199− toJSON (Host host mport) = toJSON $
1202− Just port -> host ++ ":" ++ show port
1204instance ToJSON MimeList where
1348instance ToJSON MimeList where
1205 toJSON (MimeList xs) = toJSON (map show xs)
1349 toJSON (MimeList xs) = toJSON (map show xs)
@@ -1208,14 +1352,6 @@ instance ToJSON Param where
1208 toJSON = sopSwaggerGenericToJSON
1352 toJSON = sopSwaggerGenericToJSON
1209 toEncoding = sopSwaggerGenericToEncoding
1353 toEncoding = sopSwaggerGenericToEncoding
1211−instance ToJSON ParamAnySchema where
1212− toJSON (ParamBody s) = object [ "in" .= ("body" :: Text), "schema" .= s ]
1213− toJSON (ParamOther s) = toJSON s
1215−instance ToJSON ParamOtherSchema where
1216− toJSON = sopSwaggerGenericToJSON
1217− toEncoding = sopSwaggerGenericToEncoding
1219instance ToJSON Responses where
1355instance ToJSON Responses where
1220 toJSON = sopSwaggerGenericToJSON
1356 toJSON = sopSwaggerGenericToJSON
1221 toEncoding = sopSwaggerGenericToEncoding
1357 toEncoding = sopSwaggerGenericToEncoding
@@ -1241,7 +1377,16 @@ instance ToJSON MediaTypeObject where
1241 toEncoding = sopSwaggerGenericToEncoding
1377 toEncoding = sopSwaggerGenericToEncoding
1243instance ToJSON Example where
1379instance ToJSON Example where
1244− toJSON = toJSON . Map.mapKeys show . getExample
1380+ toJSON = sopSwaggerGenericToJSON
1381+ toEncoding = sopSwaggerGenericToEncoding
1383+instance ToJSON Encoding where
1384+ toJSON = sopSwaggerGenericToJSON
1385+ toEncoding = sopSwaggerGenericToEncoding
1387+instance ToJSON Link where
1388+ toJSON = sopSwaggerGenericToJSON
1389+ toEncoding = sopSwaggerGenericToEncoding
1246instance ToJSON SecurityDefinitions where
1391instance ToJSON SecurityDefinitions where
1247 toJSON (SecurityDefinitions sd) = toJSON sd
1392 toJSON (SecurityDefinitions sd) = toJSON sd
@@ -1253,69 +1398,63 @@ referencedToJSON :: ToJSON a => Text -> Referenced a -> Value
1253referencedToJSON prefix (Ref (Reference ref)) = object [ "$ref" .= (prefix <> ref) ]
1398referencedToJSON prefix (Ref (Reference ref)) = object [ "$ref" .= (prefix <> ref) ]
1254referencedToJSON _ (Inline x) = toJSON x
1399referencedToJSON _ (Inline x) = toJSON x
1257−instance ToJSON (Referenced Schema) where toJSON = referencedToJSON "#/definitions/"
1401+instance ToJSON (Referenced Schema) where toJSON = referencedToJSON "#/components/schemas/"
1258−instance ToJSON (Referenced Param) where toJSON = referencedToJSON "#/parameters/"
1402+instance ToJSON (Referenced Param) where toJSON = referencedToJSON "#/components/parameters/"
1259−instance ToJSON (Referenced Response) where toJSON = referencedToJSON "#/responses/"
1403+instance ToJSON (Referenced Response) where toJSON = referencedToJSON "#/components/responses/"
1260−instance ToJSON (Referenced RequestBody) where toJSON = referencedToJSON "#/!!!!/"
1404+instance ToJSON (Referenced RequestBody) where toJSON = referencedToJSON "#/components/requestBodies/"
1261−
1405+instance ToJSON (Referenced Example) where toJSON = referencedToJSON "#/components/examples/"
1262−instance ToJSON (SwaggerType t) where
1406+instance ToJSON (Referenced Header) where toJSON = referencedToJSON "#/components/headers/"
1263− toJSON SwaggerArray = "array"
1407+instance ToJSON (Referenced Link) where toJSON = referencedToJSON "#/components/links/"
1264− toJSON SwaggerString = "string"
1408+instance ToJSON (Referenced Callback) where toJSON = referencedToJSON "#/components/callbacks/"
1265− toJSON SwaggerInteger = "integer"
1266− toJSON SwaggerNumber = "number"
1267− toJSON SwaggerBoolean = "boolean"
1268− toJSON SwaggerFile = "file"
1269− toJSON SwaggerNull = "null"
1270− toJSON SwaggerObject = "object"
1272−instance ToJSON (CollectionFormat t) where
1273− toJSON CollectionCSV = "csv"
1274− toJSON CollectionSSV = "ssv"
1275− toJSON CollectionTSV = "tsv"
1276− toJSON CollectionPipes = "pipes"
1277− toJSON CollectionMulti = "multi"
1279−instance ToJSON (ParamSchema k) where
1280− -- TODO: this is a bit fishy, why we need sub object only in `ToJSON`?
1281− toJSON = sopSwaggerGenericToJSONWithOpts $
1282− mkSwaggerAesonOptions "paramSchema" & saoSubObject ?~ "items"
1284instance ToJSON AdditionalProperties where
1410instance ToJSON AdditionalProperties where
1285 toJSON (AdditionalPropertiesAllowed b) = toJSON b
1411 toJSON (AdditionalPropertiesAllowed b) = toJSON b
1286 toJSON (AdditionalPropertiesSchema s) = toJSON s
1412 toJSON (AdditionalPropertiesSchema s) = toJSON s
1414+instance ToJSON ExpressionOrValue where
1415+ toJSON (Expression expr) = toJSON expr
1416+ toJSON (Value val) = toJSON val
1418+instance ToJSON Callback where
1419+ toJSON (Callback ps) = toJSON ps
1288-- =======================================================================
1421-- =======================================================================
1289-- Manual FromJSON instances
1422-- Manual FromJSON instances
1290-- =======================================================================
1423-- =======================================================================
1292−instance FromJSON OAuth2Flow where
1425+instance FromJSON MediaType where
1293− parseJSON (Object o) = do
1426+ parseJSON = withText "MediaType" $ \str ->
1294− (flow :: Text) <- o .: "flow"
1427+ maybe (fail $ "Invalid media type literal " <> Text.unpack str) pure $ parseAccept $ encodeUtf8 str
1296− "implicit" -> OAuth2Implicit <$> o .: "authorizationUrl"
1429+instance FromJSONKey MediaType where
1297− "password" -> OAuth2Password <$> o .: "tokenUrl"
1430+ fromJSONKey = FromJSONKeyTextParser (parseJSON . String)
1298− "application" -> OAuth2Application <$> o .: "tokenUrl"
1299− "accessCode" -> OAuth2AccessCode
1300− <$> o .: "authorizationUrl"
1301− <*> o .: "tokenUrl"
1303− parseJSON _ = empty
1432+instance (Eq p, FromJSON p, AesonDefaultValue p) => FromJSON (OAuth2Flow p) where
1433+ parseJSON = sopSwaggerGenericParseJSON
1305−instance FromJSON OAuth2Params where
1435+instance FromJSON OAuth2Flows where
1306 parseJSON = sopSwaggerGenericParseJSON
1436 parseJSON = sopSwaggerGenericParseJSON
1308instance FromJSON SecuritySchemeType where
1438instance FromJSON SecuritySchemeType where
1309 parseJSON js@(Object o) = do
1439 parseJSON js@(Object o) = do
1310 (t :: Text) <- o .: "type"
1440 (t :: Text) <- o .: "type"
1311 case t of
1441 case t of
1443+ scheme <- o .: "scheme"
1312− "http" -> pure SecuritySchemeHttp
1444+ SecuritySchemeHttp <$> case scheme of
1445+ "bearer" -> HttpSchemeBearer <$> (o .:! "bearerFormat")
1446+ "basic" -> pure HttpSchemeBasic
1447+ t -> pure $ HttpSchemeCustom t
1313 "apiKey" -> SecuritySchemeApiKey <$> parseJSON js
1448 "apiKey" -> SecuritySchemeApiKey <$> parseJSON js
1314− "oauth2" -> SecuritySchemeOAuth2 <$> parseJSON js
1449+ "oauth2" -> SecuritySchemeOAuth2 <$> (o .: "flows")
1450+ "openIdConnect" -> SecuritySchemeOpenIdConnect <$> (o .: "openIdConnectUrl")
1315 _ -> empty
1451 _ -> empty
1316 parseJSON _ = empty
1452 parseJSON _ = empty
1318−instance FromJSON Swagger where
1454+instance FromJSON OpenApi where
1455+ parseJSON = sopSwaggerGenericParseJSON
1457+instance FromJSON Server where
1319 parseJSON = sopSwaggerGenericParseJSON
1458 parseJSON = sopSwaggerGenericParseJSON
1321instance FromJSON SecurityScheme where
1460instance FromJSON SecurityScheme where
@@ -1324,84 +1463,40 @@ instance FromJSON SecurityScheme where
1324instance FromJSON Schema where
1463instance FromJSON Schema where
1325 parseJSON = fmap nullaryCleanup . sopSwaggerGenericParseJSON
1464 parseJSON = fmap nullaryCleanup . sopSwaggerGenericParseJSON
1326 where nullaryCleanup :: Schema -> Schema
1465 where nullaryCleanup :: Schema -> Schema
1327− nullaryCleanup s@Schema{_schemaParamSchema=ps} =
1466+ nullaryCleanup s =
1328− if _paramSchemaItems ps == Just (SwaggerItemsArray [])
1467+ if _schemaItems s == Just (OpenApiItemsArray [])
1329 then s { _schemaExample = Nothing
1468 then s { _schemaExample = Nothing
1330− , _schemaParamSchema = ps { _paramSchemaMaxItems = Nothing } }
1469+ , _schemaMaxItems = Nothing
1333instance FromJSON Header where
1473instance FromJSON Header where
1334 parseJSON = sopSwaggerGenericParseJSON
1474 parseJSON = sopSwaggerGenericParseJSON
1336−instance (FromJSON (CollectionFormat ('SwaggerKindNormal t)), FromJSON (ParamSchema ('SwaggerKindNormal t))) => FromJSON (SwaggerItems ('SwaggerKindNormal t)) where
1476+instance FromJSON OpenApiItems where
1337− parseJSON = withObject "SwaggerItemsPrimitive" $ \o -> SwaggerItemsPrimitive
1338− <$> o .:? "collectionFormat"
1339− <*> (o .: "items" >>= parseJSON)
1341−instance FromJSON (SwaggerItems 'SwaggerKindParamOtherSchema) where
1342− parseJSON = withObject "SwaggerItemsPrimitive" $ \o -> SwaggerItemsPrimitive
1343− <$> o .:? "collectionFormat"
1344− <*> ((o .: "items" >>= parseJSON) <|> fail ("foo" ++ show o))
1348−-- >>> decode "{}" :: Maybe (SwaggerItems 'SwaggerKindSchema)
1349−-- Just (SwaggerItemsArray [])
1351−-- >>> eitherDecode "{\"$ref\":\"#/definitions/example\"}" :: Either String (SwaggerItems 'SwaggerKindSchema)
1352−-- Right (SwaggerItemsObject (Ref (Reference {getReference = "example"})))
1354−-- >>> eitherDecode "[{\"$ref\":\"#/definitions/example\"}]" :: Either String (SwaggerItems 'SwaggerKindSchema)
1355−-- Right (SwaggerItemsArray [Ref (Reference {getReference = "example"})])
1357−instance FromJSON (SwaggerItems 'SwaggerKindSchema) where
1358 parseJSON js@(Object obj)
1477 parseJSON js@(Object obj)
1359− | null obj = pure $ SwaggerItemsArray [] -- Nullary schema.
1478+ | null obj = pure $ OpenApiItemsArray [] -- Nullary schema.
1360− | otherwise = SwaggerItemsObject <$> parseJSON js
1479+ | otherwise = OpenApiItemsObject <$> parseJSON js
1361− parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1480+ parseJSON js@(Array _) = OpenApiItemsArray <$> parseJSON js
1362 parseJSON _ = empty
1481 parseJSON _ = empty
1364instance FromJSON Components where
1483instance FromJSON Components where
1365 parseJSON = sopSwaggerGenericParseJSON
1484 parseJSON = sopSwaggerGenericParseJSON
1367−instance FromJSON Host where
1368− parseJSON (String s) = case map Text.unpack $ Text.split (== ':') s of
1369− [host] -> return $ Host host Nothing
1370− [host, port] -> case readMaybe port of
1371− Nothing -> fail $ "Invalid port `" ++ port ++ "'"
1372− Just p -> return $ Host host (Just (fromInteger p))
1373− _ -> fail $ "Invalid host `" ++ Text.unpack s ++ "'"
1374− parseJSON _ = empty
1376instance FromJSON MimeList where
1486instance FromJSON MimeList where
1377− parseJSON js = (MimeList . map fromString) <$> parseJSON js
1487+ parseJSON js = MimeList . map fromString <$> parseJSON js
1379instance FromJSON Param where
1489instance FromJSON Param where
1380 parseJSON = sopSwaggerGenericParseJSON
1490 parseJSON = sopSwaggerGenericParseJSON
1382−instance FromJSON ParamAnySchema where
1383− parseJSON js@(Object o) = do
1384− (i :: Text) <- o .: "in"
1387− schema <- o .: "schema"
1388− ParamBody <$> parseJSON schema
1389− _ -> ParamOther <$> parseJSON js
1390− parseJSON _ = empty
1392−instance FromJSON ParamOtherSchema where
1393− parseJSON = sopSwaggerGenericParseJSON
1395instance FromJSON Responses where
1492instance FromJSON Responses where
1396 parseJSON (Object o) = Responses
1493 parseJSON (Object o) = Responses
1397 <$> o .:? "default"
1494 <$> o .:? "default"
1398− <*> (parseJSON (Object (HashMap.delete "default" o)))
1495+ <*> parseJSON (Object (deleteKey "default" o))
1399 parseJSON _ = empty
1496 parseJSON _ = empty
1401instance FromJSON Example where
1498instance FromJSON Example where
1402− parseJSON js = do
1499+ parseJSON = sopSwaggerGenericParseJSON
1404− pure $ Example (Map.mapKeys fromString m)
1406instance FromJSON Response where
1501instance FromJSON Response where
1407 parseJSON = sopSwaggerGenericParseJSON
1502 parseJSON = sopSwaggerGenericParseJSON
@@ -1412,14 +1507,20 @@ instance FromJSON Operation where
1412instance FromJSON PathItem where
1507instance FromJSON PathItem where
1413 parseJSON = sopSwaggerGenericParseJSON
1508 parseJSON = sopSwaggerGenericParseJSON
1510+instance FromJSON SecurityDefinitions where
1511+ parseJSON js = SecurityDefinitions <$> parseJSON js
1415instance FromJSON RequestBody where
1513instance FromJSON RequestBody where
1416 parseJSON = sopSwaggerGenericParseJSON
1514 parseJSON = sopSwaggerGenericParseJSON
1418instance FromJSON MediaTypeObject where
1516instance FromJSON MediaTypeObject where
1419 parseJSON = sopSwaggerGenericParseJSON
1517 parseJSON = sopSwaggerGenericParseJSON
1421−instance FromJSON SecurityDefinitions where
1519+instance FromJSON Encoding where
1422− parseJSON js = SecurityDefinitions <$> parseJSON js
1520+ parseJSON = sopSwaggerGenericParseJSON
1522+instance FromJSON Link where
1523+ parseJSON = sopSwaggerGenericParseJSON
1424instance FromJSON Reference where
1525instance FromJSON Reference where
1425 parseJSON (Object o) = Reference <$> o .: "$ref"
1526 parseJSON (Object o) = Reference <$> o .: "$ref"
@@ -1438,57 +1539,44 @@ referencedParseJSON prefix js@(Object o) = do
1438 Just suffix -> pure (Reference suffix)
1539 Just suffix -> pure (Reference suffix)
1439referencedParseJSON _ _ = fail "referenceParseJSON: not an object"
1540referencedParseJSON _ _ = fail "referenceParseJSON: not an object"
1442−instance FromJSON (Referenced Schema) where parseJSON = referencedParseJSON "#/definitions/"
1542+instance FromJSON (Referenced Schema) where parseJSON = referencedParseJSON "#/components/schemas/"
1443−instance FromJSON (Referenced Param) where parseJSON = referencedParseJSON "#/parameters/"
1543+instance FromJSON (Referenced Param) where parseJSON = referencedParseJSON "#/components/parameters/"
1444−instance FromJSON (Referenced Response) where parseJSON = referencedParseJSON "#/responses/"
1544+instance FromJSON (Referenced Response) where parseJSON = referencedParseJSON "#/components/responses/"
1445−instance FromJSON (Referenced RequestBody) where parseJSON = referencedParseJSON "#/!!!!/"
1545+instance FromJSON (Referenced RequestBody) where parseJSON = referencedParseJSON "#/components/requestBodies/"
1546+instance FromJSON (Referenced Example) where parseJSON = referencedParseJSON "#/components/examples/"
1547+instance FromJSON (Referenced Header) where parseJSON = referencedParseJSON "#/components/headers/"
1548+instance FromJSON (Referenced Link) where parseJSON = referencedParseJSON "#/components/links/"
1549+instance FromJSON (Referenced Callback) where parseJSON = referencedParseJSON "#/components/callbacks/"
1447instance FromJSON Xml where
1551instance FromJSON Xml where
1448 parseJSON = genericParseJSON (jsonPrefix "xml")
1552 parseJSON = genericParseJSON (jsonPrefix "xml")
1450−instance FromJSON (SwaggerType 'SwaggerKindSchema) where
1451− parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray, SwaggerNull, SwaggerObject]
1453−instance FromJSON (SwaggerType 'SwaggerKindParamOtherSchema) where
1454− parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray, SwaggerFile]
1456−instance FromJSON (SwaggerType ('SwaggerKindNormal t)) where
1457− parseJSON = parseOneOf [SwaggerString, SwaggerInteger, SwaggerNumber, SwaggerBoolean, SwaggerArray]
1459−instance FromJSON (CollectionFormat ('SwaggerKindNormal t)) where
1460− parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]
1462−-- NOTE: There aren't collections of 'Schema'
1463−--instance FromJSON (CollectionFormat (SwaggerKindSchema)) where
1464−-- parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes]
1466−instance FromJSON (CollectionFormat 'SwaggerKindParamOtherSchema) where
1467− parseJSON = parseOneOf [CollectionCSV, CollectionSSV, CollectionTSV, CollectionPipes, CollectionMulti]
1469−instance (FromJSON (SwaggerType ('SwaggerKindNormal t)), FromJSON (SwaggerItems ('SwaggerKindNormal t))) => FromJSON (ParamSchema ('SwaggerKindNormal t)) where
1470− parseJSON = sopSwaggerGenericParseJSON
1471−instance FromJSON (ParamSchema 'SwaggerKindParamOtherSchema) where
1472− parseJSON = sopSwaggerGenericParseJSON
1473−instance FromJSON (ParamSchema 'SwaggerKindSchema) where
1474− parseJSON = sopSwaggerGenericParseJSON
1476instance FromJSON AdditionalProperties where
1554instance FromJSON AdditionalProperties where
1477 parseJSON (Bool b) = pure $ AdditionalPropertiesAllowed b
1555 parseJSON (Bool b) = pure $ AdditionalPropertiesAllowed b
1478 parseJSON js = AdditionalPropertiesSchema <$> parseJSON js
1556 parseJSON js = AdditionalPropertiesSchema <$> parseJSON js
1558+-- | All strings are parsed as expressions
1559+instance FromJSON ExpressionOrValue where
1560+ parseJSON (String expr) = pure $ Expression expr
1561+ parseJSON v = pure $ Value v
1563+instance FromJSON Callback where
1564+ parseJSON = fmap Callback . parseJSON
1566+instance HasSwaggerAesonOptions Server where
1567+ swaggerAesonOptions _ = mkSwaggerAesonOptions "server"
1480instance HasSwaggerAesonOptions Components where
1568instance HasSwaggerAesonOptions Components where
1481 swaggerAesonOptions _ = mkSwaggerAesonOptions "components"
1569 swaggerAesonOptions _ = mkSwaggerAesonOptions "components"
1482instance HasSwaggerAesonOptions Header where
1570instance HasSwaggerAesonOptions Header where
1483− swaggerAesonOptions _ = mkSwaggerAesonOptions "header" & saoSubObject ?~ "paramSchema"
1571+ swaggerAesonOptions _ = mkSwaggerAesonOptions "header"
1484−instance HasSwaggerAesonOptions OAuth2Params where
1572+instance AesonDefaultValue p => HasSwaggerAesonOptions (OAuth2Flow p) where
1485− swaggerAesonOptions _ = mkSwaggerAesonOptions "oauth2" & saoSubObject ?~ "flow"
1573+ swaggerAesonOptions _ = mkSwaggerAesonOptions "oauth2" & saoSubObject ?~ "params"
1574+instance HasSwaggerAesonOptions OAuth2Flows where
1575+ swaggerAesonOptions _ = mkSwaggerAesonOptions "oauth2Flows"
1486instance HasSwaggerAesonOptions Operation where
1576instance HasSwaggerAesonOptions Operation where
1487 swaggerAesonOptions _ = mkSwaggerAesonOptions "operation"
1577 swaggerAesonOptions _ = mkSwaggerAesonOptions "operation"
1488instance HasSwaggerAesonOptions Param where
1578instance HasSwaggerAesonOptions Param where
1489− swaggerAesonOptions _ = mkSwaggerAesonOptions "param" & saoSubObject ?~ "schema"
1579+ swaggerAesonOptions _ = mkSwaggerAesonOptions "param"
1490−instance HasSwaggerAesonOptions ParamOtherSchema where
1491− swaggerAesonOptions _ = mkSwaggerAesonOptions "paramOtherSchema" & saoSubObject ?~ "paramSchema"
1492instance HasSwaggerAesonOptions PathItem where
1580instance HasSwaggerAesonOptions PathItem where
1493 swaggerAesonOptions _ = mkSwaggerAesonOptions "pathItem"
1581 swaggerAesonOptions _ = mkSwaggerAesonOptions "pathItem"
1494instance HasSwaggerAesonOptions Response where
1582instance HasSwaggerAesonOptions Response where
@@ -1496,32 +1584,36 @@ instance HasSwaggerAesonOptions Response where
1496instance HasSwaggerAesonOptions RequestBody where
1584instance HasSwaggerAesonOptions RequestBody where
1497 swaggerAesonOptions _ = mkSwaggerAesonOptions "requestBody"
1585 swaggerAesonOptions _ = mkSwaggerAesonOptions "requestBody"
1498instance HasSwaggerAesonOptions MediaTypeObject where
1586instance HasSwaggerAesonOptions MediaTypeObject where
1499− swaggerAesonOptions _ = mkSwaggerAesonOptions "mediaType"
1587+ swaggerAesonOptions _ = mkSwaggerAesonOptions "mediaTypeObject"
1500instance HasSwaggerAesonOptions Responses where
1588instance HasSwaggerAesonOptions Responses where
1501 swaggerAesonOptions _ = mkSwaggerAesonOptions "responses" & saoSubObject ?~ "responses"
1589 swaggerAesonOptions _ = mkSwaggerAesonOptions "responses" & saoSubObject ?~ "responses"
1502instance HasSwaggerAesonOptions SecurityScheme where
1590instance HasSwaggerAesonOptions SecurityScheme where
1503 swaggerAesonOptions _ = mkSwaggerAesonOptions "securityScheme" & saoSubObject ?~ "type"
1591 swaggerAesonOptions _ = mkSwaggerAesonOptions "securityScheme" & saoSubObject ?~ "type"
1504instance HasSwaggerAesonOptions Schema where
1592instance HasSwaggerAesonOptions Schema where
1505 swaggerAesonOptions _ = mkSwaggerAesonOptions "schema" & saoSubObject ?~ "paramSchema"
1593 swaggerAesonOptions _ = mkSwaggerAesonOptions "schema" & saoSubObject ?~ "paramSchema"
1506−instance HasSwaggerAesonOptions Swagger where
1594+instance HasSwaggerAesonOptions OpenApi where
1507− swaggerAesonOptions _ = mkSwaggerAesonOptions "swagger" & saoAdditionalPairs .~ [("openapi", "3.0")]
1595+ swaggerAesonOptions _ = mkSwaggerAesonOptions "swagger" & saoAdditionalPairs .~ [("openapi", "3.0.0")]
1596+instance HasSwaggerAesonOptions Example where
1597+ swaggerAesonOptions _ = mkSwaggerAesonOptions "example"
1598+instance HasSwaggerAesonOptions Encoding where
1599+ swaggerAesonOptions _ = mkSwaggerAesonOptions "encoding"
1509−instance HasSwaggerAesonOptions (ParamSchema ('SwaggerKindNormal t)) where
1601+instance HasSwaggerAesonOptions Link where
1510− swaggerAesonOptions _ = mkSwaggerAesonOptions "paramSchema" & saoSubObject ?~ "items"
1511−instance HasSwaggerAesonOptions (ParamSchema 'SwaggerKindParamOtherSchema) where
1512− swaggerAesonOptions _ = mkSwaggerAesonOptions "paramSchema" & saoSubObject ?~ "items"
1513−-- NOTE: Schema doesn't have 'items' sub object!
1514−instance HasSwaggerAesonOptions (ParamSchema 'SwaggerKindSchema) where
1515− swaggerAesonOptions _ = mkSwaggerAesonOptions "paramSchema"
1602+ swaggerAesonOptions _ = mkSwaggerAesonOptions "link"
1604+instance AesonDefaultValue Server
1517instance AesonDefaultValue Components
1605instance AesonDefaultValue Components
1518−instance AesonDefaultValue (ParamSchema s)
1606+instance AesonDefaultValue OAuth2ImplicitFlow
1519−instance AesonDefaultValue OAuth2Flow
1607+instance AesonDefaultValue OAuth2PasswordFlow
1608+instance AesonDefaultValue OAuth2ClientCredentialsFlow
1609+instance AesonDefaultValue OAuth2AuthorizationCodeFlow
1610+instance AesonDefaultValue p => AesonDefaultValue (OAuth2Flow p)
1520instance AesonDefaultValue Responses
1611instance AesonDefaultValue Responses
1521−instance AesonDefaultValue ParamAnySchema
1522instance AesonDefaultValue SecuritySchemeType
1612instance AesonDefaultValue SecuritySchemeType
1523−instance AesonDefaultValue (SwaggerType a)
1613+instance AesonDefaultValue OpenApiType
1524instance AesonDefaultValue MimeList where defaultValue = Just mempty
1614instance AesonDefaultValue MimeList where defaultValue = Just mempty
1525instance AesonDefaultValue Info
1615instance AesonDefaultValue Info
1526instance AesonDefaultValue ParamLocation
1616instance AesonDefaultValue ParamLocation
1527−instance AesonDefaultValue SecurityDefinitions where defaultValue = Just $ SecurityDefinitions mempty
1617+instance AesonDefaultValue Link
1618+instance AesonDefaultValue SecurityDefinitions where
1619+ defaultValue = Just mempty