module Network.AWS.StorageGateway.DescribeVTLDevices
    (
    
      describeVTLDevices
    , DescribeVTLDevices
    
    , dvtldMarker
    , dvtldLimit
    , dvtldVTLDeviceARNs
    , dvtldGatewayARN
    
    , describeVTLDevicesResponse
    , DescribeVTLDevicesResponse
    
    , dvtldrsGatewayARN
    , dvtldrsVTLDevices
    , dvtldrsMarker
    , dvtldrsStatus
    ) 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 DescribeVTLDevices = DescribeVTLDevices'
    { _dvtldMarker        :: !(Maybe Text)
    , _dvtldLimit         :: !(Maybe Nat)
    , _dvtldVTLDeviceARNs :: !(Maybe [Text])
    , _dvtldGatewayARN    :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)
describeVTLDevices
    :: Text 
    -> DescribeVTLDevices
describeVTLDevices pGatewayARN_ =
    DescribeVTLDevices'
    { _dvtldMarker = Nothing
    , _dvtldLimit = Nothing
    , _dvtldVTLDeviceARNs = Nothing
    , _dvtldGatewayARN = pGatewayARN_
    }
dvtldMarker :: Lens' DescribeVTLDevices (Maybe Text)
dvtldMarker = lens _dvtldMarker (\ s a -> s{_dvtldMarker = a});
dvtldLimit :: Lens' DescribeVTLDevices (Maybe Natural)
dvtldLimit = lens _dvtldLimit (\ s a -> s{_dvtldLimit = a}) . mapping _Nat;
dvtldVTLDeviceARNs :: Lens' DescribeVTLDevices [Text]
dvtldVTLDeviceARNs = lens _dvtldVTLDeviceARNs (\ s a -> s{_dvtldVTLDeviceARNs = a}) . _Default . _Coerce;
dvtldGatewayARN :: Lens' DescribeVTLDevices Text
dvtldGatewayARN = lens _dvtldGatewayARN (\ s a -> s{_dvtldGatewayARN = a});
instance AWSPager DescribeVTLDevices where
        page rq rs
          | stop (rs ^. dvtldrsMarker) = Nothing
          | stop (rs ^. dvtldrsVTLDevices) = Nothing
          | otherwise =
            Just $ rq & dvtldMarker .~ rs ^. dvtldrsMarker
instance AWSRequest DescribeVTLDevices where
        type Rs DescribeVTLDevices =
             DescribeVTLDevicesResponse
        request = postJSON storageGateway
        response
          = receiveJSON
              (\ s h x ->
                 DescribeVTLDevicesResponse' <$>
                   (x .?> "GatewayARN") <*>
                     (x .?> "VTLDevices" .!@ mempty)
                     <*> (x .?> "Marker")
                     <*> (pure (fromEnum s)))
instance ToHeaders DescribeVTLDevices where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("StorageGateway_20130630.DescribeVTLDevices" ::
                       ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])
instance ToJSON DescribeVTLDevices where
        toJSON DescribeVTLDevices'{..}
          = object
              (catMaybes
                 [("Marker" .=) <$> _dvtldMarker,
                  ("Limit" .=) <$> _dvtldLimit,
                  ("VTLDeviceARNs" .=) <$> _dvtldVTLDeviceARNs,
                  Just ("GatewayARN" .= _dvtldGatewayARN)])
instance ToPath DescribeVTLDevices where
        toPath = const "/"
instance ToQuery DescribeVTLDevices where
        toQuery = const mempty
data DescribeVTLDevicesResponse = DescribeVTLDevicesResponse'
    { _dvtldrsGatewayARN :: !(Maybe Text)
    , _dvtldrsVTLDevices :: !(Maybe [VTLDevice])
    , _dvtldrsMarker     :: !(Maybe Text)
    , _dvtldrsStatus     :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)
describeVTLDevicesResponse
    :: Int 
    -> DescribeVTLDevicesResponse
describeVTLDevicesResponse pStatus_ =
    DescribeVTLDevicesResponse'
    { _dvtldrsGatewayARN = Nothing
    , _dvtldrsVTLDevices = Nothing
    , _dvtldrsMarker = Nothing
    , _dvtldrsStatus = pStatus_
    }
dvtldrsGatewayARN :: Lens' DescribeVTLDevicesResponse (Maybe Text)
dvtldrsGatewayARN = lens _dvtldrsGatewayARN (\ s a -> s{_dvtldrsGatewayARN = a});
dvtldrsVTLDevices :: Lens' DescribeVTLDevicesResponse [VTLDevice]
dvtldrsVTLDevices = lens _dvtldrsVTLDevices (\ s a -> s{_dvtldrsVTLDevices = a}) . _Default . _Coerce;
dvtldrsMarker :: Lens' DescribeVTLDevicesResponse (Maybe Text)
dvtldrsMarker = lens _dvtldrsMarker (\ s a -> s{_dvtldrsMarker = a});
dvtldrsStatus :: Lens' DescribeVTLDevicesResponse Int
dvtldrsStatus = lens _dvtldrsStatus (\ s a -> s{_dvtldrsStatus = a});