{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Servant.Swagger.Tags where
import Control.Lens
import qualified Data.Set as S
import Data.Swagger
import qualified Data.Text as Text
import Data.Typeable (Typeable)
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
import Servant hiding (Context)
import Servant.Mock
import Servant.Swagger
data Tags (sym :: Symbol)
deriving (Typeable)
instance HasServer api ctx => HasServer (Tags tags :> api) ctx where
type ServerT (Tags tags :> api) m = ServerT api m
route _ = route (Proxy :: Proxy api)
hoistServerWithContext _ = hoistServerWithContext (Proxy :: Proxy api)
instance (KnownSymbol tags, HasSwagger api) => HasSwagger (Tags tags :> api) where
toSwagger _ = toSwagger (Proxy :: Proxy api)
& allOperations.tags %~ S.union (S.fromList [Text.pack (symbolVal (Proxy :: Proxy tags))])
instance HasMock api context => HasMock (Tags t :> api) context where
mock _ = mock (Proxy :: Proxy api)