{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE EmptyDataDecls #-}
module Servant.Named (NamedQueryParam, OptionalQueryParam, NamedQueryParams,
NamedQueryFlag, NamedQueryParam') where
import Servant.API
import Servant.API.Modifiers
import Data.Proxy
import GHC.TypeLits
import Data.Functor.Identity
import Data.Maybe
import Named
data NamedQueryParam' (mods :: [*]) (sym :: Symbol) (a :: *)
unarg :: NamedF f a name -> f a
unarg :: NamedF f a name -> f a
unarg (ArgF f a
a) = f a
a
type family UnNameParam x where
UnNameParam (NamedQueryParams sym a) = QueryParams sym a
UnNameParam (NamedQueryParam' mods sym a) = QueryParam' mods sym a
UnNameParam (NamedQueryFlag sym) = QueryFlag sym
instance (KnownSymbol sym, ToHttpApiData v, HasLink sub,
SBoolI (FoldRequired mods))
=> HasLink (NamedQueryParam' mods sym v :> sub)
where
type MkLink (NamedQueryParam' mods sym v :> sub) a =
If (FoldRequired mods) (sym :! v) (sym :? v) -> MkLink sub a
toLink :: (Link -> a)
-> Proxy (NamedQueryParam' mods sym v :> sub)
-> Link
-> MkLink (NamedQueryParam' mods sym v :> sub) a
toLink Link -> a
toA Proxy (NamedQueryParam' mods sym v :> sub)
_ Link
l If (FoldRequired mods) (sym :! v) (sym :? v)
qparam =
(Link -> a)
-> Proxy (QueryParam' mods sym v :> sub)
-> Link
-> MkLink (QueryParam' mods sym v :> sub) a
forall k (endpoint :: k) a.
HasLink endpoint =>
(Link -> a) -> Proxy endpoint -> Link -> MkLink endpoint a
toLink Link -> a
toA (Proxy (QueryParam' mods sym v :> sub)
forall k (t :: k). Proxy t
Proxy :: Proxy (QueryParam' mods sym v :> sub)) Link
l (If (FoldRequired mods) v (Maybe v) -> MkLink sub a)
-> If (FoldRequired mods) v (Maybe v) -> MkLink sub a
forall a b. (a -> b) -> a -> b
$
case SBool (FoldRequired mods)
forall (b :: Bool). SBoolI b => SBool b
sbool :: SBool (FoldRequired mods) of
SBool (FoldRequired mods)
STrue -> Identity v -> v
forall a. Identity a -> a
runIdentity ((sym :! v) -> Identity v
forall (f :: * -> *) a (name :: Symbol). NamedF f a name -> f a
unarg If (FoldRequired mods) (sym :! v) (sym :? v)
sym :! v
qparam)
SBool (FoldRequired mods)
SFalse -> (sym :? v) -> Maybe v
forall (f :: * -> *) a (name :: Symbol). NamedF f a name -> f a
unarg If (FoldRequired mods) (sym :! v) (sym :? v)
sym :? v
qparam
type OptionalQueryParam = NamedQueryParam' [Optional, Strict]
type NamedQueryParam = NamedQueryParam' [Required, Strict]
data NamedQueryParams (sym :: Symbol) (a :: *)
instance (KnownSymbol sym, ToHttpApiData v, HasLink sub)
=> HasLink (NamedQueryParams sym v :> sub)
where
type MkLink (NamedQueryParams sym v :> sub) a = sym :? [v] -> MkLink sub a
toLink :: (Link -> a)
-> Proxy (NamedQueryParams sym v :> sub)
-> Link
-> MkLink (NamedQueryParams sym v :> sub) a
toLink Link -> a
toA Proxy (NamedQueryParams sym v :> sub)
_ Link
l (ArgF Maybe [v]
params) =
(Link -> a)
-> Proxy (QueryParams sym v :> sub)
-> Link
-> MkLink (QueryParams sym v :> sub) a
forall k (endpoint :: k) a.
HasLink endpoint =>
(Link -> a) -> Proxy endpoint -> Link -> MkLink endpoint a
toLink Link -> a
toA (Proxy (QueryParams sym v :> sub)
forall k (t :: k). Proxy t
Proxy :: Proxy (QueryParams sym v :> sub)) Link
l ([v] -> MkLink sub a) -> [v] -> MkLink sub a
forall a b. (a -> b) -> a -> b
$
[v] -> Maybe [v] -> [v]
forall a. a -> Maybe a -> a
fromMaybe [] Maybe [v]
params
data NamedQueryFlag (sym :: Symbol)
instance (KnownSymbol sym, HasLink sub)
=> HasLink (NamedQueryFlag sym :> sub)
where
type MkLink (NamedQueryFlag sym :> sub) a =
(sym :? Bool) -> MkLink sub a
toLink :: (Link -> a)
-> Proxy (NamedQueryFlag sym :> sub)
-> Link
-> MkLink (NamedQueryFlag sym :> sub) a
toLink Link -> a
toA Proxy (NamedQueryFlag sym :> sub)
_ Link
l (ArgF Maybe Bool
qparam) =
(Link -> a)
-> Proxy (QueryFlag sym :> sub)
-> Link
-> MkLink (QueryFlag sym :> sub) a
forall k (endpoint :: k) a.
HasLink endpoint =>
(Link -> a) -> Proxy endpoint -> Link -> MkLink endpoint a
toLink Link -> a
toA (Proxy (QueryFlag sym :> sub)
forall k (t :: k). Proxy t
Proxy :: Proxy (QueryFlag sym :> sub)) Link
l (Bool -> MkLink sub a) -> Bool -> MkLink sub a
forall a b. (a -> b) -> a -> b
$
Bool -> Maybe Bool -> Bool
forall a. a -> Maybe a -> a
fromMaybe Bool
False Maybe Bool
qparam