{- |
Module      : Servant.API.Routes.Param
Copyright   : (c) Frederick Pringle, 2025
License     : BSD-3-Clause
Maintainer  : freddyjepringle@gmail.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 "this" Servant.API.Routes.Internal.Param
import "this" Servant.API.Routes.Utils
import qualified Servant.Links as S

-- | Create a 'S.SingleParam' from a 'Symbol' and a 'TypeRep' via 'Typeable'.
singleParam :: forall s a. (KnownSymbol s, Typeable a) => Param
singleParam :: forall (s :: Symbol) a. (KnownSymbol s, Typeable a) => Param
singleParam = Param -> Param
Param (String -> Text -> Param
S.SingleParam String
name Text
rep)
  where
    rep :: Text
rep = forall a. Typeable a => Text
showTypeRep @a
    name :: String
name = forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s

-- | Create an 'S.ArrayParam' from a 'Symbol' and a 'TypeRep' via 'Typeable'.
arrayElemParam :: forall s a. (KnownSymbol s, Typeable a) => Param
arrayElemParam :: forall (s :: Symbol) a. (KnownSymbol s, Typeable a) => Param
arrayElemParam = Param -> Param
Param (String -> Text -> Param
S.ArrayElemParam String
name Text
rep)
  where
    rep :: Text
rep = forall a. Typeable a => Text
showTypeRep @a
    name :: String
name = forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s

-- | Create a 'S.FlagParam' from a 'Symbol'.
flagParam :: forall s. (KnownSymbol s) => Param
flagParam :: forall (s :: Symbol). KnownSymbol s => Param
flagParam = Param -> Param
Param (String -> Param
S.FlagParam String
name)
  where
    name :: String
name = forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s

-- | Pretty-print a 'Param'. Used by 'Servant.API.Routes.renderRoute'.
renderParam :: Param -> T.Text
renderParam :: Param -> Text
renderParam (Param Param
param) = case Param
param of
  S.SingleParam String
var Text
typ -> String -> Text
T.pack String
var forall a. Semigroup a => a -> a -> a
<> Text
"=<" forall a. Semigroup a => a -> a -> a
<> Text
typ forall a. Semigroup a => a -> a -> a
<> Text
">"
  S.ArrayElemParam String
var Text
typ -> String -> Text
T.pack String
var forall a. Semigroup a => a -> a -> a
<> Text
"=<[" forall a. Semigroup a => a -> a -> a
<> Text
typ forall a. Semigroup a => a -> a -> a
<> Text
"]>"
  S.FlagParam String
var -> String -> Text
T.pack String
var