@@ -16,6 +16,7 @@ module Servant.Swagger.Internal where
16
16
import Prelude ()
17
17
import Prelude.Compat
18
18
19
+ import Control.Applicative ((<|>) )
19
20
import Control.Lens
20
21
import Data.Aeson
21
22
import Data.HashMap.Strict.InsOrd (InsOrdHashMap )
@@ -184,6 +185,56 @@ instance SwaggerMethod 'OPTIONS where swaggerMethod _ = options
184
185
instance SwaggerMethod 'HEAD where swaggerMethod _ = head_
185
186
instance SwaggerMethod 'PATCH where swaggerMethod _ = patch
186
187
188
+ instance HasSwagger (UVerb method cs '[] ) where
189
+ toSwagger _ = mempty
190
+
191
+ -- | @since <TODO>
192
+ instance
193
+ {-# OVERLAPPABLE #-}
194
+ ( ToSchema a ,
195
+ HasStatus a ,
196
+ AllAccept cs ,
197
+ SwaggerMethod method ,
198
+ HasSwagger (UVerb method cs as )
199
+ ) =>
200
+ HasSwagger (UVerb method cs (a ': as ))
201
+ where
202
+ toSwagger _ =
203
+ toSwagger (Proxy :: Proxy (Verb method (StatusOf a ) cs a ))
204
+ `combineSwagger` toSwagger (Proxy :: Proxy (UVerb method cs as ))
205
+ where
206
+ -- workaround for https://github.com/GetShopTV/swagger2/issues/218
207
+ -- We'd like to juse use (<>) but the instances are wrong
208
+ combinePathItem :: PathItem -> PathItem -> PathItem
209
+ combinePathItem s t = PathItem
210
+ { _pathItemGet = _pathItemGet s <> _pathItemGet t
211
+ , _pathItemPut = _pathItemPut s <> _pathItemPut t
212
+ , _pathItemPost = _pathItemPost s <> _pathItemPost t
213
+ , _pathItemDelete = _pathItemDelete s <> _pathItemDelete t
214
+ , _pathItemOptions = _pathItemOptions s <> _pathItemOptions t
215
+ , _pathItemHead = _pathItemHead s <> _pathItemHead t
216
+ , _pathItemPatch = _pathItemPatch s <> _pathItemPatch t
217
+ , _pathItemParameters = _pathItemParameters s <> _pathItemParameters t
218
+ }
219
+
220
+ combineSwagger :: Swagger -> Swagger -> Swagger
221
+ combineSwagger s t = Swagger
222
+ { _swaggerInfo = _swaggerInfo s <> _swaggerInfo t
223
+ , _swaggerHost = _swaggerHost s <|> _swaggerHost t
224
+ , _swaggerBasePath = _swaggerBasePath s <|> _swaggerBasePath t
225
+ , _swaggerSchemes = _swaggerSchemes s <> _swaggerSchemes t
226
+ , _swaggerConsumes = _swaggerConsumes s <> _swaggerConsumes t
227
+ , _swaggerProduces = _swaggerProduces s <> _swaggerProduces t
228
+ , _swaggerPaths = InsOrdHashMap. unionWith combinePathItem (_swaggerPaths s) (_swaggerPaths t)
229
+ , _swaggerDefinitions = _swaggerDefinitions s <> _swaggerDefinitions t
230
+ , _swaggerParameters = _swaggerParameters s <> _swaggerParameters t
231
+ , _swaggerResponses = _swaggerResponses s <> _swaggerResponses t
232
+ , _swaggerSecurityDefinitions = _swaggerSecurityDefinitions s <> _swaggerSecurityDefinitions t
233
+ , _swaggerSecurity = _swaggerSecurity s <> _swaggerSecurity t
234
+ , _swaggerTags = _swaggerTags s <> _swaggerTags t
235
+ , _swaggerExternalDocs = _swaggerExternalDocs s <|> _swaggerExternalDocs t
236
+ }
237
+
187
238
instance {-# OVERLAPPABLE #-} (ToSchema a , AllAccept cs , KnownNat status , SwaggerMethod method ) => HasSwagger (Verb method status cs a ) where
188
239
toSwagger _ = toSwagger (Proxy :: Proxy (Verb method status cs (Headers '[] a )))
189
240
0 commit comments