packages feed

snaplet-postmark (empty) → 0.1.0

raw patch · 4 files changed

+100/−0 lines, 4 filesdep +basedep +configuratordep +mtlsetup-changed

Dependencies added: base, configurator, mtl, postmark, snap, text, transformers

Files

+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ resources/postmark/devel.cfg view
@@ -0,0 +1,1 @@+secret_key = ""
+ snaplet-postmark.cabal view
@@ -0,0 +1,38 @@+name:           snaplet-postmark+version:        0.1.0+synopsis:       Postmark snaplet for the Snap Framework+description:    This snaplet contains support for using the Postmark+                email system with a Snap Framework application.+license:        BSD3+author:         Luke Hoersten+maintainer:     luke@hoersten.org+build-type:     Simple+cabal-version:  >= 1.6+homepage:       https://github.com/LukeHoersten/snaplet-postmark+category:       Web, Snap++data-files:+  resources/postmark/devel.cfg++source-repository head+  type:     git+  location: https://github.com/LukeHoersten/snaplet-postmark++Library+  hs-source-dirs: src++  exposed-modules:+    Snap.Snaplet.Postmark++  build-depends:+    base         >= 4.4     && < 5,+    snap         >= 0.11    && < 0.14,+    text         >= 0.11    && < 0.12,+    configurator >= 0.2     && < 0.3,+    transformers >= 0.3     && < 0.4,+    mtl          >= 2       && < 3,+    postmark     >= 0.0.2   && < 0.2+++  ghc-options: -Wall -fwarn-tabs -funbox-strict-fields+               -fno-warn-orphans -fno-warn-unused-do-bind
+ src/Snap/Snaplet/Postmark.hs view
@@ -0,0 +1,59 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}++module Snap.Snaplet.Postmark where++import           Control.Applicative        ((<$>))+import           Control.Monad              (when)+import           Control.Monad.State        (get)+import           Control.Monad.Trans        (MonadIO, liftIO)+import           Control.Monad.Trans.Writer (WriterT (..), tell)+import qualified Data.Configurator          as C+import           Data.List                  (intercalate)+import           Data.Maybe                 (fromMaybe, isNothing)+import qualified Data.Text                  as T+import           Network.Api.Postmark       (Email (..), PostmarkError,+                                             PostmarkResponse, PostmarkSettings,+                                             Sent, email, emails, postmarkHttps,+                                             request)+import           Snap.Snaplet               (Handler, SnapletInit,+                                             getSnapletUserConfig, makeSnaplet)+++newtype Postmark = Postmark { unPostmark :: PostmarkSettings } deriving Show+++class (MonadIO m, Functor m) => HasPostmark m where+    getPostmark :: m Postmark+++instance HasPostmark (Handler b Postmark) where+    getPostmark = get+++logErr :: MonadIO m => t -> IO (Maybe a) -> WriterT [t] m (Maybe a)+logErr err m = do+  res <- liftIO m+  when (isNothing res) (tell [err])+  return res+++initPostmark :: SnapletInit b Postmark+initPostmark = makeSnaplet "postmark" "Postmark email client" Nothing $ do+  config <- getSnapletUserConfig+  (mscfg, errs) <- runWriterT $ do+    secretKey <- logErr "Must specify Strip secret key" $ C.lookup config "secret_key"+    return $ Postmark <$> (postmarkHttps <$> (T.pack <$> secretKey))+  return $ fromMaybe (error $ intercalate "\n" errs) mscfg+++withPS :: HasPostmark m => (PostmarkSettings -> m a) -> m a+withPS f = unPostmark <$> getPostmark >>= f+++sendEmail :: HasPostmark m => Email -> m (PostmarkResponse PostmarkError Sent)+sendEmail msg = withPS $ liftIO . flip request (email msg)+++sendEmails :: HasPostmark m => [Email] -> m (PostmarkResponse PostmarkError [Sent])+sendEmails msgs = withPS $ liftIO . flip request (emails msgs)