wai-middleware-verbs 0.0.2 → 0.0.3
raw patch · 2 files changed
+56/−52 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Network.Wai.Middleware.Verbs: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Network.Wai.Middleware.Verbs.VerbListenerT r u m)
- Network.Wai.Middleware.Verbs: instance Control.Monad.Trans.Class.MonadTrans (Network.Wai.Middleware.Verbs.VerbListenerT r u)
- Network.Wai.Middleware.Verbs: instance GHC.Base.Functor (Network.Wai.Middleware.Verbs.Verbs u m)
- Network.Wai.Middleware.Verbs: instance GHC.Base.Functor m => GHC.Base.Functor (Network.Wai.Middleware.Verbs.VerbListenerT r u m)
- Network.Wai.Middleware.Verbs: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState (Network.Wai.Middleware.Verbs.Verbs u m r) (Network.Wai.Middleware.Verbs.VerbListenerT r u m)
- Network.Wai.Middleware.Verbs: instance GHC.Base.Monad m => GHC.Base.Applicative (Network.Wai.Middleware.Verbs.VerbListenerT r u m)
- Network.Wai.Middleware.Verbs: instance GHC.Base.Monad m => GHC.Base.Monad (Network.Wai.Middleware.Verbs.VerbListenerT r u m)
- Network.Wai.Middleware.Verbs: instance GHC.Base.Monoid (Network.Wai.Middleware.Verbs.Verbs u m r)
- Network.Wai.Middleware.Verbs: type Respond u r = Request -> Maybe u -> r
+ Network.Wai.Middleware.Verbs: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Network.Wai.Middleware.Verbs.VerbListenerT r e u m)
+ Network.Wai.Middleware.Verbs: instance Control.Monad.Trans.Class.MonadTrans (Network.Wai.Middleware.Verbs.VerbListenerT r e u)
+ Network.Wai.Middleware.Verbs: instance GHC.Base.Functor (Network.Wai.Middleware.Verbs.Verbs e u m)
+ Network.Wai.Middleware.Verbs: instance GHC.Base.Functor m => GHC.Base.Functor (Network.Wai.Middleware.Verbs.VerbListenerT r e u m)
+ Network.Wai.Middleware.Verbs: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState (Network.Wai.Middleware.Verbs.Verbs e u m r) (Network.Wai.Middleware.Verbs.VerbListenerT r e u m)
+ Network.Wai.Middleware.Verbs: instance GHC.Base.Monad m => GHC.Base.Applicative (Network.Wai.Middleware.Verbs.VerbListenerT r e u m)
+ Network.Wai.Middleware.Verbs: instance GHC.Base.Monad m => GHC.Base.Monad (Network.Wai.Middleware.Verbs.VerbListenerT r e u m)
+ Network.Wai.Middleware.Verbs: instance GHC.Base.Monoid (Network.Wai.Middleware.Verbs.Verbs e u m r)
+ Network.Wai.Middleware.Verbs: type RespondUpload e u r = Request -> Either (Maybe e) u -> r
- Network.Wai.Middleware.Verbs: VerbListenerT :: StateT (Verbs u m r) m a -> VerbListenerT r u m a
+ Network.Wai.Middleware.Verbs: VerbListenerT :: StateT (Verbs e u m r) m a -> VerbListenerT r e u m a
- Network.Wai.Middleware.Verbs: Verbs :: Map Verb (ResponseSpec u m r) -> Verbs u m r
+ Network.Wai.Middleware.Verbs: Verbs :: Map Verb (ResponseSpec e u m r) -> Verbs e u m r
- Network.Wai.Middleware.Verbs: [runVerbListenerT] :: VerbListenerT r u m a -> StateT (Verbs u m r) m a
+ Network.Wai.Middleware.Verbs: [runVerbListenerT] :: VerbListenerT r e u m a -> StateT (Verbs e u m r) m a
- Network.Wai.Middleware.Verbs: [unVerbs] :: Verbs u m r -> Map Verb (ResponseSpec u m r)
+ Network.Wai.Middleware.Verbs: [unVerbs] :: Verbs e u m r -> Map Verb (ResponseSpec e u m r)
- Network.Wai.Middleware.Verbs: delete :: (Monad m) => r -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: delete :: (Monad m) => r -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: deleteReq :: (Monad m) => (Request -> r) -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: deleteReq :: (Monad m) => (Request -> r) -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: execVerbListenerT :: Monad m => VerbListenerT r u m a -> m (Verbs u m r)
+ Network.Wai.Middleware.Verbs: execVerbListenerT :: Monad m => VerbListenerT r e u m a -> m (Verbs e u m r)
- Network.Wai.Middleware.Verbs: get :: (Monad m) => r -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: get :: (Monad m) => r -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: getReq :: (Monad m) => (Request -> r) -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: getReq :: (Monad m) => (Request -> r) -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: lookupVerb :: Verb -> Request -> Verbs u m r -> Maybe (m (Maybe u), Maybe u -> r)
+ Network.Wai.Middleware.Verbs: lookupVerb :: Verb -> Request -> Verbs e u m r -> Maybe (ExceptT (Maybe e) m u, Either (Maybe e) u -> r)
- Network.Wai.Middleware.Verbs: lookupVerbM :: Monad m => Verb -> Request -> Verbs u m r -> m (Maybe r)
+ Network.Wai.Middleware.Verbs: lookupVerbM :: Monad m => Verb -> Request -> Verbs e u m r -> m (Maybe r)
- Network.Wai.Middleware.Verbs: newtype VerbListenerT r u m a
+ Network.Wai.Middleware.Verbs: newtype VerbListenerT r e u m a
- Network.Wai.Middleware.Verbs: newtype Verbs u m r
+ Network.Wai.Middleware.Verbs: newtype Verbs e u m r
- Network.Wai.Middleware.Verbs: post :: (Monad m, MonadIO m) => HandleUpload m u -> (Maybe u -> r) -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: post :: (Monad m, MonadIO m) => HandleUpload e m u -> (Either (Maybe e) u -> r) -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: postReq :: (Monad m, MonadIO m) => HandleUpload m u -> (Request -> Maybe u -> r) -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: postReq :: (Monad m, MonadIO m) => HandleUpload e m u -> RespondUpload e u r -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: put :: (Monad m, MonadIO m) => HandleUpload m u -> (Maybe u -> r) -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: put :: (Monad m, MonadIO m) => HandleUpload e m u -> (Either (Maybe e) u -> r) -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: putReq :: (Monad m, MonadIO m) => HandleUpload m u -> (Request -> Maybe u -> r) -> VerbListenerT r u m ()
+ Network.Wai.Middleware.Verbs: putReq :: (Monad m, MonadIO m) => HandleUpload e m u -> RespondUpload e u r -> VerbListenerT r e u m ()
- Network.Wai.Middleware.Verbs: supplyReq :: Request -> Map Verb (ResponseSpec u m r) -> Map Verb (m (Maybe u), Maybe u -> r)
+ Network.Wai.Middleware.Verbs: supplyReq :: Request -> Map Verb (ResponseSpec e u m r) -> Map Verb (ExceptT (Maybe e) m u, Either (Maybe e) u -> r)
- Network.Wai.Middleware.Verbs: type HandleUpload m u = Request -> m (Maybe u)
+ Network.Wai.Middleware.Verbs: type HandleUpload e m u = Request -> ExceptT (Maybe e) m u
- Network.Wai.Middleware.Verbs: type ResponseSpec u m r = (HandleUpload m u, Respond u r)
+ Network.Wai.Middleware.Verbs: type ResponseSpec e u m r = (HandleUpload e m u, RespondUpload e u r)
- Network.Wai.Middleware.Verbs: verbsToMiddleware :: MonadIO m => VerbListenerT (MiddlewareT m) u m () -> MiddlewareT m
+ Network.Wai.Middleware.Verbs: verbsToMiddleware :: MonadIO m => VerbListenerT (MiddlewareT m) e u m () -> MiddlewareT m
Files
src/Network/Wai/Middleware/Verbs.hs view
@@ -10,7 +10,7 @@ , Verb , getVerb , HandleUpload- , Respond+ , RespondUpload , ResponseSpec , supplyReq , lookupVerb@@ -36,21 +36,26 @@ import Data.Bifunctor import Data.Map (Map) import qualified Data.Map as Map-import Data.Maybe (fromMaybe) import Data.Monoid import Control.Monad.Trans import Control.Monad.Trans.Maybe import Control.Monad.State hiding (get, put) import qualified Control.Monad.State as S-import Control.Error.Util+import Control.Monad.Except+import Control.Error -- * Verb Map -newtype Verbs u m r = Verbs- { unVerbs :: Map Verb (ResponseSpec u m r)+type HandleUpload e m u = Request -> ExceptT (Maybe e) m u+type RespondUpload e u r = Request -> Either (Maybe e) u -> r+type ResponseSpec e u m r = (HandleUpload e m u, RespondUpload e u r)++newtype Verbs e u m r = Verbs+ { unVerbs :: Map Verb (ResponseSpec e u m r) } deriving (Monoid) + type Verb = StdMethod getVerb :: Request -> Verb@@ -63,55 +68,53 @@ | x == methodDelete = Just DELETE | otherwise = Nothing -type HandleUpload m u = Request -> m (Maybe u)-type Respond u r = Request -> Maybe u -> r-type ResponseSpec u m r = (HandleUpload m u, Respond u r)-- supplyReq :: Request- -> Map Verb (ResponseSpec u m r)- -> Map Verb (m (Maybe u), Maybe u -> r)+ -> Map Verb (ResponseSpec e u m r)+ -> Map Verb (ExceptT (Maybe e) m u, Either (Maybe e) u -> r) supplyReq req xs = bimap ($ req) ($ req) <$> xs -instance Functor (Verbs u m) where+instance Functor (Verbs e u m) where fmap f (Verbs xs) = Verbs $ (second (f .*)) <$> xs -- | Take a verb map and a request, and return the lookup after providing the request -- (for upload cases).-lookupVerb :: Verb -> Request -> Verbs u m r -> Maybe (m (Maybe u), Maybe u -> r)+lookupVerb :: Verb+ -> Request+ -> Verbs e u m r+ -> Maybe (ExceptT (Maybe e) m u, Either (Maybe e) u -> r) lookupVerb v req vmap = Map.lookup v $ supplyReq req $ unVerbs vmap -lookupVerbM :: Monad m => Verb -> Request -> Verbs u m r -> m (Maybe r)+lookupVerbM :: Monad m => Verb -> Request -> Verbs e u m r -> m (Maybe r) lookupVerbM v req vmap = runMaybeT $ do- (mUM, mUtoResult) <- hoistMaybe $ lookupVerb v req vmap- mU <- lift mUM- return $ mUtoResult mU+ (uploadT, result) <- hoistMaybe $ lookupVerb v req vmap+ eUpload <- lift $ runExceptT uploadT+ return $ result eUpload -- * Verb Writer -newtype VerbListenerT r u m a =- VerbListenerT { runVerbListenerT :: StateT (Verbs u m r) m a }+newtype VerbListenerT r e u m a =+ VerbListenerT { runVerbListenerT :: StateT (Verbs e u m r) m a } deriving ( Functor , Applicative , Monad- , MonadState (Verbs u m r)+ , MonadState (Verbs e u m r) , MonadIO ) -execVerbListenerT :: Monad m => VerbListenerT r u m a -> m (Verbs u m r)+execVerbListenerT :: Monad m => VerbListenerT r e u m a -> m (Verbs e u m r) execVerbListenerT xs = execStateT (runVerbListenerT xs) mempty -instance MonadTrans (VerbListenerT r u) where+instance MonadTrans (VerbListenerT r e u) where lift ma = VerbListenerT $ lift ma verbsToMiddleware :: MonadIO m =>- VerbListenerT (MiddlewareT m) u m ()+ VerbListenerT (MiddlewareT m) e u m () -> MiddlewareT m verbsToMiddleware vl app req respond = do let v = getVerb req@@ -126,65 +129,66 @@ -- | For simple @GET@ responses get :: ( Monad m- ) => r -> VerbListenerT r u m ()-get r = tell' $ Verbs $ Map.singleton GET ( const $ return Nothing- , const $ const r- )+ ) => r -> VerbListenerT r e u m ()+get r = tell' $ Verbs $ Map.singleton GET ( const $ throwError Nothing+ , const $ const r+ ) -- | Inspect the @Request@ object supplied by WAI getReq :: ( Monad m- ) => (Request -> r) -> VerbListenerT r u m ()-getReq r = tell' $ Verbs $ Map.singleton GET ( const $ return Nothing- , const . r)+ ) => (Request -> r) -> VerbListenerT r e u m ()+getReq r = tell' $ Verbs $ Map.singleton GET ( const $ throwError Nothing+ , const . r+ ) -- | For simple @POST@ responses post :: ( Monad m , MonadIO m- ) => HandleUpload m u -> (Maybe u -> r) -> VerbListenerT r u m ()+ ) => HandleUpload e m u -> (Either (Maybe e) u -> r) -> VerbListenerT r e u m () post handle r = tell' $ Verbs $ Map.singleton POST ( handle- , const r- )+ , const r+ ) -- | Inspect the @Request@ object supplied by WAI postReq :: ( Monad m , MonadIO m- ) => HandleUpload m u -> (Request -> Maybe u -> r) -> VerbListenerT r u m ()+ ) => HandleUpload e m u -> RespondUpload e u r -> VerbListenerT r e u m () postReq handle r = tell' $ Verbs $ Map.singleton POST ( handle- , r- )+ , r+ ) -- | For simple @PUT@ responses put :: ( Monad m , MonadIO m- ) => HandleUpload m u -> (Maybe u -> r) -> VerbListenerT r u m ()+ ) => HandleUpload e m u -> (Either (Maybe e) u -> r) -> VerbListenerT r e u m () put handle r = tell' $ Verbs $ Map.singleton PUT ( handle- , const r- )+ , const r+ ) -- | Inspect the @Request@ object supplied by WAI putReq :: ( Monad m , MonadIO m- ) => HandleUpload m u -> (Request -> Maybe u -> r) -> VerbListenerT r u m ()+ ) => HandleUpload e m u -> RespondUpload e u r -> VerbListenerT r e u m () putReq handle r = tell' $ Verbs $ Map.singleton PUT ( handle- , r- )+ , r+ ) -- | For simple @DELETE@ responses delete :: ( Monad m- ) => r -> VerbListenerT r u m ()-delete r = tell' $ Verbs $ Map.singleton DELETE ( const $ return Nothing- , const $ const r- )+ ) => r -> VerbListenerT r e u m ()+delete r = tell' $ Verbs $ Map.singleton DELETE ( const $ throwError Nothing+ , const $ const r+ ) -- | Inspect the @Request@ object supplied by WAI deleteReq :: ( Monad m- ) => (Request -> r) -> VerbListenerT r u m ()-deleteReq r = tell' $ Verbs $ Map.singleton DELETE ( const $ return Nothing- , const . r- )+ ) => (Request -> r) -> VerbListenerT r e u m ()+deleteReq r = tell' $ Verbs $ Map.singleton DELETE ( const $ throwError Nothing+ , const . r+ ) tell' :: (Monoid w, MonadState w m) => w -> m ()
wai-middleware-verbs.cabal view
@@ -1,5 +1,5 @@ Name: wai-middleware-verbs-Version: 0.0.2+Version: 0.0.3 Author: Athan Clark <athan.clark@gmail.com> Maintainer: Athan Clark <athan.clark@gmail.com> License: BSD3