module Aws.DynamoDb.Streams.Commands.GetShardIterator
( 
  GetShardIterator(..)
, getShardIterator
  
, gsiSequenceNumber
, gsiShardId
, gsiShardIteratorType
, gsiStreamId
  
, GetShardIteratorResponse(..)
  
, gsirShardIterator
) where
import Aws.Core
import Aws.DynamoDb.Streams.Core
import Aws.DynamoDb.Streams.Types
import Control.Applicative
import Control.Applicative.Unicode
import Data.Aeson
import Data.Typeable
data GetShardIterator
  = GetShardIterator
  { _gsiSequenceNumber ∷ !(Maybe SequenceNumber)
    
    
  , _gsiShardId ∷ !ShardId
    
  , _gsiShardIteratorType ∷ !ShardIteratorType
    
    
  , _gsiStreamId ∷ !StreamId
  } deriving (Eq, Ord, Read, Show, Typeable)
getShardIterator
  ∷ StreamId
  → ShardId
  → ShardIteratorType
  → GetShardIterator
getShardIterator stream shard iteratorType =
  GetShardIterator
    { _gsiStreamId = stream
    , _gsiShardIteratorType = iteratorType
    , _gsiShardId = shard
    , _gsiSequenceNumber = Nothing
    }
instance ToJSON GetShardIterator where
  toJSON GetShardIterator{..} = object
    [ "SequenceNumber" .= _gsiSequenceNumber
    , "ShardId" .= _gsiShardId
    , "ShardIteratorType" .= _gsiShardIteratorType
    , "StreamId" .= _gsiStreamId
    ]
instance FromJSON GetShardIterator where
  parseJSON =
    withObject "GetShardIterator" $ \o →
      pure GetShardIterator
        ⊛ o .:? "SequenceNumber"
        ⊛ o .: "ShardId"
        ⊛ o .: "ShardIteratorType"
        ⊛ o .: "StreamId"
gsiSequenceNumber
  ∷ Functor f
  ⇒ (Maybe SequenceNumber → f (Maybe SequenceNumber))
  → GetShardIterator
  → f GetShardIterator
gsiSequenceNumber i GetShardIterator{..} =
  (\_gsiSequenceNumber → GetShardIterator{..})
    <$> i _gsiSequenceNumber
gsiShardId
  ∷ Functor f
  ⇒ (ShardId → f ShardId)
  → GetShardIterator
  → f GetShardIterator
gsiShardId i GetShardIterator{..} =
  (\_gsiShardId → GetShardIterator{..})
    <$> i _gsiShardId
gsiShardIteratorType
  ∷ Functor f
  ⇒ (ShardIteratorType → f ShardIteratorType)
  → GetShardIterator
  → f GetShardIterator
gsiShardIteratorType i GetShardIterator{..} =
  (\_gsiShardIteratorType → GetShardIterator{..})
    <$> i _gsiShardIteratorType
gsiStreamId
  ∷ Functor f
  ⇒ (StreamId → f StreamId)
  → GetShardIterator
  → f GetShardIterator
gsiStreamId i GetShardIterator{..} =
  (\_gsiStreamId → GetShardIterator{..})
    <$> i _gsiStreamId
data GetShardIteratorResponse
  = GetShardIteratorResponse
  { _gsirShardIterator ∷ !ShardIterator
  } deriving (Eq, Ord, Show, Read, Typeable)
instance ToJSON GetShardIteratorResponse where
  toJSON GetShardIteratorResponse{..} = object
    [ "ShardIterator" .= _gsirShardIterator
    ]
instance FromJSON GetShardIteratorResponse where
  parseJSON =
    withObject "GetShardIteratorResponse" $ \o →
      GetShardIteratorResponse
        <$> o .: "ShardIterator"
gsirShardIterator
  ∷ Functor f
  ⇒ (ShardIterator → f ShardIterator)
  → GetShardIteratorResponse
  → f GetShardIteratorResponse
gsirShardIterator i GetShardIteratorResponse{..} =
  (\_gsirShardIterator → GetShardIteratorResponse{..})
    <$> i _gsirShardIterator
instance ResponseConsumer r GetShardIteratorResponse where
  type ResponseMetadata GetShardIteratorResponse = StreamsMetadata
  responseConsumer _ = streamsResponseConsumer
instance SignQuery GetShardIterator where
  type ServiceConfiguration GetShardIterator = StreamsConfiguration
  signQuery cmd = streamsSignQuery StreamsQuery
    { _stqAction = ActionGetShardIterator
    , _stqBody = encode cmd
    }
instance Transaction GetShardIterator GetShardIteratorResponse
instance AsMemoryResponse GetShardIteratorResponse where
  type MemoryResponse GetShardIteratorResponse = GetShardIteratorResponse
  loadToMemory = return