From cb310b8294abb13cc1345151ba91ffcf3c9e1853 Mon Sep 17 00:00:00 2001 From: Isaac Elliott Date: Fri, 29 Apr 2022 14:50:08 +1000 Subject: [PATCH 1/3] servant-swagger: add HasSwagger instance for NamedRoutes --- servant-swagger/src/Servant/Swagger/Internal.hs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/servant-swagger/src/Servant/Swagger/Internal.hs b/servant-swagger/src/Servant/Swagger/Internal.hs index c4cc2780..cce1ba9a 100644 --- a/servant-swagger/src/Servant/Swagger/Internal.hs +++ b/servant-swagger/src/Servant/Swagger/Internal.hs @@ -35,6 +35,7 @@ import Network.HTTP.Media (MediaType) import Servant.API import Servant.API.Description (FoldDescription, reflectDescription) +import Servant.API.Generic (ToServantApi) import Servant.API.Modifiers (FoldRequired) import Servant.Swagger.Internal.TypeLevel.API @@ -439,6 +440,9 @@ instance (ToSchema a, Accept ct, HasSwagger sub, KnownSymbol (FoldDescription mo & required ?~ True & schema .~ ParamBody ref +instance HasSwagger (ToServantApi routes) => HasSwagger (NamedRoutes routes) where + toSwagger _ = toSwagger (Proxy :: Proxy (ToServantApi routes)) + -- ======================================================================= -- Below are the definitions that should be in Servant.API.ContentTypes -- ======================================================================= From ae8e1e60036273d4f544a3bfae99fe354a92b5f0 Mon Sep 17 00:00:00 2001 From: Isaac Elliott Date: Fri, 29 Apr 2022 16:38:29 +1000 Subject: [PATCH 2/3] servant-swagger: tag NamedRoutes endpoints with datatype name --- servant-swagger/src/Servant/Swagger/Internal.hs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/servant-swagger/src/Servant/Swagger/Internal.hs b/servant-swagger/src/Servant/Swagger/Internal.hs index cce1ba9a..75d612c5 100644 --- a/servant-swagger/src/Servant/Swagger/Internal.hs +++ b/servant-swagger/src/Servant/Swagger/Internal.hs @@ -3,11 +3,13 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeOperators #-} +{-# LANGUAGE TypeFamilies #-} #if __GLASGOW_HASKELL__ >= 806 {-# LANGUAGE UndecidableInstances #-} #endif @@ -30,12 +32,13 @@ import qualified Data.Swagger as Swagger import Data.Swagger.Declare import Data.Text (Text) import qualified Data.Text as Text +import GHC.Generics (Rep, datatypeName, D1, Meta(..)) import GHC.TypeLits import Network.HTTP.Media (MediaType) import Servant.API import Servant.API.Description (FoldDescription, reflectDescription) -import Servant.API.Generic (ToServantApi) +import Servant.API.Generic (ToServantApi, AsApi) import Servant.API.Modifiers (FoldRequired) import Servant.Swagger.Internal.TypeLevel.API @@ -150,6 +153,10 @@ mkEndpointNoContentVerb path _ = mempty addParam :: Param -> Swagger -> Swagger addParam param = allOperations.parameters %~ (Inline param :) +-- | Add a tag to every operation in the spec. +addTag :: Text -> Swagger -> Swagger +addTag tag = allOperations.tags %~ ([tag] <>) + -- | Add accepted content types to every operation in the spec. addConsumes :: [MediaType] -> Swagger -> Swagger addConsumes cs = allOperations.consumes %~ (<> Just (MimeList cs)) @@ -440,8 +447,8 @@ instance (ToSchema a, Accept ct, HasSwagger sub, KnownSymbol (FoldDescription mo & required ?~ True & schema .~ ParamBody ref -instance HasSwagger (ToServantApi routes) => HasSwagger (NamedRoutes routes) where - toSwagger _ = toSwagger (Proxy :: Proxy (ToServantApi routes)) +instance (HasSwagger (ToServantApi routes), KnownSymbol datatypeName, Rep (routes AsApi) ~ D1 ('MetaData datatypeName moduleName packageName isNewtype) f) => HasSwagger (NamedRoutes routes) where + toSwagger _ = addTag (Text.pack $ symbolVal (Proxy :: Proxy datatypeName)) (toSwagger (Proxy :: Proxy (ToServantApi routes))) -- ======================================================================= -- Below are the definitions that should be in Servant.API.ContentTypes From 59b5fe67cd446d4ccd8b7a0a7304ce76d3249d79 Mon Sep 17 00:00:00 2001 From: Isaac Elliott Date: Fri, 29 Apr 2022 16:44:01 +1000 Subject: [PATCH 3/3] servant-swagger: clean up imports --- servant-swagger/src/Servant/Swagger/Internal.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servant-swagger/src/Servant/Swagger/Internal.hs b/servant-swagger/src/Servant/Swagger/Internal.hs index 75d612c5..66cb0595 100644 --- a/servant-swagger/src/Servant/Swagger/Internal.hs +++ b/servant-swagger/src/Servant/Swagger/Internal.hs @@ -32,7 +32,7 @@ import qualified Data.Swagger as Swagger import Data.Swagger.Declare import Data.Text (Text) import qualified Data.Text as Text -import GHC.Generics (Rep, datatypeName, D1, Meta(..)) +import GHC.Generics (D1, Meta(..), Rep) import GHC.TypeLits import Network.HTTP.Media (MediaType) import Servant.API