packages feed

amazonka-core 0.0.1 → 0.0.2

raw patch · 18 files changed

+186/−100 lines, 18 filesdep ~lensPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: lens

API changes (from Hackage documentation)

- Network.AWS.Data: match :: Text -> a -> Parser a
- Network.AWS.Error: JSONError :: Maybe Text -> Text -> JSONError
- Network.AWS.Error: RESTError :: RESTMessage -> Text -> RESTError
- Network.AWS.Error: RESTMessage :: !ErrorType -> Text -> Text -> RESTMessage
- Network.AWS.Error: _errError :: RESTError -> RESTMessage
- Network.AWS.Error: _errMessage :: JSONError -> Text
- Network.AWS.Error: _errRequestId :: RESTError -> Text
- Network.AWS.Error: _errType :: JSONError -> Maybe Text
- Network.AWS.Error: _msgCode :: RESTMessage -> Text
- Network.AWS.Error: _msgRESTMessage :: RESTMessage -> Text
- Network.AWS.Error: _msgType :: RESTMessage -> !ErrorType
- Network.AWS.Error: data RESTMessage
- Network.AWS.Error: errError :: Lens' RESTError RESTMessage
- Network.AWS.Error: errMessage :: Lens' JSONError Text
- Network.AWS.Error: errRequestId :: Lens' RESTError Text
- Network.AWS.Error: errType :: Lens' JSONError (Maybe Text)
- Network.AWS.Error: instance Constructor C1_0RESTMessage
- Network.AWS.Error: instance Datatype D1RESTMessage
- Network.AWS.Error: instance Eq RESTMessage
- Network.AWS.Error: instance FromXML RESTMessage
- Network.AWS.Error: instance Generic RESTMessage
- Network.AWS.Error: instance Ord RESTMessage
- Network.AWS.Error: instance Selector S1_0_0RESTMessage
- Network.AWS.Error: instance Selector S1_0_1RESTMessage
- Network.AWS.Error: instance Selector S1_0_2RESTMessage
- Network.AWS.Error: instance Show RESTMessage
- Network.AWS.Error: msgCode :: Lens' RESTMessage Text
- Network.AWS.Error: msgRESTMessage :: Lens' RESTMessage Text
- Network.AWS.Error: msgType :: Lens' RESTMessage ErrorType
- Network.AWS.Request.RestXML: stream :: (ToPath a, ToQuery a, ToHeaders a, ToBody a) => StdMethod -> a -> Request a
+ Network.AWS.Data: bodyHash :: RqBody -> ByteString
+ Network.AWS.Data: hAMZAlgorithm :: HeaderName
+ Network.AWS.Data: hAMZContentSHA256 :: HeaderName
+ Network.AWS.Data: hAMZCredential :: HeaderName
+ Network.AWS.Data: hAMZExpires :: HeaderName
+ Network.AWS.Data: hAMZSignedHeaders :: HeaderName
+ Network.AWS.Error: instance Selector S1_0_2RESTError
+ Network.AWS.Error: instance Selector S1_0_3RESTError
+ Network.AWS.Error: jsonMessage :: Lens' JSONError Text
+ Network.AWS.Error: jsonType :: Lens' JSONError (Maybe Text)
+ Network.AWS.Error: restCode :: Lens' RESTError Text
+ Network.AWS.Error: restMessage :: Lens' RESTError Text
+ Network.AWS.Error: restRequestId :: Lens' RESTError Text
+ Network.AWS.Error: restType :: Lens' RESTError (Maybe ErrorType)
+ Network.AWS.Request.S3: delete :: (ToPath a, ToQuery a, ToHeaders a) => a -> Request a
+ Network.AWS.Request.S3: get :: (ToPath a, ToQuery a, ToHeaders a) => a -> Request a
+ Network.AWS.Request.S3: head :: (ToPath a, ToQuery a, ToHeaders a) => a -> Request a
+ Network.AWS.Request.S3: post :: (ToPath a, ToQuery a, ToHeaders a, ToXMLRoot a) => a -> Request a
+ Network.AWS.Request.S3: put :: (ToPath a, ToQuery a, ToHeaders a, ToXMLRoot a) => a -> Request a
+ Network.AWS.Request.S3: stream :: (ToPath a, ToQuery a, ToHeaders a, ToBody a) => StdMethod -> a -> Request a
+ Network.AWS.Types: Frankfurt :: Region
+ Network.AWS.Types: instance Constructor C1_11Region
+ Network.AWS.Types: instance Eq Endpoint
+ Network.AWS.Types: isGlobal :: Service a -> Bool
- Network.AWS.Types: _Errors :: Prism' (ServiceError a_awxn) [ServiceError a_awxn]
+ Network.AWS.Types: _Errors :: Prism' (ServiceError a_awxk) [ServiceError a_awxk]
- Network.AWS.Types: _HttpError :: Prism' (ServiceError a_awxn) HttpException
+ Network.AWS.Types: _HttpError :: Prism' (ServiceError a_awxk) HttpException
- Network.AWS.Types: _SerializerError :: Prism' (ServiceError a_awxn) (Abbrev, String)
+ Network.AWS.Types: _SerializerError :: Prism' (ServiceError a_awxk) (Abbrev, String)
- Network.AWS.Types: _ServiceError :: Prism' (ServiceError a_awxn) (Abbrev, Status, a_awxn)
+ Network.AWS.Types: _ServiceError :: Prism' (ServiceError a_awxk) (Abbrev, Status, a_awxk)
- Network.AWS.Types: rqBody :: Lens (Request a_awx6) (Request a_axEN) RqBody RqBody
+ Network.AWS.Types: rqBody :: Lens (Request a_awx3) (Request a_axHi) RqBody RqBody
- Network.AWS.Types: rqHeaders :: Lens (Request a_awx6) (Request a_axEO) [Header] [Header]
+ Network.AWS.Types: rqHeaders :: Lens (Request a_awx3) (Request a_axHj) [Header] [Header]
- Network.AWS.Types: rqMethod :: Lens (Request a_awx6) (Request a_axEP) StdMethod StdMethod
+ Network.AWS.Types: rqMethod :: Lens (Request a_awx3) (Request a_axHk) StdMethod StdMethod
- Network.AWS.Types: rqPath :: Lens (Request a_awx6) (Request a_axEQ) ByteString ByteString
+ Network.AWS.Types: rqPath :: Lens (Request a_awx3) (Request a_axHl) ByteString ByteString
- Network.AWS.Types: rqQuery :: Lens (Request a_awx6) (Request a_axER) Query Query
+ Network.AWS.Types: rqQuery :: Lens (Request a_awx3) (Request a_axHm) Query Query

Files

amazonka-core.cabal view
@@ -1,5 +1,5 @@ name:                  amazonka-core-version:               0.0.1+version:               0.0.2 synopsis:              Core functionality, serialisation primitives, and data types for the Amazonka Amazon Web Services SDKs. homepage:              https://github.com/brendanhay/amazonka license:               OtherLicense@@ -40,6 +40,7 @@         , Network.AWS.Request.Query         , Network.AWS.Request.RestJSON         , Network.AWS.Request.RestXML+        , Network.AWS.Request.S3         , Network.AWS.Response         , Network.AWS.Signing.Internal         , Network.AWS.Signing.V2@@ -82,7 +83,7 @@         , hashable             >= 1.2         , http-client          >= 0.3.6  && < 0.4         , http-types           >= 0.8-        , lens                 >= 4.4    && < 5+        , lens                 >= 4.3    && < 5         , mmorph               >= 1      && < 2         , mtl                  >= 2.2.1  && < 2.3         , nats                 >= 0.1.3
src/Network/AWS/Auth.hs view
@@ -108,7 +108,7 @@     FromSession a s t -> return (fromSession a s t)     FromProfile n     -> show `withExceptT` fromProfileName m n     FromEnv     a s   -> fromEnvVars a s-    Discover          -> fromEnv `catchError` const (iam `catchError` (const err))+    Discover          -> fromEnv `catchError` const (iam `catchError` const err)       where         iam = show `withExceptT` fromProfile m         err = throwError "Unable to read environment variables or IAM profile."
src/Network/AWS/Data/Internal/Base64.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE DeriveGeneric              #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE TemplateHaskell            #-}  -- Module      : Network.AWS.Data.Internal.Base64 -- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
src/Network/AWS/Data/Internal/Body.hs view
@@ -56,6 +56,9 @@  makeLenses ''RqBody +bodyHash :: RqBody -> ByteString+bodyHash = digestToHexByteString . _bdyHash+ instance ToText RqBody where     toText (RqBody h _) = "RqBody " <> toText h <> " <body>" 
src/Network/AWS/Data/Internal/ByteString.hs view
@@ -1,7 +1,5 @@-{-# LANGUAGE DefaultSignatures          #-}-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleInstances #-}  -- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com> -- License     : This Source Code Form is subject to the terms of@@ -25,7 +23,6 @@     ) where  import           Crypto.Hash-import           Data.Aeson import           Data.ByteString                (ByteString) import qualified Data.ByteString.Base64         as Base64 import           Data.ByteString.Builder        (Builder)@@ -39,7 +36,6 @@ import           Data.Text                      (Text) import qualified Data.Text.Encoding             as Text import           Data.Time                      (UTCTime)-import           GHC.Generics import           Network.AWS.Data.Internal.Text import           Network.HTTP.Types.Method import           Numeric.Natural
src/Network/AWS/Data/Internal/Header.hs view
@@ -30,24 +30,6 @@ import           Network.AWS.Data.Internal.Text import           Network.HTTP.Types -hHost :: HeaderName-hHost = "Host"--hAMZToken :: HeaderName-hAMZToken = "X-Amz-Security-Token"--hAMZTarget :: HeaderName-hAMZTarget = "X-Amz-Target"--hAMZAuth :: HeaderName-hAMZAuth = "X-Amzn-Authorization"--hAMZDate :: HeaderName-hAMZDate = "X-Amz-Date"--hMetaPrefix :: HeaderName-hMetaPrefix = "X-Amz-"- (~:) :: FromText a => ResponseHeaders -> HeaderName -> Either String a hs ~: k = hs ~:? k >>= note   where@@ -105,3 +87,36 @@ instance (ToByteString k, ToByteString v) => ToHeader (HashMap k v) where     toHeader p = map (\(k, v) -> (p <> CI.mk (toBS k), toBS v)) . Map.toList     {-# INLINE toHeader #-}++hHost :: HeaderName+hHost = "Host"++hAMZToken :: HeaderName+hAMZToken = "X-Amz-Security-Token"++hAMZTarget :: HeaderName+hAMZTarget = "X-Amz-Target"++hAMZAlgorithm :: HeaderName+hAMZAlgorithm = "X-Amz-Algorithm"++hAMZCredential :: HeaderName+hAMZCredential = "X-Amz-Credential"++hAMZExpires :: HeaderName+hAMZExpires = "X-Amz-Expires"++hAMZSignedHeaders :: HeaderName+hAMZSignedHeaders = "X-Amz-Expires"++hAMZContentSHA256 :: HeaderName+hAMZContentSHA256 = "X-Amz-Content-SHA256"++hAMZAuth :: HeaderName+hAMZAuth = "X-Amzn-Authorization"++hAMZDate :: HeaderName+hAMZDate = "X-Amz-Date"++hMetaPrefix :: HeaderName+hMetaPrefix = "X-Amz-"
src/Network/AWS/Data/Internal/JSON.hs view
@@ -31,7 +31,6 @@     ) where  import           Data.Aeson.Types-import           Data.HashMap.Strict            (HashMap) import qualified Data.HashMap.Strict            as Map import           Data.Text                      (Text) import           Network.AWS.Data.Internal.Text
src/Network/AWS/Data/Internal/List.hs view
@@ -23,6 +23,8 @@  module Network.AWS.Data.Internal.List where +import Debug.Trace+ import           Control.Lens                      hiding (coerce, element) import           Control.Monad import           Data.Aeson
src/Network/AWS/Data/Internal/Map.hs view
@@ -141,7 +141,7 @@          , FromXML k          , FromXML v          ) => FromXML (EMap e i j k v) where-    parseXML = fmap fromList . traverse (withElement e go . (:[]))+    parseXML = fmap fromList . traverse go . mapMaybe (childNodes e)       where         go ns             | length ns == 2 =
src/Network/AWS/Data/Internal/Text.hs view
@@ -15,9 +15,8 @@ module Network.AWS.Data.Internal.Text     ( FromText (..)     , fromText-    , match-    , matchCI     , AText.takeText+    , matchCI      , ToText   (..)     , showText@@ -47,11 +46,6 @@ fromText :: FromText a => Text -> Either String a fromText = AText.parseOnly parser {-# INLINE fromText #-}---- FIXME: improve the error messages for partial match, or extra input etc.-match :: Text -> a -> Parser a-match x y = AText.string x <* AText.endOfInput >> return y-{-# INLINE match #-}  matchCI :: Text -> a -> Parser a matchCI x y = AText.asciiCI x <* AText.endOfInput >> return y
src/Network/AWS/Data/Internal/Time.hs view
@@ -87,7 +87,7 @@     format :: Tagged a String  instance TimeFormat RFC822    where format = Tagged "%a, %d %b %Y %H:%M:%S GMT"-instance TimeFormat ISO8601   where format = Tagged (iso8601DateFormat (Just "%XZ"))+instance TimeFormat ISO8601   where format = Tagged (iso8601DateFormat (Just "%X%QZ")) instance TimeFormat BasicTime where format = Tagged "%Y%m%d" instance TimeFormat AWSTime   where format = Tagged "%Y%m%dT%H%M%SZ" 
src/Network/AWS/Data/Internal/XML.hs view
@@ -1,7 +1,6 @@ {-# LANGUAGE DefaultSignatures   #-} {-# LANGUAGE LambdaCase          #-} {-# LANGUAGE OverloadedStrings   #-}-{-# LANGUAGE RecordWildCards     #-} {-# LANGUAGE ScopedTypeVariables #-}  -- Module      : Network.AWS.Data.Internal.XML@@ -143,10 +142,7 @@     err = Left $ "unable to find element "         ++ show n         ++ " in nodes "-        ++ show (mapMaybe name ns)--    name (NodeElement e) = Just (nameLocalName (elementName e))-    name _               = Nothing+        ++ show (mapMaybe localName ns) {-# INLINE findElement #-}  childNodes :: Text -> Node -> Maybe [Node]@@ -154,6 +150,11 @@     | nameLocalName (elementName e) == n = Just (elementNodes e) childNodes _ _ = Nothing {-# INLINE childNodes #-}++localName :: Node -> Maybe Text+localName (NodeElement e) = Just (nameLocalName (elementName e))+localName _               = Nothing+{-# INLINE localName #-}  class FromXML a where     parseXML :: [Node] -> Either String a
src/Network/AWS/Error.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DeriveGeneric     #-} {-# LANGUAGE FlexibleContexts  #-}+{-# LANGUAGE LambdaCase        #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards   #-} {-# LANGUAGE TemplateHaskell   #-}@@ -16,11 +17,29 @@ -- Stability   : experimental -- Portability : non-portable (GHC extensions) -module Network.AWS.Error where+module Network.AWS.Error+    (+    -- * Status Checks+      statusSuccess +    -- * REST Errors+    , ErrorType (..)+    , RESTError+    , restRequestId+    , restType+    , restCode+    , restMessage+    , restError++    -- * JSON Errors+    , JSONError+    , jsonType+    , jsonMessage+    , jsonError+    ) where+ import           Control.Applicative import           Control.Lens-import           Control.Monad import           Data.Aeson import qualified Data.ByteString.Lazy       as LBS import           Data.ByteString.Lazy.Char8 (unpack)@@ -39,37 +58,31 @@       deriving (Eq, Ord, Enum, Show, Generic)  instance FromText ErrorType where-    parser = match "Receiver" Receiver-         <|> match "Sender"   Sender+    parser = takeText >>= \case+        "Receiver" -> pure Receiver+        "Sender"   -> pure Sender+        e          -> fail $ "Failure parsing ErrorType from " ++ show e  instance FromXML ErrorType where     parseXML = parseXMLText "Type" -data RESTMessage = RESTMessage-    { _msgType    :: !ErrorType-    , _msgCode    :: Text-    , _msgRESTMessage :: Text-    } deriving (Eq, Ord, Show, Generic)--makeLenses ''RESTMessage--instance FromXML RESTMessage where-    parseXML x = RESTMessage-        <$> x .@ "Type"-        <*> x .@ "Code"-        <*> x .@ "Message"- data RESTError = RESTError-    { _errError     :: RESTMessage-    , _errRequestId :: Text+    { _restRequestId :: Text+    , _restType      :: Maybe ErrorType+    , _restCode      :: Text+    , _restMessage   :: Text     } deriving (Eq, Show, Generic)  makeLenses ''RESTError  instance FromXML RESTError where-    parseXML x = RESTError-        <$> x .@ "Error"-        <*> x .@ "RequestId"+    parseXML x = withElement "Error" f x <|> f x+      where+        f y = RESTError+            <$> x .@  "RequestId"+            <*> y .@? "Type"+            <*> y .@  "Code"+            <*> y .@  "Message"  restError :: FromXML (Er a)           => (Status -> Bool)@@ -86,16 +99,17 @@         success   = ServiceError _svcAbbrev s  data JSONError = JSONError-    { _errType    :: Maybe Text-    , _errMessage :: Text+    { _jsonType    :: Maybe Text+    , _jsonMessage :: Text     } deriving (Eq, Show, Generic)  makeLenses ''JSONError  instance FromJSON JSONError where-    parseJSON = withObject "JSONError" $ \o -> JSONError-        <$> (o .:? "__type"  <|> o .:? "Type")-        <*> (o .:  "message" <|> o .:  "Message")+    parseJSON = withObject "JSONError" $ \o -> rest o <|> post o+      where+        rest o = JSONError <$> o .:? "Type"   <*> o .: "Message"+        post o = JSONError <$> o .:? "__type" <*> o .: "message"  jsonError :: FromJSON (Er a)           => (Status -> Bool)
src/Network/AWS/Request/RestXML.hs view
@@ -14,7 +14,6 @@     , delete     , post     , put-    , stream     ) where  import Control.Lens@@ -43,10 +42,3 @@ put :: (ToPath a, ToQuery a, ToHeaders a, ToXMLRoot a) => a -> Request a put x = get x & rqMethod .~ PUT & rqBody .~ toBody (encodeXML x) {-# INLINE put #-}--stream :: (ToPath a, ToQuery a, ToHeaders a, ToBody a)-       => StdMethod-       -> a-       -> Request a-stream m x = get x & rqMethod .~ m & rqBody .~ toBody x-{-# INLINE stream #-}
+ src/Network/AWS/Request/S3.hs view
@@ -0,0 +1,55 @@+-- Module      : Network.AWS.Request.S3+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>+-- License     : This Source Code Form is subject to the terms of+--               the Mozilla Public License, v. 2.0.+--               A copy of the MPL can be found in the LICENSE file or+--               you can obtain it at http://mozilla.org/MPL/2.0/.+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>+-- Stability   : experimental+-- Portability : non-portable (GHC extensions)++module Network.AWS.Request.S3+    ( get+    , head+    , delete+    , post+    , put+    , stream+    ) where++import Control.Lens+import Network.AWS.Data+import Network.AWS.Request.Internal+import Network.AWS.Types+import Network.HTTP.Types.Method+import Prelude                      hiding (head)++get :: (ToPath a, ToQuery a, ToHeaders a) => a -> Request a+get = content . defaultRequest+{-# INLINE get #-}++delete :: (ToPath a, ToQuery a, ToHeaders a) => a -> Request a+delete x = get x & rqMethod .~ DELETE+{-# INLINE delete #-}++head :: (ToPath a, ToQuery a, ToHeaders a) => a -> Request a+head x = get x & rqMethod .~ HEAD+{-# INLINE head #-}++post :: (ToPath a, ToQuery a, ToHeaders a, ToXMLRoot a) => a -> Request a+post x = put x & rqMethod .~ POST+{-# INLINE post #-}++put :: (ToPath a, ToQuery a, ToHeaders a, ToXMLRoot a) => a -> Request a+put x = content $ get x & rqMethod .~ PUT & rqBody .~ toBody (encodeXML x)+{-# INLINE put #-}++stream :: (ToPath a, ToQuery a, ToHeaders a, ToBody a)+       => StdMethod+       -> a+       -> Request a+stream m x = content $ get x & rqMethod .~ m & rqBody .~ toBody x+{-# INLINE stream #-}++content :: Request a -> Request a+content rq = rq & rqHeaders %~ hdr hAMZContentSHA256 (bodyHash (rq ^. rqBody))
src/Network/AWS/Response.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE FlexibleContexts    #-}-{-# LANGUAGE RecordWildCards     #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies        #-} 
src/Network/AWS/Signing/V4.hs view
@@ -33,6 +33,7 @@ import qualified Data.ByteString.Base16       as Base16 import qualified Data.ByteString.Char8        as BS import qualified Data.CaseInsensitive         as CI+import           Data.Default.Class import qualified Data.Foldable                as Fold import           Data.Function import           Data.List                    (groupBy, intersperse, sortBy, sort)@@ -78,12 +79,13 @@         out = finalise Nothing qry service a r rq l t          qry cs sh =-              pair "X-AMZ-Algorithm"      algorithm-            . pair "X-AMZ-Credential"     cs-            . pair "X-AMZ-Date"           (LocaleTime l t :: ISO8601)-            . pair "X-AMZ-Expires"        (LocaleTime l x :: ISO8601)-            . pair "X-AMZ-SignedHeaders"  sh-            . pair "X-AMZ-Security-Token" (toBS <$> _authToken a)+              pair (CI.original hAMZAlgorithm)     algorithm+            . pair (CI.original hAMZCredential)    cs+            . pair (CI.original hAMZDate)          (LocaleTime l t :: ISO8601)+            . pair (CI.original hAMZExpires)       (LocaleTime l x :: ISO8601)+            . pair (CI.original hAMZSignedHeaders) sh+            . pair (CI.original hAMZToken)         (toBS <$> _authToken a)+            . pair (CI.original hAMZContentSHA256) ("UNSIGNED-PAYLOAD" :: ByteString)          auth = mappend "&X-AMZ-Signature=" . _mSignature @@ -146,13 +148,16 @@     host' = toBS (endpoint s r)     query = qry credentialScope signedHeaders _rqQuery +    region | isGlobal s = def+           | otherwise  = r+     canonicalQuery = toBS $ query         & valuesOf %~ Just . maybe "" (encodeURI True)         & keysOf   %~ encodeURI False      headers = sortBy (comparing fst)         . hdr hHost host'-        . hdr hDate (toBS (LocaleTime l t :: ISO8601))+        . hdr hAMZDate (toBS (LocaleTime l t :: AWSTime))         $ _rqHeaders      joinedHeaders = map f $ groupBy ((==) `on` fst) headers@@ -179,12 +184,12 @@        , canonicalQuery        , canonicalHeaders        , signedHeaders-       , digestToHexByteString (_bdyHash _rqBody)+       , bodyHash _rqBody        ]      scope =         [ toBS (LocaleTime l t :: BasicTime)-        , toBS r+        , toBS region         , toBS _svcPrefix         , "aws4_request"         ]
src/Network/AWS/Types.hs view
@@ -51,6 +51,7 @@     , global     , regional     , custom+    , isGlobal      -- * Errors     , ServiceError  (..)@@ -318,6 +319,7 @@     = Global     | Regional     | Custom ByteString+      deriving (Eq)  instance IsString Endpoint where     fromString = Custom . fromString@@ -338,6 +340,9 @@ custom :: ByteString -> Endpoint custom = Custom +isGlobal :: Service a -> Bool+isGlobal = (== Global) . _svcEndpoint+ -- | Attributes specific to an AWS service. data Service a = Service     { _svcAbbrev       :: !Text@@ -373,6 +378,7 @@ -- | The sum of available AWS regions. data Region     = Ireland         -- ^ Europe / eu-west-1+    | Frankfurt       -- ^ Europe / eu-central-1     | Tokyo           -- ^ Asia Pacific / ap-northeast-1     | Singapore       -- ^ Asia Pacific / ap-southeast-1     | Sydney          -- ^ Asia Pacific / ap-southeast-2@@ -389,21 +395,26 @@     def = NorthVirginia  instance FromText Region where-    parser = match "eu-west-1"          Ireland-         <|> match "ap-northeast-1"     Tokyo-         <|> match "ap-southeast-1"     Singapore-         <|> match "ap-southeast-2"     Sydney-         <|> match "cn-north-1"         Beijing-         <|> match "us-east-1"          NorthVirginia-         <|> match "us-west-2"          NorthCalifornia-         <|> match "us-west-1"          Oregon-         <|> match "us-gov-west-1"      GovCloud-         <|> match "fips-us-gov-west-1" GovCloudFIPS-         <|> match "sa-east-1"          SaoPaulo+    parser = takeText >>= \case+        "eu-west-1"          -> pure Ireland+        "eu-central-1"       -> pure Frankfurt+        "ap-northeast-1"     -> pure Tokyo+        "ap-southeast-1"     -> pure Singapore+        "ap-southeast-2"     -> pure Sydney+        "cn-north-1"         -> pure Beijing+        "us-east-1"          -> pure NorthVirginia+        "us-west-2"          -> pure NorthCalifornia+        "us-west-1"          -> pure Oregon+        "us-gov-west-1"      -> pure GovCloud+        "fips-us-gov-west-1" -> pure GovCloudFIPS+        "sa-east-1"          -> pure SaoPaulo+        e                    -> fail $+            "Failure parsing Region from " ++ show e  instance ToText Region where     toText r = case r of         Ireland         -> "eu-west-1"+        Frankfurt       -> "eu-central-1"         Tokyo           -> "ap-northeast-1"         Singapore       -> "ap-southeast-1"         Sydney          -> "ap-southeast-2"