module Strelka.Core.RequestParser where
import Strelka.Core.Prelude
import Strelka.Core.Model
newtype RequestParser m a =
RequestParser (ReaderT Request (StateT [PathSegment] (ExceptT Text m)) a)
deriving (Functor, Applicative, Monad, Alternative, MonadPlus, MonadError Text)
instance MonadIO m => MonadIO (RequestParser m) where
liftIO io =
RequestParser ((lift . lift . ExceptT . liftM (either (Left . fromString . show) Right) . liftIO . trySE) io)
where
trySE :: IO a -> IO (Either SomeException a)
trySE =
Strelka.Core.Prelude.try
instance MonadTrans RequestParser where
lift m =
RequestParser (lift (lift (lift m)))
run :: RequestParser m a -> Request -> [PathSegment] -> m (Either Text (a, [PathSegment]))
run (RequestParser impl) request segments =
runExceptT (runStateT (runReaderT impl request) segments)