amazonka-core 1.4.1 → 1.4.2
raw patch · 4 files changed
+47/−38 lines, 4 filesdep ~timePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: time
API changes (from Hackage documentation)
- Network.AWS.Data.Base64: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Base64.Base64
- Network.AWS.Data.Base64: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Base64.Base64
- Network.AWS.Data.Base64: instance GHC.Generics.Constructor Network.AWS.Data.Base64.C1_0Base64
- Network.AWS.Data.Base64: instance GHC.Generics.Datatype Network.AWS.Data.Base64.D1Base64
- Network.AWS.Data.Base64: instance GHC.Generics.Selector Network.AWS.Data.Base64.S1_0_0Base64
- Network.AWS.Data.List1: instance Data.Aeson.Types.Class.FromJSON a => Data.Aeson.Types.Class.FromJSON (Network.AWS.Data.List1.List1 a)
- Network.AWS.Data.List1: instance Data.Aeson.Types.Class.ToJSON a => Data.Aeson.Types.Class.ToJSON (Network.AWS.Data.List1.List1 a)
- Network.AWS.Data.List1: instance GHC.Generics.Constructor Network.AWS.Data.List1.C1_0List1
- Network.AWS.Data.List1: instance GHC.Generics.Datatype Network.AWS.Data.List1.D1List1
- Network.AWS.Data.List1: instance GHC.Generics.Selector Network.AWS.Data.List1.S1_0_0List1
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Data.Data k, Data.Data.Data v, Data.Hashable.Class.Hashable k) => Data.Data.Data (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k) => Data.Semigroup.Semigroup (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k) => GHC.Base.Monoid (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k, Network.AWS.Data.Text.FromText k, Data.Aeson.Types.Class.FromJSON v) => Data.Aeson.Types.Class.FromJSON (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k, Network.AWS.Data.Text.ToText k, Data.Aeson.Types.Class.ToJSON v) => Data.Aeson.Types.Class.ToJSON (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, GHC.Classes.Eq v) => GHC.Classes.Eq (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Classes.Eq k, GHC.Read.Read k, GHC.Read.Read v, Data.Hashable.Class.Hashable k) => GHC.Read.Read (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance (GHC.Show.Show k, GHC.Show.Show v) => GHC.Show.Show (Network.AWS.Data.Map.Map k v)
- Network.AWS.Data.Map: instance GHC.Generics.Constructor Network.AWS.Data.Map.C1_0Map
- Network.AWS.Data.Map: instance GHC.Generics.Datatype Network.AWS.Data.Map.D1Map
- Network.AWS.Data.Map: instance GHC.Generics.Selector Network.AWS.Data.Map.S1_0_0Map
- Network.AWS.Data.Numeric: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Numeric.Nat
- Network.AWS.Data.Numeric: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Numeric.Nat
- Network.AWS.Data.Numeric: instance GHC.Generics.Constructor Network.AWS.Data.Numeric.C1_0Nat
- Network.AWS.Data.Numeric: instance GHC.Generics.Datatype Network.AWS.Data.Numeric.D1Nat
- Network.AWS.Data.Numeric: instance GHC.Generics.Selector Network.AWS.Data.Numeric.S1_0_0Nat
- Network.AWS.Data.Sensitive: instance Data.Aeson.Types.Class.FromJSON a => Data.Aeson.Types.Class.FromJSON (Network.AWS.Data.Sensitive.Sensitive a)
- Network.AWS.Data.Sensitive: instance Data.Aeson.Types.Class.ToJSON a => Data.Aeson.Types.Class.ToJSON (Network.AWS.Data.Sensitive.Sensitive a)
- Network.AWS.Data.Sensitive: instance GHC.Generics.Constructor Network.AWS.Data.Sensitive.C1_0Sensitive
- Network.AWS.Data.Sensitive: instance GHC.Generics.Datatype Network.AWS.Data.Sensitive.D1Sensitive
- Network.AWS.Data.Sensitive: instance GHC.Generics.Selector Network.AWS.Data.Sensitive.S1_0_0Sensitive
- Network.AWS.Data.Time: Time :: UTCTime -> Time a
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Time.AWSTime
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Time.BasicTime
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Time.ISO8601
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Time.POSIX
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Data.Time.RFC822
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Time.AWSTime
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Time.BasicTime
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Time.ISO8601
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Time.POSIX
- Network.AWS.Data.Time: instance Data.Aeson.Types.Class.ToJSON Network.AWS.Data.Time.RFC822
- Network.AWS.Data.Time: instance GHC.Generics.Constructor Network.AWS.Data.Time.C1_0Format
- Network.AWS.Data.Time: instance GHC.Generics.Constructor Network.AWS.Data.Time.C1_0Time
- Network.AWS.Data.Time: instance GHC.Generics.Constructor Network.AWS.Data.Time.C1_1Format
- Network.AWS.Data.Time: instance GHC.Generics.Constructor Network.AWS.Data.Time.C1_2Format
- Network.AWS.Data.Time: instance GHC.Generics.Constructor Network.AWS.Data.Time.C1_3Format
- Network.AWS.Data.Time: instance GHC.Generics.Constructor Network.AWS.Data.Time.C1_4Format
- Network.AWS.Data.Time: instance GHC.Generics.Datatype Network.AWS.Data.Time.D1Format
- Network.AWS.Data.Time: instance GHC.Generics.Datatype Network.AWS.Data.Time.D1Time
- Network.AWS.Response: receive :: MonadResource m => (Int -> ResponseHeaders -> ResponseBody -> m (Either String (Rs a))) -> Service -> Proxy a -> ClientResponse -> m (Response a)
- Network.AWS.Types: Meta :: a -> Meta
- Network.AWS.Types: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Types.Abbrev
- Network.AWS.Types: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Types.AuthEnv
- Network.AWS.Types: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Types.ErrorCode
- Network.AWS.Types: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Types.ErrorMessage
- Network.AWS.Types: instance Data.Aeson.Types.Class.FromJSON Network.AWS.Types.RequestId
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_0Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_0Seconds
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_10Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_11Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_1Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_2Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_3Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_4Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_5Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_6Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_7Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_8Region
- Network.AWS.Types: instance GHC.Generics.Constructor Network.AWS.Types.C1_9Region
- Network.AWS.Types: instance GHC.Generics.Datatype Network.AWS.Types.D1Region
- Network.AWS.Types: instance GHC.Generics.Datatype Network.AWS.Types.D1Seconds
+ Network.AWS.Data.Base64: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Base64.Base64
+ Network.AWS.Data.Base64: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Base64.Base64
+ Network.AWS.Data.Headers: infixl 7 .#?
+ Network.AWS.Data.Headers: infixr 7 =#
+ Network.AWS.Data.JSON: parseJSONList :: FromJSON a => Value -> Parser [a]
+ Network.AWS.Data.JSON: toEncodingList :: ToJSON a => [a] -> Encoding
+ Network.AWS.Data.JSON: toJSONList :: ToJSON a => [a] -> Value
+ Network.AWS.Data.List1: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Network.AWS.Data.List1.List1 a)
+ Network.AWS.Data.List1: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Network.AWS.Data.List1.List1 a)
+ Network.AWS.Data.Map: instance (Data.Hashable.Class.Hashable k, GHC.Classes.Eq k) => Data.Semigroup.Semigroup (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (Data.Hashable.Class.Hashable k, GHC.Classes.Eq k) => GHC.Base.Monoid (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (Data.Hashable.Class.Hashable k, GHC.Classes.Eq k, Data.Data.Data v, Data.Data.Data k) => Data.Data.Data (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k, Network.AWS.Data.Text.FromText k, Data.Aeson.Types.FromJSON.FromJSON v) => Data.Aeson.Types.FromJSON.FromJSON (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k, Network.AWS.Data.Text.ToText k, Data.Aeson.Types.ToJSON.ToJSON v) => Data.Aeson.Types.ToJSON.ToJSON (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (GHC.Classes.Eq v, GHC.Classes.Eq k) => GHC.Classes.Eq (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (GHC.Read.Read v, GHC.Read.Read k, Data.Hashable.Class.Hashable k, GHC.Classes.Eq k) => GHC.Read.Read (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Map: instance (GHC.Show.Show v, GHC.Show.Show k) => GHC.Show.Show (Network.AWS.Data.Map.Map k v)
+ Network.AWS.Data.Numeric: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Numeric.Nat
+ Network.AWS.Data.Numeric: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Numeric.Nat
+ Network.AWS.Data.Query: infixr 7 =:
+ Network.AWS.Data.Sensitive: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Network.AWS.Data.Sensitive.Sensitive a)
+ Network.AWS.Data.Sensitive: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Network.AWS.Data.Sensitive.Sensitive a)
+ Network.AWS.Data.Time: [Time] :: UTCTime -> Time a
+ Network.AWS.Data.Time: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Time.AWSTime
+ Network.AWS.Data.Time: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Time.BasicTime
+ Network.AWS.Data.Time: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Time.ISO8601
+ Network.AWS.Data.Time: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Time.POSIX
+ Network.AWS.Data.Time: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Data.Time.RFC822
+ Network.AWS.Data.Time: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Time.AWSTime
+ Network.AWS.Data.Time: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Time.BasicTime
+ Network.AWS.Data.Time: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Time.ISO8601
+ Network.AWS.Data.Time: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Time.POSIX
+ Network.AWS.Data.Time: instance Data.Aeson.Types.ToJSON.ToJSON Network.AWS.Data.Time.RFC822
+ Network.AWS.Data.XML: infixl 7 .@?
+ Network.AWS.Data.XML: infixr 7 @=
+ Network.AWS.Prelude: infixl 7 .!@
+ Network.AWS.Response: stream :: MonadResource m => (Int -> ResponseHeaders -> ResponseBody -> m (Either String (Rs a))) -> Service -> Proxy a -> ClientResponse -> m (Response a)
+ Network.AWS.Types: [Meta] :: ToLog a => a -> Meta
+ Network.AWS.Types: [_serializeBody] :: SerializeError -> Maybe LazyByteString
+ Network.AWS.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Types.Abbrev
+ Network.AWS.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Types.AuthEnv
+ Network.AWS.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Types.ErrorCode
+ Network.AWS.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Types.ErrorMessage
+ Network.AWS.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.AWS.Types.RequestId
+ Network.AWS.Types: type family Rs a :: *;
+ Network.AWS.Types: }
- Network.AWS.Data.Body: toBody :: ToBody a => a -> RqBody
+ Network.AWS.Data.Body: toBody :: (ToBody a, ToHashedBody a) => a -> RqBody
- Network.AWS.Data.ByteString: toBS :: ToByteString a => a -> ByteString
+ Network.AWS.Data.ByteString: toBS :: (ToByteString a, ToText a) => a -> ByteString
- Network.AWS.Data.Headers: toHeader :: ToHeader a => HeaderName -> a -> [Header]
+ Network.AWS.Data.Headers: toHeader :: (ToHeader a, ToText a) => HeaderName -> a -> [Header]
- Network.AWS.Data.JSON: Object :: SrictNotUnpackedObject -> Value
+ Network.AWS.Data.JSON: Object :: ~Object -> Value
- Network.AWS.Data.Query: toQuery :: ToQuery a => a -> QueryString
+ Network.AWS.Data.Query: toQuery :: (ToQuery a, ToText a) => a -> QueryString
- Network.AWS.Types: SerializeError' :: !Abbrev -> !Status -> String -> SerializeError
+ Network.AWS.Types: SerializeError' :: !Abbrev -> !Status -> Maybe LazyByteString -> String -> SerializeError
- Network.AWS.Types: Service :: !Abbrev -> !Signer -> !ByteString -> !ByteString -> !(Region -> Endpoint) -> !(Maybe Seconds) -> !(Status -> Bool) -> !(Abbrev -> Status -> [Header] -> LazyByteString -> Error) -> !Retry -> Service
+ Network.AWS.Types: Service :: !Abbrev -> !Signer -> !ByteString -> !ByteString -> !(Region -> Endpoint) -> !(Maybe Seconds) -> !(Status -> Bool) -> !(Status -> [Header] -> LazyByteString -> Error) -> !Retry -> Service
- Network.AWS.Types: [_svcError] :: Service -> !(Abbrev -> Status -> [Header] -> LazyByteString -> Error)
+ Network.AWS.Types: [_svcError] :: Service -> !(Status -> [Header] -> LazyByteString -> Error)
- Network.AWS.Types: class AWSRequest a where type family Rs a :: *
+ Network.AWS.Types: class AWSRequest a where type Rs a :: * where {
Files
- amazonka-core.cabal +2/−2
- src/Network/AWS/Error.hs +3/−3
- src/Network/AWS/Response.hs +38/−32
- src/Network/AWS/Types.hs +4/−1
amazonka-core.cabal view
@@ -1,5 +1,5 @@ name: amazonka-core-version: 1.4.1+version: 1.4.2 synopsis: Core data types and functionality for Amazonka libraries. homepage: https://github.com/brendanhay/amazonka bug-reports: https://github.com/brendanhay/amazonka/issues@@ -109,7 +109,7 @@ , time >= 1.2 && < 1.5 else build-depends:- time >= 1.5 && < 1.6+ time >= 1.5 test-suite tests type: exitcode-stdio-1.0
src/Network/AWS/Error.hs view
@@ -40,8 +40,8 @@ -> TransportError <$> (StatusCodeException <$> g s <*> pure h <*> pure c) TransportError e -> pure (TransportError e)- SerializeError (SerializeError' a s e)- -> g s <&> \x -> SerializeError (SerializeError' a x e)+ SerializeError (SerializeError' a s b e)+ -> g s <&> \x -> SerializeError (SerializeError' a x b e) ServiceError e -> g (_serviceStatus e) <&> \x -> ServiceError (e { _serviceStatus = x }) @@ -132,6 +132,6 @@ decodeError a s h bs e | LBS.null bs = parseRESTError a s h bs | otherwise =- either (SerializeError . SerializeError' a s)+ either (SerializeError . SerializeError' a s (Just bs)) ServiceError e
src/Network/AWS/Response.hs view
@@ -14,6 +14,7 @@ -- module Network.AWS.Response where +import Control.Applicative (pure) import Control.Monad.Catch import Control.Monad.IO.Class import Control.Monad.Trans.Resource@@ -39,8 +40,8 @@ -> Proxy a -> ClientResponse -> m (Response a)-receiveNull rs _ = receive $ \_ _ x ->- liftResourceT (x $$+- return (Right rs))+receiveNull rs _ = stream $ \_ _ x ->+ liftResourceT (x $$+- pure (Right rs)) receiveEmpty :: MonadResource m => (Int -> ResponseHeaders -> () -> Either String (Rs a))@@ -49,8 +50,8 @@ -> Proxy a -> ClientResponse -> m (Response a)-receiveEmpty f _ = receive $ \s h x ->- liftResourceT (x $$+- return (f s h ()))+receiveEmpty f _ = stream $ \s h x ->+ liftResourceT (x $$+- pure (f s h ())) receiveXMLWrapper :: MonadResource m => Text@@ -87,8 +88,9 @@ -> Proxy a -> ClientResponse -> m (Response a)-receiveBody f _ = receive $ \s h x -> return (f s h (RsBody x))+receiveBody f _ = stream $ \s h x -> pure (f s h (RsBody x)) +-- | Deserialise an entire response body, such as an XML or JSON payload. deserialise :: MonadResource m => (LazyByteString -> Either String b) -> (Int -> ResponseHeaders -> b -> Either String (Rs a))@@ -97,34 +99,38 @@ -> Proxy a -> ClientResponse -> m (Response a)-deserialise g f l = receive $ \s h x -> do- lbs <- sinkLBS x- liftIO . l Debug . build $ "[Raw Response Body] {\n" <> lbs <> "\n}"- return $! g lbs >>= f s h--receive :: MonadResource m- => (Int -> ResponseHeaders -> ResponseBody -> m (Either String (Rs a)))- -> Service- -> Proxy a- -> ClientResponse- -> m (Response a)-receive f Service{..} _ rs- | not (_svcCheck s) = sinkLBS x >>= serviceErr- | otherwise = do- p <- f (fromEnum s) h x- either serializeErr- (return . (s,))- p- where- s = responseStatus rs- h = responseHeaders rs- x = responseBody rs-- serviceErr :: MonadThrow m => LazyByteString -> m a- serviceErr = throwM . _svcError _svcAbbrev s h+deserialise g f l Service{..} _ rs = do+ let s = responseStatus rs+ h = responseHeaders rs+ x = responseBody rs+ b <- sinkLBS x+ if not (_svcCheck s)+ then throwM (_svcError s h b)+ else do+ liftIO . l Debug . build $ "[Raw Response Body] {\n" <> b <> "\n}"+ case g b >>= f (fromEnum s) h of+ Right r -> pure (s, r)+ Left e -> throwM . SerializeError $+ SerializeError' _svcAbbrev s (Just b) e - serializeErr :: MonadThrow m => String -> m a- serializeErr e = throwM (SerializeError (SerializeError' _svcAbbrev s e))+-- | Stream a raw response body, such as an S3 object payload.+stream :: MonadResource m+ => (Int -> ResponseHeaders -> ResponseBody -> m (Either String (Rs a)))+ -> Service+ -> Proxy a+ -> ClientResponse+ -> m (Response a)+stream f Service{..} _ rs = do+ let s = responseStatus rs+ h = responseHeaders rs+ x = responseBody rs+ if not (_svcCheck s)+ then sinkLBS x >>= throwM . _svcError s h+ else do+ e <- f (fromEnum s) h x+ either (throwM . SerializeError . SerializeError' _svcAbbrev s Nothing)+ (pure . (s,))+ e sinkLBS :: MonadResource m => ResponseBody -> m LazyByteString sinkLBS bdy = liftResourceT (bdy $$+- Conduit.sinkLbs)
src/Network/AWS/Types.hs view
@@ -223,6 +223,8 @@ data SerializeError = SerializeError' { _serializeAbbrev :: !Abbrev , _serializeStatus :: !Status+ , _serializeBody :: Maybe LazyByteString+ -- ^ The response body, if the response was not streaming. , _serializeMessage :: String } deriving (Eq, Show, Typeable) @@ -232,6 +234,7 @@ , " service = " <> build _serializeAbbrev , " status = " <> build _serializeStatus , " message = " <> build _serializeMessage+ , " body = " <> build _serializeBody , "}" ] @@ -418,7 +421,7 @@ , _svcEndpoint :: !(Region -> Endpoint) , _svcTimeout :: !(Maybe Seconds) , _svcCheck :: !(Status -> Bool)- , _svcError :: !(Abbrev -> Status -> [Header] -> LazyByteString -> Error)+ , _svcError :: !(Status -> [Header] -> LazyByteString -> Error) , _svcRetry :: !Retry }