module Network.AWS.StorageGateway.DescribeTapes
    (
    
      describeTapes
    , DescribeTapes
    
    , dtMarker
    , dtLimit
    , dtTapeARNs
    , dtGatewayARN
    
    , describeTapesResponse
    , DescribeTapesResponse
    
    , dtsrsMarker
    , dtsrsTapes
    , dtsrsStatus
    ) where
import           Network.AWS.Pager
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response
import           Network.AWS.StorageGateway.Types
import           Network.AWS.StorageGateway.Types.Product
data DescribeTapes = DescribeTapes'
    { _dtMarker     :: !(Maybe Text)
    , _dtLimit      :: !(Maybe Nat)
    , _dtTapeARNs   :: !(Maybe [Text])
    , _dtGatewayARN :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)
describeTapes
    :: Text 
    -> DescribeTapes
describeTapes pGatewayARN_ =
    DescribeTapes'
    { _dtMarker = Nothing
    , _dtLimit = Nothing
    , _dtTapeARNs = Nothing
    , _dtGatewayARN = pGatewayARN_
    }
dtMarker :: Lens' DescribeTapes (Maybe Text)
dtMarker = lens _dtMarker (\ s a -> s{_dtMarker = a});
dtLimit :: Lens' DescribeTapes (Maybe Natural)
dtLimit = lens _dtLimit (\ s a -> s{_dtLimit = a}) . mapping _Nat;
dtTapeARNs :: Lens' DescribeTapes [Text]
dtTapeARNs = lens _dtTapeARNs (\ s a -> s{_dtTapeARNs = a}) . _Default . _Coerce;
dtGatewayARN :: Lens' DescribeTapes Text
dtGatewayARN = lens _dtGatewayARN (\ s a -> s{_dtGatewayARN = a});
instance AWSPager DescribeTapes where
        page rq rs
          | stop (rs ^. dtsrsMarker) = Nothing
          | stop (rs ^. dtsrsTapes) = Nothing
          | otherwise =
            Just $ rq & dtMarker .~ rs ^. dtsrsMarker
instance AWSRequest DescribeTapes where
        type Rs DescribeTapes = DescribeTapesResponse
        request = postJSON storageGateway
        response
          = receiveJSON
              (\ s h x ->
                 DescribeTapesResponse' <$>
                   (x .?> "Marker") <*> (x .?> "Tapes" .!@ mempty) <*>
                     (pure (fromEnum s)))
instance ToHeaders DescribeTapes where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("StorageGateway_20130630.DescribeTapes" ::
                       ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])
instance ToJSON DescribeTapes where
        toJSON DescribeTapes'{..}
          = object
              (catMaybes
                 [("Marker" .=) <$> _dtMarker,
                  ("Limit" .=) <$> _dtLimit,
                  ("TapeARNs" .=) <$> _dtTapeARNs,
                  Just ("GatewayARN" .= _dtGatewayARN)])
instance ToPath DescribeTapes where
        toPath = const "/"
instance ToQuery DescribeTapes where
        toQuery = const mempty
data DescribeTapesResponse = DescribeTapesResponse'
    { _dtsrsMarker :: !(Maybe Text)
    , _dtsrsTapes  :: !(Maybe [Tape])
    , _dtsrsStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)
describeTapesResponse
    :: Int 
    -> DescribeTapesResponse
describeTapesResponse pStatus_ =
    DescribeTapesResponse'
    { _dtsrsMarker = Nothing
    , _dtsrsTapes = Nothing
    , _dtsrsStatus = pStatus_
    }
dtsrsMarker :: Lens' DescribeTapesResponse (Maybe Text)
dtsrsMarker = lens _dtsrsMarker (\ s a -> s{_dtsrsMarker = a});
dtsrsTapes :: Lens' DescribeTapesResponse [Tape]
dtsrsTapes = lens _dtsrsTapes (\ s a -> s{_dtsrsTapes = a}) . _Default . _Coerce;
dtsrsStatus :: Lens' DescribeTapesResponse Int
dtsrsStatus = lens _dtsrsStatus (\ s a -> s{_dtsrsStatus = a});