-- | -- A DSL for parsing of an HTTP request query parameters. module Scotty.ParamsParser ( Params, run, lookup, param, Param, ) where import BasePrelude hiding (lookup) import Control.Monad.Trans.Class import Control.Monad.Trans.Reader import Data.Text.Lazy (Text) import qualified Web.Scotty.Trans as Scotty import qualified Success.Pure as Success import qualified Data.HashMap.Strict as HashMap import qualified Data.Text.Lazy -- | -- A multiple parameters parser. newtype Params a = Params (ReaderT (HashMap.HashMap Text Text) (Success.Success Text) a) deriving (Functor, Applicative, Alternative, Monad, MonadPlus) run :: Params a -> forall m e. (Scotty.ScottyError e, Monad m) => Scotty.ActionT e m a run (Params (ReaderT success')) = Scotty.params >>= onParams where onParams params = either (Scotty.raise . Scotty.stringError . Data.Text.Lazy.unpack . fromMaybe "") return $ Success.asEither $ success' $ HashMap.fromList params lookup :: Text -> Params Text lookup name = Params $ ReaderT $ \hashMap -> maybe (Success.failure $ "No parameter named" <> name) Success.success $ HashMap.lookup name hashMap -- | -- Given a parameter parser and name attempts to get it. param :: Param a -> Text -> Params a param paramParser name = lookup name >>= onText where onText text = Params $ ReaderT $ const $ either Success.failure Success.success $ paramParser text -- | -- A single parameter parser. type Param a = Text -> Either Text a