serverless-haskell 0.3.1 → 0.4.0
raw patch · 7 files changed
+71/−28 lines, 7 files
Files
- serverless-haskell.cabal +5/−3
- src/AWSLambda.hs +6/−0
- src/AWSLambda/Events/Embedded.hs +0/−24
- src/Data/Aeson/Embedded.hs +31/−0
- test/AWSLambda/Events/SNSEventSpec.hs +1/−1
- test/Data/Aeson/EmbeddedSpec.hs +15/−0
- test/Data/Aeson/TestUtil.hs +13/−0
serverless-haskell.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: ce5c80cf11a767160659f257fa8a624d46249ad9777655b9054afe79c3875bcb+-- hash: 646a2ccc127e873e3a4a1e9fe20394f9e59efa372a3557893a9c476069b0f1ba name: serverless-haskell-version: 0.3.1+version: 0.4.0 synopsis: Deploying Haskell code onto AWS Lambda using Serverless description: Utilities to help process the events from AWS Lambda when deployed with the serverless-haskell plugin. category: AWS, Cloud, Network@@ -44,7 +44,6 @@ exposed-modules: AWSLambda AWSLambda.Events- AWSLambda.Events.Embedded AWSLambda.Events.KinesisEvent AWSLambda.Events.Records AWSLambda.Events.S3Event@@ -52,6 +51,7 @@ AWSLambda.Handler AWSLambda.Orphans Data.Aeson.Alternative+ Data.Aeson.Embedded other-modules: Paths_serverless_haskell default-language: Haskell2010@@ -83,5 +83,7 @@ AWSLambda.Events.S3EventSpec AWSLambda.Events.SNSEventSpec Data.Aeson.AlternativeSpec+ Data.Aeson.EmbeddedSpec+ Data.Aeson.TestUtil Paths_serverless_haskell default-language: Haskell2010
src/AWSLambda.hs view
@@ -74,6 +74,12 @@ > haskell: > extraLibraries: > - libpcre.so.3++* To force using Stack's Docker image, set @docker@ key to @true@.++ > custom:+ > haskell:+ > docker: true -} module AWSLambda ( Handler.lambdaMain
− src/AWSLambda/Events/Embedded.hs
@@ -1,24 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TemplateHaskell #-}--{-|-Module: AWSLambda.Events.Embedded-Description: Type for a JSON value embedded within a JSON string value--}-module AWSLambda.Events.Embedded where--import Control.Lens.TH-import Data.Aeson-import Data.Text.Encoding (encodeUtf8)---- | Type for a JSON value embedded within a JSON string value-newtype Embedded a = Embedded { _unEmbed :: a } deriving (Eq, Show)--instance FromJSON a =>- FromJSON (Embedded a) where- parseJSON =- withText "Embedded JSON" $- fmap Embedded . either fail pure . eitherDecodeStrict . encodeUtf8--$(makeLenses ''Embedded)
+ src/Data/Aeson/Embedded.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TemplateHaskell #-}++{-|+Module: Data.Aeson.Embedded+Description: Type for a JSON value embedded within a JSON string value+-}+module Data.Aeson.Embedded where++import Control.Lens.TH+import Data.Aeson+import Data.Text.Lazy (Text)+import Data.Text.Lazy.Encoding (decodeUtf8, encodeUtf8)++-- | Type for a JSON value embedded within a JSON string value+newtype Embedded a = Embedded { _unEmbed :: a } deriving (Eq, Show)++instance FromJSON a =>+ FromJSON (Embedded a) where+ parseJSON v =+ fmap Embedded . either fail pure . eitherDecode . encodeUtf8 =<< parseJSON v++instance ToJSON a => ToJSON (Embedded a) where+ toJSON = toJSON . embed+ toEncoding = toEncoding . embed++embed :: ToJSON a => Embedded a -> Text+embed = decodeUtf8 . encode . _unEmbed++$(makeLenses ''Embedded)
test/AWSLambda/Events/SNSEventSpec.hs view
@@ -3,12 +3,12 @@ module AWSLambda.Events.SNSEventSpec where -import AWSLambda.Events.Embedded import AWSLambda.Events.Records import AWSLambda.Events.S3Event import AWSLambda.Events.SNSEvent import Data.Aeson+import Data.Aeson.Embedded import Data.ByteString.Lazy (ByteString) import qualified Data.HashMap.Strict as HashMap import Data.Text (Text)
+ test/Data/Aeson/EmbeddedSpec.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE OverloadedStrings #-}+module Data.Aeson.EmbeddedSpec where++import Data.Aeson+import Data.Aeson.Embedded+import Data.Aeson.TestUtil++import Test.Hspec++spec :: Spec+spec = describe "Embedded" $ do+ testEncodeDecode "array" "\"[1,2,3]\"" $ Embedded [1::Int, 2, 3]+ testEncodeDecode "string" "\"\\\"foo\\\"\"" $ Embedded ("foo"::String)+ testEncodeDecode "object" "\"{\\\"a\\\":42,\\\"b\\\":true}\"" $ Embedded $ object ["a" .= (42::Int), "b" .= True]+ testEncodeDecode "in field" "{\"a\":\"[1,2,3]\"}" $ object ["a" .= Embedded [1::Int, 2, 3]]
+ test/Data/Aeson/TestUtil.hs view
@@ -0,0 +1,13 @@+module Data.Aeson.TestUtil where++import Data.Aeson+import Data.ByteString.Lazy (ByteString)++import Test.Hspec++testEncodeDecode :: (FromJSON a, ToJSON a, Show a, Eq a) => String -> ByteString -> a -> Spec+testEncodeDecode description bytestring value = describe description $ do+ it "decodes" $+ decode bytestring `shouldBe` Just value+ it "encodes" $+ encode value `shouldBe` bytestring