servant-routes-0.1.1.0: src/Servant/API/Routes/Param.hs
{- |
Module : Servant.API.Routes.Param
Copyright : (c) Frederick Pringle, 2025
License : BSD-3-Clause
Maintainer : frederick.pringle@fpringle.com
Simple representation of HTTP query params
-}
module Servant.API.Routes.Param
( Param
, singleParam
, arrayElemParam
, flagParam
, renderParam
)
where
import qualified Data.Text as T
import Data.Typeable
import GHC.TypeLits
import qualified Servant.Links as S
import "this" Servant.API.Routes.Internal.Param
import "this" Servant.API.Routes.Utils
-- | Create a 'S.SingleParam' from a 'Symbol' and a 'TypeRep' via 'Typeable'.
singleParam :: forall s a. (KnownSymbol s, Typeable a) => Param
singleParam = Param (S.SingleParam name rep)
where
rep = showTypeRep @a
name = symbolVal $ Proxy @s
-- | Create an 'S.ArrayParam' from a 'Symbol' and a 'TypeRep' via 'Typeable'.
arrayElemParam :: forall s a. (KnownSymbol s, Typeable a) => Param
arrayElemParam = Param (S.ArrayElemParam name rep)
where
rep = showTypeRep @a
name = symbolVal $ Proxy @s
-- | Create a 'S.FlagParam' from a 'Symbol'.
flagParam :: forall s. (KnownSymbol s) => Param
flagParam = Param (S.FlagParam name)
where
name = symbolVal $ Proxy @s
-- | Pretty-print a 'Param'. Used by 'Servant.API.Routes.renderRoute'.
renderParam :: Param -> T.Text
renderParam (Param param) = case param of
S.SingleParam var typ -> T.pack var <> "=<" <> typ <> ">"
S.ArrayElemParam var typ -> T.pack var <> "=<[" <> typ <> "]>"
S.FlagParam var -> T.pack var