module Scotty.QueryParser
(
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
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
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
type Param a =
Text -> Either Text a