snaplet-amqp (empty) → 0.1.2.0
raw patch · 5 files changed
+179/−0 lines, 5 filesdep +amqpdep +basedep +configuratorsetup-changed
Dependencies added: amqp, base, configurator, mtl, network, snap, transformers
Files
- LICENSE +28/−0
- README.org +4/−0
- Setup.hs +2/−0
- snaplet-amqp.cabal +71/−0
- src/Snap/Snaplet/AMQP.hs +74/−0
+ LICENSE view
@@ -0,0 +1,28 @@+Copyright (c) 2014, Parnell Springmeyer+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++* Redistributions of source code must retain the above copyright notice, this+ list of conditions and the following disclaimer.++* Redistributions in binary form must reproduce the above copyright notice,+ this list of conditions and the following disclaimer in the documentation+ and/or other materials provided with the distribution.++* Neither the name of the {organization} nor the names of its+ contributors may be used to endorse or promote products derived from+ this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+
+ README.org view
@@ -0,0 +1,4 @@+snaplet-amqp+============++A snaplet providing a convenience interface to the Haskell AMQP package.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ snaplet-amqp.cabal view
@@ -0,0 +1,71 @@+Name: snaplet-amqp+Version: 0.1.2.0+Synopsis: Snap framework snaplet for the AMQP library+Homepage: https://github.com/ixmatus/snaplet-amqp+License: BSD3+License-file: LICENSE+Author: Parnell Springmeyer+Maintainer: parnell@digitalmentat.com+Copyright: (c) 2014 Parnell Springmeyer+Category: Web+Build-type: Simple+Stability: alpha+Bug-reports: https://github.com/ixmatus/snaplet-amqp/issues+Package-url: http://hackage.haskell.org/package/snaplet-amqp+Tested-with: GHC == 7.6.3+Cabal-version: >=1.14.0++description:+ `snaplet-amqp` is a snaplet for the Snap web framework providing+ convenience functions and state management for the Haskell AMQP+ package.+ .+ Below is an incomplete example.+ .+ @+ import Control.Lens+ import Snap+ import Snap.Snaplet+ import Snap.Snaplet.AMQP++ data App = App+ { _amqp :: Snaplet AmqpState }++ makeLenses ''App++ instance HasAmqpConn (Handler b App) where+ getAmqpConn = with amqp getAmqpConn++ app :: SnapletInit App App+ app = makeSnaplet "app" "An snaplet example application." Nothing $ do+ a <- nestSnaplet "amqp" amqp initAMQP+ addRoutes appRoutes -- Your routes, I haven't defined any here+ return $ App a++Extra-source-files:+ LICENSE+ README.org++Library+ Default-Language: Haskell2010+ HS-Source-Dirs: src+ GHC-Options: -Wall++ Exposed-Modules:+ Snap.Snaplet.AMQP++ Other-Modules:+ Paths_snaplet_amqp++ Build-Depends:+ base >= 4.4 && < 5,+ snap >= 0.13 && < 0.14,+ amqp >= 0.10 && < 0.11,+ transformers >= 0.4 && < 0.5,+ configurator >= 0.3 && < 0.4,+ network >= 2.5 && < 2.6,+ mtl >= 2 && < 3++Source-Repository head+ Type: git+ Location: https://github.com/ixmatus/snaplet-amqp
+ src/Snap/Snaplet/AMQP.hs view
@@ -0,0 +1,74 @@+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TypeFamilies #-}++module Snap.Snaplet.AMQP+ ( initAMQP+ , runAmqp+ , mkAmqpConn+ , AmqpState (..)+ , HasAmqpConn (..)+ ) where++import Control.Monad.State+import Control.Monad.Trans.Reader+import Data.Configurator+import Data.Configurator.Types+import Network.AMQP (Channel, Connection, openChannel,+ openConnection')+import Network.Socket (PortNumber (..))+import Paths_snaplet_amqp+import Snap.Snaplet++-------------------------------------------------------------------------------+type AmqpC = (Connection, Channel)++newtype AmqpState = AmqpState { amqpConn :: AmqpC }++-------------------------------------------------------------------------------+class MonadIO m => HasAmqpConn m where+ getAmqpConn :: m AmqpC++instance HasAmqpConn (Handler b AmqpState) where+ getAmqpConn = gets amqpConn++instance MonadIO m => HasAmqpConn (ReaderT AmqpC m) where+ getAmqpConn = ask++-- | Initialize the AMQP Snaplet.+initAMQP :: SnapletInit b AmqpState+initAMQP = makeSnaplet "persist" description datadir $ do+ c <- mkSnapletAmqpConn+ return $ AmqpState c+ where+ description = "Snaplet for AMQP library"+ datadir = Just $ liftM (++"/resources/amqp") getDataDir++-------------------------------------------------------------------------------+-- | Constructs a connection in a snaplet context.+mkSnapletAmqpConn :: (MonadIO (m b v), MonadSnaplet m) => m b v AmqpC+mkSnapletAmqpConn = do+ conf <- getSnapletUserConfig+ mkAmqpConn conf++-------------------------------------------------------------------------------+-- | Constructs a connect from Config.+mkAmqpConn :: MonadIO m => Config -> m AmqpC+mkAmqpConn conf = do+ host <- liftIO $ require conf "host"+ port <- liftIO $ require conf "port"+ vhost <- liftIO $ require conf "vhost"+ login <- liftIO $ require conf "login"+ pass <- liftIO $ require conf "password"++ conn <- liftIO $ openConnection' host (PortNum port) vhost login pass+ chan <- liftIO $ openChannel conn++ return (conn, chan)++-------------------------------------------------------------------------------+-- | Runs an AMQP action in any monad with a HasAmqpConn instance.+runAmqp :: (HasAmqpConn m) => (AmqpC -> b) -> m b+runAmqp action = getAmqpConn >>= return . action