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 +3/−2
- src/Network/AWS/Auth.hs +1/−1
- src/Network/AWS/Data/Internal/Base64.hs +0/−1
- src/Network/AWS/Data/Internal/Body.hs +3/−0
- src/Network/AWS/Data/Internal/ByteString.hs +2/−6
- src/Network/AWS/Data/Internal/Header.hs +33/−18
- src/Network/AWS/Data/Internal/JSON.hs +0/−1
- src/Network/AWS/Data/Internal/List.hs +2/−0
- src/Network/AWS/Data/Internal/Map.hs +1/−1
- src/Network/AWS/Data/Internal/Text.hs +1/−7
- src/Network/AWS/Data/Internal/Time.hs +1/−1
- src/Network/AWS/Data/Internal/XML.hs +6/−5
- src/Network/AWS/Error.hs +42/−28
- src/Network/AWS/Request/RestXML.hs +0/−8
- src/Network/AWS/Request/S3.hs +55/−0
- src/Network/AWS/Response.hs +0/−1
- src/Network/AWS/Signing/V4.hs +14/−9
- src/Network/AWS/Types.hs +22/−11
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"