Skip to content

Commit 34877ac

Browse files
committed
Lift restriction of swagger spec delivery from Handler to any Monad
- By using the ServerT type family we allow custom monads to deliver swagger.json
1 parent 89a2415 commit 34877ac

File tree

2 files changed

+36
-4
lines changed
  • servant-swagger-ui-core/src/Servant/Swagger/UI
  • servant-swagger-ui/src/Servant/Swagger

2 files changed

+36
-4
lines changed

servant-swagger-ui-core/src/Servant/Swagger/UI/Core.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,19 @@ instance (KnownSymbol dir, HasLink api, Link ~ MkLink api Link, IsElem api api)
101101
proxyApi = Proxy :: Proxy api
102102

103103
swaggerSchemaUIServerImpl
104-
:: (Server api ~ Handler Swagger)
104+
:: (Monad m, ServerT api m ~ m Swagger)
105105
=> T.Text -> [(FilePath, ByteString)]
106-
-> Swagger -> Server (SwaggerSchemaUI' dir api)
106+
-> Swagger -> ServerT (SwaggerSchemaUI' dir api) m
107107
swaggerSchemaUIServerImpl indexTemplate files swagger
108108
= swaggerSchemaUIServerImpl' indexTemplate files $ return swagger
109109

110110
-- | Use a custom server to serve the Swagger spec source.
111111
swaggerSchemaUIServerImpl'
112-
:: T.Text -> [(FilePath, ByteString)]
113-
-> Server api -> Server (SwaggerSchemaUI' dir api)
112+
:: Monad m
113+
=> T.Text
114+
-> [(FilePath, ByteString)]
115+
-> ServerT api m
116+
-> ServerT (SwaggerSchemaUI' dir api) m
114117
swaggerSchemaUIServerImpl' indexTemplate files server
115118
= server
116119
:<|> return (SwaggerUiHtml indexTemplate)

servant-swagger-ui/src/Servant/Swagger/UI.hs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ module Servant.Swagger.UI (
4646
SwaggerSchemaUI,
4747
SwaggerSchemaUI',
4848
swaggerSchemaUIServer,
49+
swaggerSchemaUIServerT,
4950
swaggerSchemaUIServer',
51+
swaggerSchemaUIServerT',
5052

5153
-- ** Official swagger ui
5254
swaggerUiIndexTemplate,
@@ -72,6 +74,19 @@ swaggerSchemaUIServer
7274
swaggerSchemaUIServer =
7375
swaggerSchemaUIServerImpl swaggerUiIndexTemplate swaggerUiFiles
7476

77+
-- | Serve Swagger UI on @/dir@ using @api@ as a Swagger spec source.
78+
--
79+
-- Generalized to 'ServerT'
80+
--
81+
-- @
82+
-- swaggerSchemaUIServerT :: Swagger -> ServerT (SwaggerSchemaUI schema dir) m
83+
-- @
84+
swaggerSchemaUIServerT
85+
:: (Monad m, ServerT api m ~ m Swagger)
86+
=> Swagger -> ServerT (SwaggerSchemaUI' dir api) m
87+
swaggerSchemaUIServerT =
88+
swaggerSchemaUIServerImpl swaggerUiIndexTemplate swaggerUiFiles
89+
7590
-- | Use a custom server to serve the Swagger spec source.
7691
--
7792
-- This allows even more control over how the spec source is served.
@@ -83,6 +98,20 @@ swaggerSchemaUIServer'
8398
swaggerSchemaUIServer' =
8499
swaggerSchemaUIServerImpl' swaggerUiIndexTemplate swaggerUiFiles
85100

101+
-- | Use a custom server to serve the Swagger spec source.
102+
--
103+
-- This allows even more control over how the spec source is served.
104+
-- It allows, for instance, serving the spec source with authentication,
105+
-- customizing the response based on the client or serving a swagger.yaml
106+
-- instead.
107+
--
108+
-- Generalized to 'ServerT'
109+
--
110+
swaggerSchemaUIServerT'
111+
:: Monad m => ServerT api m -> ServerT (SwaggerSchemaUI' dir api) m
112+
swaggerSchemaUIServerT' =
113+
swaggerSchemaUIServerImpl' swaggerUiIndexTemplate swaggerUiFiles
114+
86115
swaggerUiIndexTemplate :: Text
87116
swaggerUiIndexTemplate = $(embedText "index.html.tmpl")
88117

0 commit comments

Comments
 (0)