Skip to content

Commit 6576953

Browse files
committed
Generalize for arbitrary schema type
Make all package serve arbitrary `aeson` `Value` as spec file instead of concrete `Swagger` type from `swagger2` package. This allows to use `OpenApi` from `openapi3` without depending on both packages.
1 parent 10d50f9 commit 6576953

File tree

9 files changed

+34
-25
lines changed

9 files changed

+34
-25
lines changed

servant-swagger-ui-core/servant-swagger-ui-core.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ library
3737
ghc-options: -Wall
3838
build-depends:
3939
base >=4.7 && <4.15
40+
, aeson >=0.8.0.2 && <1.6
4041
, blaze-markup >=0.7.0.2 && <0.9
4142
, bytestring >=0.10.4.0 && <0.11
4243
, http-media >=0.7.1.3 && <0.9
4344
, servant >=0.14 && <0.19
4445
, servant-blaze >=0.8 && <0.10
4546
, servant-server >=0.14 && <0.19
46-
, swagger2 >=2.3.0.1 && <2.7
4747
, text >=1.2.3.0 && <1.3
4848
, transformers >=0.3 && <0.6
4949
, transformers-compat >=0.3 && <0.7

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ module Servant.Swagger.UI.Core (
4646
Handler,
4747
) where
4848

49+
import Data.Aeson (ToJSON (..), Value)
4950
import Data.ByteString (ByteString)
50-
import Data.Swagger (Swagger)
5151
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
5252
import Network.Wai.Application.Static (embeddedSettings, staticApp)
5353
import Servant
@@ -67,8 +67,10 @@ import qualified Data.Text as T
6767
-- \/swagger-ui\/...
6868
-- @
6969
--
70+
-- This type does not actually force served type to be @Swagger@ from @swagger2@ package,
71+
-- it could be arbitrary @aeson@ 'Value'.
7072
type SwaggerSchemaUI (dir :: Symbol) (schema :: Symbol) =
71-
SwaggerSchemaUI' dir (schema :> Get '[JSON] Swagger)
73+
SwaggerSchemaUI' dir (schema :> Get '[JSON] Value)
7274

7375
-- | Use 'SwaggerSchemaUI'' when you need even more control over
7476
-- where @swagger.json@ is served (e.g. subdirectory).
@@ -101,11 +103,11 @@ instance (KnownSymbol dir, HasLink api, Link ~ MkLink api Link, IsElem api api)
101103
proxyApi = Proxy :: Proxy api
102104

103105
swaggerSchemaUIServerImpl
104-
:: (Monad m, ServerT api m ~ m Swagger)
106+
:: (Monad m, ServerT api m ~ m Value, ToJSON a)
105107
=> T.Text -> [(FilePath, ByteString)]
106-
-> Swagger -> ServerT (SwaggerSchemaUI' dir api) m
108+
-> a -> ServerT (SwaggerSchemaUI' dir api) m
107109
swaggerSchemaUIServerImpl indexTemplate files swagger
108-
= swaggerSchemaUIServerImpl' indexTemplate files $ return swagger
110+
= swaggerSchemaUIServerImpl' indexTemplate files $ return $ toJSON swagger
109111

110112
-- | Use a custom server to serve the Swagger spec source.
111113
swaggerSchemaUIServerImpl'

servant-swagger-ui-example/src/Main.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Prelude ()
1616
import Prelude.Compat
1717

1818
import Control.Lens hiding ((.=))
19-
import Data.Aeson (FromJSON, ToJSON)
19+
import Data.Aeson (FromJSON, ToJSON, Value)
2020
import Data.Maybe (fromMaybe)
2121
import Data.String (IsString (..))
2222
import Data.Text (Text)
@@ -142,7 +142,7 @@ type API =
142142
-- To test nested case
143143
type API' = API
144144
:<|> "nested" :> API
145-
:<|> SwaggerSchemaUI' "foo-ui" ("foo" :> "swagger.json" :> Get '[JSON] Swagger)
145+
:<|> SwaggerSchemaUI' "foo-ui" ("foo" :> "swagger.json" :> Get '[JSON] Value)
146146

147147
-- Implementation
148148

@@ -174,7 +174,7 @@ server' uiFlavour = server Normal
174174
-- Unfortunately we have to specify the basePath manually atm.
175175

176176
schemaUiServer
177-
:: (Server api ~ Handler Swagger)
177+
:: (Server api ~ Handler Value)
178178
=> Swagger -> Server (SwaggerSchemaUI' dir api)
179179
schemaUiServer = case uiFlavour of
180180
Original -> swaggerSchemaUIServer

servant-swagger-ui-jensoleg/servant-swagger-ui-jensoleg.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ library
8686
build-depends: servant-swagger-ui-core >=0.3.3 && <0.4
8787
build-depends:
8888
base >=4.7 && <4.15
89+
, aeson >=0.8.0.2 && <1.6
8990
, bytestring >=0.10.4.0 && <0.11
9091
, file-embed-lzma >=0 && <0.1
9192
, servant >=0.14 && <0.19
9293
, servant-server >=0.14 && <0.19
93-
, swagger2 >=2.3.0.1 && <2.7
9494
, text >=1.2.3.0 && <1.3
9595

9696
exposed-modules: Servant.Swagger.UI.JensOleG

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ module Servant.Swagger.UI.JensOleG (
5555

5656
import Servant.Swagger.UI.Core
5757

58+
import Data.Aeson (ToJSON, Value)
5859
import Data.ByteString (ByteString)
59-
import Data.Swagger (Swagger)
6060
import Data.Text (Text)
6161
import FileEmbedLzma
6262
import Servant
@@ -67,8 +67,8 @@ import Servant
6767
--
6868
-- See <https://github.com/jensoleg/swagger-ui>
6969
jensolegSwaggerSchemaUIServer
70-
:: (Server api ~ Handler Swagger)
71-
=> Swagger -> Server (SwaggerSchemaUI' dir api)
70+
:: (Server api ~ Handler Value, ToJSON a)
71+
=> a -> Server (SwaggerSchemaUI' dir api)
7272
jensolegSwaggerSchemaUIServer =
7373
swaggerSchemaUIServerImpl jensolegIndexTemplate jensolegFiles
7474

servant-swagger-ui-redoc/servant-swagger-ui-redoc.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ library
3636
build-depends: servant-swagger-ui-core >=0.3.3 && <0.4
3737
build-depends:
3838
base >=4.7 && <4.15
39+
, aeson >=0.8.0.2 && <1.6
3940
, bytestring >=0.10.4.0 && <0.11
4041
, file-embed-lzma >=0 && <0.1
4142
, servant >=0.14 && <0.19
4243
, servant-server >=0.14 && <0.19
43-
, swagger2 >=2.3.0.1 && <2.7
4444
, text >=1.2.3.0 && <1.3
4545

4646
exposed-modules: Servant.Swagger.UI.ReDoc

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ module Servant.Swagger.UI.ReDoc (
5757

5858
import Servant.Swagger.UI.Core
5959

60+
import Data.Aeson (ToJSON, Value)
6061
import Data.ByteString (ByteString)
61-
import Data.Swagger (Swagger)
6262
import Data.Text (Text)
6363
import FileEmbedLzma
6464
import Servant
@@ -67,8 +67,8 @@ import Servant
6767
--
6868
-- See <https://github.com/Rebilly/ReDoc/tree/v1.x>
6969
redocSchemaUIServer
70-
:: (Server api ~ Handler Swagger)
71-
=> Swagger -> Server (SwaggerSchemaUI' dir api)
70+
:: (Server api ~ Handler Value, ToJSON a)
71+
=> a -> Server (SwaggerSchemaUI' dir api)
7272
redocSchemaUIServer =
7373
swaggerSchemaUIServerImpl redocIndexTemplate redocFiles
7474

@@ -80,8 +80,8 @@ redocSchemaUIServer =
8080
-- redocSchemaUIServerT :: Swagger -> ServerT (SwaggerSchemaUI schema dir) m
8181
-- @
8282
redocSchemaUIServerT
83-
:: (Monad m, ServerT api m ~ m Swagger)
84-
=> Swagger -> ServerT (SwaggerSchemaUI' dir api) m
83+
:: (Monad m, ServerT api m ~ m Value, ToJSON a)
84+
=> a -> ServerT (SwaggerSchemaUI' dir api) m
8585
redocSchemaUIServerT =
8686
swaggerSchemaUIServerImpl redocIndexTemplate redocFiles
8787

servant-swagger-ui/servant-swagger-ui.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ library
4545
build-depends: servant-swagger-ui-core >=0.3.3 && <0.4
4646
build-depends:
4747
base >=4.7 && <4.15
48+
, aeson >=0.8.0.2 && <1.6
4849
, bytestring >=0.10.4.0 && <0.11
4950
, file-embed-lzma >=0 && <0.1
5051
, servant >=0.14 && <0.19
5152
, servant-server >=0.14 && <0.19
52-
, swagger2 >=2.3.0.1 && <2.7
5353
, text >=1.2.3.0 && <1.3
5454

5555
exposed-modules: Servant.Swagger.UI

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
--
2323
-- All of the UI files are embedded into the binary.
2424
--
25+
-- Note that you need to depend on particular @swagger-ui@ compatible provider:
26+
--
27+
-- - <https://hackage.haskell.org/package/swagger2>
28+
-- - <https://hackage.haskell.org/package/openapi3>
29+
--
2530
-- /An example:/
2631
--
2732
-- @
@@ -57,8 +62,8 @@ module Servant.Swagger.UI (
5762

5863
import Servant.Swagger.UI.Core
5964

65+
import Data.Aeson (ToJSON, Value)
6066
import Data.ByteString (ByteString)
61-
import Data.Swagger (Swagger)
6267
import Data.Text (Text)
6368
import FileEmbedLzma
6469
import Servant
@@ -67,10 +72,11 @@ import Servant
6772
--
6873
-- @
6974
-- swaggerSchemaUIServer :: Swagger -> Server (SwaggerSchemaUI schema dir)
75+
-- swaggerSchemaUIServer :: OpenApi -> Server (SwaggerSchemaUI schema dir)
7076
-- @
7177
swaggerSchemaUIServer
72-
:: (Server api ~ Handler Swagger)
73-
=> Swagger -> Server (SwaggerSchemaUI' dir api)
78+
:: (Server api ~ Handler Value, ToJSON a)
79+
=> a -> Server (SwaggerSchemaUI' dir api)
7480
swaggerSchemaUIServer =
7581
swaggerSchemaUIServerImpl swaggerUiIndexTemplate swaggerUiFiles
7682

@@ -80,10 +86,11 @@ swaggerSchemaUIServer =
8086
--
8187
-- @
8288
-- swaggerSchemaUIServerT :: Swagger -> ServerT (SwaggerSchemaUI schema dir) m
89+
-- swaggerSchemaUIServerT :: OpenApi -> ServerT (SwaggerSchemaUI schema dir) m
8390
-- @
8491
swaggerSchemaUIServerT
85-
:: (Monad m, ServerT api m ~ m Swagger)
86-
=> Swagger -> ServerT (SwaggerSchemaUI' dir api) m
92+
:: (Monad m, ServerT api m ~ m Value, ToJSON a)
93+
=> a -> ServerT (SwaggerSchemaUI' dir api) m
8794
swaggerSchemaUIServerT =
8895
swaggerSchemaUIServerImpl swaggerUiIndexTemplate swaggerUiFiles
8996

0 commit comments

Comments
 (0)