    {-# LANGUAGE DeriveDataTypeable        #-}
    {-# LANGUAGE FlexibleContexts          #-}
    {-# LANGUAGE FlexibleInstances         #-}
    {-# LANGUAGE MultiParamTypeClasses     #-}
    {-# LANGUAGE NoMonomorphismRestriction #-}
    {-# LANGUAGE OverloadedStrings         #-}
    {-# LANGUAGE RecordWildCards           #-}
    {-# LANGUAGE ScopedTypeVariables       #-}
    {-# LANGUAGE TypeFamilies              #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Aws.DynamoDb.Commands.DeleteItem
    -- Copyright   :  Soostone Inc
    -- License     :  BSD3
    --
    -- Maintainer  :  Ozgun Ataman <ozgun.ataman@soostone.com>
    -- Stability   :  experimental
    --
    -- @http:\/\/docs.aws.amazon.com\/amazondynamodb\/latest\/APIReference\/API_DeleteItem.html@
    ----------------------------------------------------------------------------

    module Aws.DynamoDb.Commands.DeleteItem where

    -------------------------------------------------------------------------------
    import           Control.Applicative
    import           Data.Aeson
    import           Data.Default
    import qualified Data.Text           as T
    import           Prelude
    -------------------------------------------------------------------------------
    import           Aws.Core
    import           Aws.DynamoDb.Core
    -------------------------------------------------------------------------------

    data DeleteItem = DeleteItem {
          DeleteItem -> Text
    diTable   :: T.Text
        -- ^ Target table
        , DeleteItem -> PrimaryKey
    diKey     :: PrimaryKey
        -- ^ The item to delete.
        , DeleteItem -> Conditions
    diExpect  :: Conditions
        -- ^ (Possible) set of expections for a conditional Put
        , DeleteItem -> UpdateReturn
    diReturn  :: UpdateReturn
        -- ^ What to return from this query.
        , DeleteItem -> ReturnConsumption
    diRetCons :: ReturnConsumption
        , DeleteItem -> ReturnItemCollectionMetrics
    diRetMet  :: ReturnItemCollectionMetrics
        } deriving (DeleteItem -> DeleteItem -> Bool
    (DeleteItem -> DeleteItem -> Bool)
    -> (DeleteItem -> DeleteItem -> Bool) -> Eq DeleteItem
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: DeleteItem -> DeleteItem -> Bool
    == :: DeleteItem -> DeleteItem -> Bool
    $c/= :: DeleteItem -> DeleteItem -> Bool
    /= :: DeleteItem -> DeleteItem -> Bool
    Eq,Int -> DeleteItem -> ShowS
    [DeleteItem] -> ShowS
    DeleteItem -> String
    (Int -> DeleteItem -> ShowS)
    -> (DeleteItem -> String)
    -> ([DeleteItem] -> ShowS)
    -> Show DeleteItem
    forall a.
    (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Int -> DeleteItem -> ShowS
    showsPrec :: Int -> DeleteItem -> ShowS
    $cshow :: DeleteItem -> String
    show :: DeleteItem -> String
    $cshowList :: [DeleteItem] -> ShowS
    showList :: [DeleteItem] -> ShowS
    Show,ReadPrec [DeleteItem]
    ReadPrec DeleteItem
    Int -> ReadS DeleteItem
    ReadS [DeleteItem]
    (Int -> ReadS DeleteItem)
    -> ReadS [DeleteItem]
    -> ReadPrec DeleteItem
    -> ReadPrec [DeleteItem]
    -> Read DeleteItem
    forall a.
    (Int -> ReadS a)
    -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
    $creadsPrec :: Int -> ReadS DeleteItem
    readsPrec :: Int -> ReadS DeleteItem
    $creadList :: ReadS [DeleteItem]
    readList :: ReadS [DeleteItem]
    $creadPrec :: ReadPrec DeleteItem
    readPrec :: ReadPrec DeleteItem
    $creadListPrec :: ReadPrec [DeleteItem]
    readListPrec :: ReadPrec [DeleteItem]
    Read,Eq DeleteItem
    Eq DeleteItem =>
    (DeleteItem -> DeleteItem -> Ordering)
    -> (DeleteItem -> DeleteItem -> Bool)
    -> (DeleteItem -> DeleteItem -> Bool)
    -> (DeleteItem -> DeleteItem -> Bool)
    -> (DeleteItem -> DeleteItem -> Bool)
    -> (DeleteItem -> DeleteItem -> DeleteItem)
    -> (DeleteItem -> DeleteItem -> DeleteItem)
    -> Ord DeleteItem
    DeleteItem -> DeleteItem -> Bool
    DeleteItem -> DeleteItem -> Ordering
    DeleteItem -> DeleteItem -> DeleteItem
    forall a.
    Eq a =>
    (a -> a -> Ordering)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> a)
    -> (a -> a -> a)
    -> Ord a
    $ccompare :: DeleteItem -> DeleteItem -> Ordering
    compare :: DeleteItem -> DeleteItem -> Ordering
    $c< :: DeleteItem -> DeleteItem -> Bool
    < :: DeleteItem -> DeleteItem -> Bool
    $c<= :: DeleteItem -> DeleteItem -> Bool
    <= :: DeleteItem -> DeleteItem -> Bool
    $c> :: DeleteItem -> DeleteItem -> Bool
    > :: DeleteItem -> DeleteItem -> Bool
    $c>= :: DeleteItem -> DeleteItem -> Bool
    >= :: DeleteItem -> DeleteItem -> Bool
    $cmax :: DeleteItem -> DeleteItem -> DeleteItem
    max :: DeleteItem -> DeleteItem -> DeleteItem
    $cmin :: DeleteItem -> DeleteItem -> DeleteItem
    min :: DeleteItem -> DeleteItem -> DeleteItem
    Ord)

    -------------------------------------------------------------------------------
    -- | Construct a minimal 'DeleteItem' request.
    deleteItem :: T.Text
            -- ^ A Dynamo table name
            -> PrimaryKey
            -- ^ Item to be saved
            -> DeleteItem
    deleteItem :: Text -> PrimaryKey -> DeleteItem
    deleteItem Text
    tn PrimaryKey
    key = Text
    -> PrimaryKey
    -> Conditions
    -> UpdateReturn
    -> ReturnConsumption
    -> ReturnItemCollectionMetrics
    -> DeleteItem
    DeleteItem Text
    tn PrimaryKey
    key Conditions
    forall a. Default a => a
    def UpdateReturn
    forall a. Default a => a
    def ReturnConsumption
    forall a. Default a => a
    def ReturnItemCollectionMetrics
    forall a. Default a => a
    def

    instance ToJSON DeleteItem where
        toJSON :: DeleteItem -> Value
    toJSON DeleteItem{Text
    UpdateReturn
    ReturnItemCollectionMetrics
    ReturnConsumption
    Conditions
    PrimaryKey
    diTable :: DeleteItem -> Text
    diKey :: DeleteItem -> PrimaryKey
    diExpect :: DeleteItem -> Conditions
    diReturn :: DeleteItem -> UpdateReturn
    diRetCons :: DeleteItem -> ReturnConsumption
    diRetMet :: DeleteItem -> ReturnItemCollectionMetrics
    diTable :: Text
    diKey :: PrimaryKey
    diExpect :: Conditions
    diReturn :: UpdateReturn
    diRetCons :: ReturnConsumption
    diRetMet :: ReturnItemCollectionMetrics
    ..} =
            [Pair] -> Value
    object ([Pair] -> Value) -> [Pair] -> Value
    forall a b. (a -> b) -> a -> b
    $ Conditions -> [Pair]
    expectsJson Conditions
    diExpect [Pair] -> [Pair] -> [Pair]
    forall a. [a] -> [a] -> [a]
    ++
              [ Key
    "TableName" Key -> Text -> Pair
    forall v. ToJSON v => Key -> v -> Pair
    forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
    .= Text
    diTable
              , Key
    "Key" Key -> PrimaryKey -> Pair
    forall v. ToJSON v => Key -> v -> Pair
    forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
    .= PrimaryKey
    diKey
              , Key
    "ReturnValues" Key -> UpdateReturn -> Pair
    forall v. ToJSON v => Key -> v -> Pair
    forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
    .= UpdateReturn
    diReturn
              , Key
    "ReturnConsumedCapacity" Key -> ReturnConsumption -> Pair
    forall v. ToJSON v => Key -> v -> Pair
    forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
    .= ReturnConsumption
    diRetCons
              , Key
    "ReturnItemCollectionMetrics" Key -> ReturnItemCollectionMetrics -> Pair
    forall v. ToJSON v => Key -> v -> Pair
    forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
    .= ReturnItemCollectionMetrics
    diRetMet
              ]

    data DeleteItemResponse = DeleteItemResponse {
          DeleteItemResponse -> Maybe Item
    dirAttrs    :: Maybe Item
        -- ^ Old attributes, if requested
        , DeleteItemResponse -> Maybe ConsumedCapacity
    dirConsumed :: Maybe ConsumedCapacity
        -- ^ Amount of capacity consumed
        , DeleteItemResponse -> Maybe ItemCollectionMetrics
    dirColMet   :: Maybe ItemCollectionMetrics
        -- ^ Collection metrics if they have been requested.
        } deriving (DeleteItemResponse -> DeleteItemResponse -> Bool
    (DeleteItemResponse -> DeleteItemResponse -> Bool)
    -> (DeleteItemResponse -> DeleteItemResponse -> Bool)
    -> Eq DeleteItemResponse
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: DeleteItemResponse -> DeleteItemResponse -> Bool
    == :: DeleteItemResponse -> DeleteItemResponse -> Bool
    $c/= :: DeleteItemResponse -> DeleteItemResponse -> Bool
    /= :: DeleteItemResponse -> DeleteItemResponse -> Bool
    Eq,Int -> DeleteItemResponse -> ShowS
    [DeleteItemResponse] -> ShowS
    DeleteItemResponse -> String
    (Int -> DeleteItemResponse -> ShowS)
    -> (DeleteItemResponse -> String)
    -> ([DeleteItemResponse] -> ShowS)
    -> Show DeleteItemResponse
    forall a.
    (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Int -> DeleteItemResponse -> ShowS
    showsPrec :: Int -> DeleteItemResponse -> ShowS
    $cshow :: DeleteItemResponse -> String
    show :: DeleteItemResponse -> String
    $cshowList :: [DeleteItemResponse] -> ShowS
    showList :: [DeleteItemResponse] -> ShowS
    Show,ReadPrec [DeleteItemResponse]
    ReadPrec DeleteItemResponse
    Int -> ReadS DeleteItemResponse
    ReadS [DeleteItemResponse]
    (Int -> ReadS DeleteItemResponse)
    -> ReadS [DeleteItemResponse]
    -> ReadPrec DeleteItemResponse
    -> ReadPrec [DeleteItemResponse]
    -> Read DeleteItemResponse
    forall a.
    (Int -> ReadS a)
    -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
    $creadsPrec :: Int -> ReadS DeleteItemResponse
    readsPrec :: Int -> ReadS DeleteItemResponse
    $creadList :: ReadS [DeleteItemResponse]
    readList :: ReadS [DeleteItemResponse]
    $creadPrec :: ReadPrec DeleteItemResponse
    readPrec :: ReadPrec DeleteItemResponse
    $creadListPrec :: ReadPrec [DeleteItemResponse]
    readListPrec :: ReadPrec [DeleteItemResponse]
    Read,Eq DeleteItemResponse
    Eq DeleteItemResponse =>
    (DeleteItemResponse -> DeleteItemResponse -> Ordering)
    -> (DeleteItemResponse -> DeleteItemResponse -> Bool)
    -> (DeleteItemResponse -> DeleteItemResponse -> Bool)
    -> (DeleteItemResponse -> DeleteItemResponse -> Bool)
    -> (DeleteItemResponse -> DeleteItemResponse -> Bool)
    -> (DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse)
    -> (DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse)
    -> Ord DeleteItemResponse
    DeleteItemResponse -> DeleteItemResponse -> Bool
    DeleteItemResponse -> DeleteItemResponse -> Ordering
    DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse
    forall a.
    Eq a =>
    (a -> a -> Ordering)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> a)
    -> (a -> a -> a)
    -> Ord a
    $ccompare :: DeleteItemResponse -> DeleteItemResponse -> Ordering
    compare :: DeleteItemResponse -> DeleteItemResponse -> Ordering
    $c< :: DeleteItemResponse -> DeleteItemResponse -> Bool
    < :: DeleteItemResponse -> DeleteItemResponse -> Bool
    $c<= :: DeleteItemResponse -> DeleteItemResponse -> Bool
    <= :: DeleteItemResponse -> DeleteItemResponse -> Bool
    $c> :: DeleteItemResponse -> DeleteItemResponse -> Bool
    > :: DeleteItemResponse -> DeleteItemResponse -> Bool
    $c>= :: DeleteItemResponse -> DeleteItemResponse -> Bool
    >= :: DeleteItemResponse -> DeleteItemResponse -> Bool
    $cmax :: DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse
    max :: DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse
    $cmin :: DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse
    min :: DeleteItemResponse -> DeleteItemResponse -> DeleteItemResponse
    Ord)

    instance Transaction DeleteItem DeleteItemResponse

    instance SignQuery DeleteItem where
        type ServiceConfiguration DeleteItem = DdbConfiguration
        signQuery :: forall queryType.
    DeleteItem
    -> ServiceConfiguration DeleteItem queryType
    -> SignatureData
    -> SignedQuery
    signQuery DeleteItem
    gi = ByteString
    -> DeleteItem
    -> DdbConfiguration queryType
    -> SignatureData
    -> SignedQuery
    forall a qt.
    ToJSON a =>
    ByteString
    -> a -> DdbConfiguration qt -> SignatureData -> SignedQuery
    ddbSignQuery ByteString
    "DeleteItem" DeleteItem
    gi

    instance FromJSON DeleteItemResponse where
        parseJSON :: Value -> Parser DeleteItemResponse
    parseJSON (Object Object
    v) = Maybe Item
    -> Maybe ConsumedCapacity
    -> Maybe ItemCollectionMetrics
    -> DeleteItemResponse
    DeleteItemResponse
            (Maybe Item
     -> Maybe ConsumedCapacity
     -> Maybe ItemCollectionMetrics
     -> DeleteItemResponse)
    -> Parser (Maybe Item)
    -> Parser
         (Maybe ConsumedCapacity
          -> Maybe ItemCollectionMetrics -> DeleteItemResponse)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Object
    v Object -> Key -> Parser (Maybe Item)
    forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
    .:? Key
    "Attributes"
            Parser
      (Maybe ConsumedCapacity
       -> Maybe ItemCollectionMetrics -> DeleteItemResponse)
    -> Parser (Maybe ConsumedCapacity)
    -> Parser (Maybe ItemCollectionMetrics -> DeleteItemResponse)
    forall a b. Parser (a -> b) -> Parser a -> Parser b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> Object
    v Object -> Key -> Parser (Maybe ConsumedCapacity)
    forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
    .:? Key
    "ConsumedCapacity"
            Parser (Maybe ItemCollectionMetrics -> DeleteItemResponse)
    -> Parser (Maybe ItemCollectionMetrics)
    -> Parser DeleteItemResponse
    forall a b. Parser (a -> b) -> Parser a -> Parser b
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
    <*> Object
    v Object -> Key -> Parser (Maybe ItemCollectionMetrics)
    forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
    .:? Key
    "ItemCollectionMetrics"
        parseJSON Value
    _ = String -> Parser DeleteItemResponse
    forall a. String -> Parser a
    forall (m :: * -> *) a. MonadFail m => String -> m a
    fail String
    "DeleteItemResponse must be an object."

    instance ResponseConsumer r DeleteItemResponse where
        type ResponseMetadata DeleteItemResponse = DdbResponse
        responseConsumer :: Request
    -> r
    -> IORef (ResponseMetadata DeleteItemResponse)
    -> HTTPResponseConsumer DeleteItemResponse
    responseConsumer Request
    _ r
    _ IORef (ResponseMetadata DeleteItemResponse)
    ref Response (ConduitM () ByteString (ResourceT IO) ())
    resp = IORef DdbResponse -> HTTPResponseConsumer DeleteItemResponse
    forall a. FromJSON a => IORef DdbResponse -> HTTPResponseConsumer a
    ddbResponseConsumer IORef (ResponseMetadata DeleteItemResponse)
    IORef DdbResponse
    ref Response (ConduitM () ByteString (ResourceT IO) ())
    resp

    instance AsMemoryResponse DeleteItemResponse where
        type MemoryResponse DeleteItemResponse = DeleteItemResponse
        loadToMemory :: DeleteItemResponse
    -> ResourceT IO (MemoryResponse DeleteItemResponse)
    loadToMemory = DeleteItemResponse
    -> ResourceT IO (MemoryResponse DeleteItemResponse)
    DeleteItemResponse -> ResourceT IO DeleteItemResponse
    forall a. a -> ResourceT IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return