{-# LANGUAGE DataKinds #-}{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE ScopedTypeVariables #-}{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE TypeOperators #-}{-# OPTIONS_GHC -Wno-redundant-constraints #-}moduleServant.API.Modifiers(-- * Required / optional argumentRequired ,Optional ,FoldRequired ,FoldRequired' ,-- * Lenient / strict parsingLenient ,Strict ,FoldLenient ,FoldLenient' ,-- * UtilitiesRequiredArgument ,foldRequiredArgument ,unfoldRequiredArgument ,RequestArgument ,unfoldRequestArgument ,)whereimportData.Kind(Type)importData.Proxy(Proxy(..))importData.Singletons.Bool(SBool(..),SBoolI(..))importData.Text(Text)importData.Type.Bool(If)-- | Required argument. Not wrapped.dataRequired -- | Optional argument. Wrapped in 'Maybe'.dataOptional -- | Fold modifier list to decide whether argument is required.---- >>> :kind! FoldRequired '[Required, Description "something"]-- FoldRequired '[Required, Description "something"] :: Bool-- = 'True---- >>> :kind! FoldRequired '[Required, Optional]-- FoldRequired '[Required, Optional] :: Bool-- = 'False---- >>> :kind! FoldRequired '[]-- FoldRequired '[] :: Bool-- = 'False--typeFoldRequired mods =FoldRequired' 'Falsemods -- | Implementation of 'FoldRequired'.typefamilyFoldRequired' (acc ::Bool)(mods ::[Type])::BoolwhereFoldRequired' acc '[]=acc FoldRequired' acc (Required ':mods )=FoldRequired' 'Truemods FoldRequired' acc (Optional ':mods )=FoldRequired' 'Falsemods FoldRequired' acc (mod ':mods )=FoldRequired' acc mods -- | Leniently parsed argument, i.e. parsing never fail. Wrapped in @'Either' 'Text'@.dataLenient -- | Strictly parsed argument. Not wrapped.dataStrict -- | Fold modifier list to decide whether argument should be parsed strictly or leniently.---- >>> :kind! FoldLenient '[]-- FoldLenient '[] :: Bool-- = 'False--typeFoldLenient mods =FoldLenient' 'Falsemods -- | Implementation of 'FoldLenient'.typefamilyFoldLenient' (acc ::Bool)(mods ::[Type])::BoolwhereFoldLenient' acc '[]=acc FoldLenient' acc (Lenient ':mods )=FoldLenient' 'Truemods FoldLenient' acc (Strict ':mods )=FoldLenient' 'Falsemods FoldLenient' acc (mod ':mods )=FoldLenient' acc mods -- | Helper type alias.---- * 'Required' ↦ @a@---- * 'Optional' ↦ @'Maybe' a@--typeRequiredArgument mods a =If(FoldRequired mods )a (Maybea )-- | Fold a 'RequiredAgument' into a valuefoldRequiredArgument ::forallmods a r .(SBoolI(FoldRequired mods ))=>Proxymods ->(a ->r )-- ^ 'Required'->(Maybea ->r )-- ^ 'Optional'->RequiredArgument mods a ->r foldRequiredArgument :: forall (mods :: [Type]) a r. SBoolI (FoldRequired mods) => Proxy mods -> (a -> r) -> (Maybe a -> r) -> RequiredArgument mods a -> r foldRequiredArgument Proxy mods _a -> r f Maybe a -> r g RequiredArgument mods a mx =case(SBool (FoldRequired mods) forall (b :: Bool). SBoolI b => SBool b sbool::SBool(FoldRequired mods ),RequiredArgument mods a mx )of(SBool (FoldRequired mods) STrue,RequiredArgument mods a x )->a -> r f a RequiredArgument mods a x (SBool (FoldRequired mods) SFalse,RequiredArgument mods a x )->Maybe a -> r g Maybe a RequiredArgument mods a x -- | Unfold a value into a 'RequiredArgument'.unfoldRequiredArgument ::forallmods m a .(Monadm ,SBoolI(FoldRequired mods ),SBoolI(FoldLenient mods ))=>Proxymods ->m (RequiredArgument mods a )-- ^ error when argument is required->(Text->m (RequiredArgument mods a ))-- ^ error when argument is strictly parsed->Maybe(EitherTexta )-- ^ value->m (RequiredArgument mods a )unfoldRequiredArgument :: forall (mods :: [Type]) (m :: Type -> Type) a. (Monad m, SBoolI (FoldRequired mods), SBoolI (FoldLenient mods)) => Proxy mods -> m (RequiredArgument mods a) -> (Text -> m (RequiredArgument mods a)) -> Maybe (Either Text a) -> m (RequiredArgument mods a) unfoldRequiredArgument Proxy mods _m (RequiredArgument mods a) errReq Text -> m (RequiredArgument mods a) errSt Maybe (Either Text a) mex =case(SBool (FoldRequired mods) forall (b :: Bool). SBoolI b => SBool b sbool::SBool(FoldRequired mods ),Maybe (Either Text a) mex )of(SBool (FoldRequired mods) STrue,Maybe (Either Text a) Nothing)->m (RequiredArgument mods a) errReq (SBool (FoldRequired mods) SFalse,Maybe (Either Text a) Nothing)->Maybe a -> m (Maybe a) forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a returnMaybe a forall a. Maybe a Nothing(SBool (FoldRequired mods) STrue,JustEither Text a ex )->(Text -> m a) -> (a -> m a) -> Either Text a -> m a forall a c b. (a -> c) -> (b -> c) -> Either a b -> c eitherText -> m a Text -> m (RequiredArgument mods a) errSt a -> m a forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a returnEither Text a ex (SBool (FoldRequired mods) SFalse,JustEither Text a ex )->(Text -> m (Maybe a)) -> (a -> m (Maybe a)) -> Either Text a -> m (Maybe a) forall a c b. (a -> c) -> (b -> c) -> Either a b -> c eitherText -> m (Maybe a) Text -> m (RequiredArgument mods a) errSt (Maybe a -> m (Maybe a) forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a return(Maybe a -> m (Maybe a)) -> (a -> Maybe a) -> a -> m (Maybe a) forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> Maybe a forall a. a -> Maybe a Just)Either Text a ex -- | Helper type alias.---- By default argument is 'Optional' and 'Strict'.---- * 'Required', 'Strict' ↦ @a@---- * 'Required', 'Lenient' ↦ @'Either' 'Text' a@---- * 'Optional', 'Strict' ↦ @'Maybe' a@---- * 'Optional', 'Lenient' ↦ @'Maybe' ('Either' 'Text' a)@--typeRequestArgument mods a =If(FoldRequired mods )(If(FoldLenient mods )(EitherTexta )a )(Maybe(If(FoldLenient mods )(EitherTexta )a ))-- | Unfold a value into a 'RequestArgument'.unfoldRequestArgument ::forallmods m a .(Monadm ,SBoolI(FoldRequired mods ),SBoolI(FoldLenient mods ))=>Proxymods ->m (RequestArgument mods a )-- ^ error when argument is required->(Text->m (RequestArgument mods a ))-- ^ error when argument is strictly parsed->Maybe(EitherTexta )-- ^ value->m (RequestArgument mods a )unfoldRequestArgument :: forall (mods :: [Type]) (m :: Type -> Type) a. (Monad m, SBoolI (FoldRequired mods), SBoolI (FoldLenient mods)) => Proxy mods -> m (RequestArgument mods a) -> (Text -> m (RequestArgument mods a)) -> Maybe (Either Text a) -> m (RequestArgument mods a) unfoldRequestArgument Proxy mods _m (RequestArgument mods a) errReq Text -> m (RequestArgument mods a) errSt Maybe (Either Text a) mex =case(SBool (FoldRequired mods) forall (b :: Bool). SBoolI b => SBool b sbool::SBool(FoldRequired mods ),Maybe (Either Text a) mex ,SBool (FoldLenient mods) forall (b :: Bool). SBoolI b => SBool b sbool::SBool(FoldLenient mods ))of(SBool (FoldRequired mods) STrue,Maybe (Either Text a) Nothing,SBool (FoldLenient mods) _)->m (RequestArgument mods a) errReq (SBool (FoldRequired mods) SFalse,Maybe (Either Text a) Nothing,SBool (FoldLenient mods) _)->Maybe (If (FoldLenient mods) (Either Text a) a) -> m (Maybe (If (FoldLenient mods) (Either Text a) a)) forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a returnMaybe (If (FoldLenient mods) (Either Text a) a) forall a. Maybe a Nothing(SBool (FoldRequired mods) STrue,JustEither Text a ex ,SBool (FoldLenient mods) STrue)->Either Text a -> m (Either Text a) forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a returnEither Text a ex (SBool (FoldRequired mods) STrue,JustEither Text a ex ,SBool (FoldLenient mods) SFalse)->(Text -> m a) -> (a -> m a) -> Either Text a -> m a forall a c b. (a -> c) -> (b -> c) -> Either a b -> c eitherText -> m a Text -> m (RequestArgument mods a) errSt a -> m a forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a returnEither Text a ex (SBool (FoldRequired mods) SFalse,JustEither Text a ex ,SBool (FoldLenient mods) STrue)->Maybe (Either Text a) -> m (Maybe (Either Text a)) forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a return(Either Text a -> Maybe (Either Text a) forall a. a -> Maybe a JustEither Text a ex )(SBool (FoldRequired mods) SFalse,JustEither Text a ex ,SBool (FoldLenient mods) SFalse)->(Text -> m (Maybe a)) -> (a -> m (Maybe a)) -> Either Text a -> m (Maybe a) forall a c b. (a -> c) -> (b -> c) -> Either a b -> c eitherText -> m (Maybe a) Text -> m (RequestArgument mods a) errSt (Maybe a -> m (Maybe a) forall a. a -> m a forall (m :: Type -> Type) a. Monad m => a -> m a return(Maybe a -> m (Maybe a)) -> (a -> Maybe a) -> a -> m (Maybe a) forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> Maybe a forall a. a -> Maybe a Just)Either Text a ex -- $setup-- >>> import Servant.API