module Network.AWS.CloudWatchLogs.DescribeMetricFilters
    (
    
      describeMetricFilters
    , DescribeMetricFilters
    
    , dmfFilterNamePrefix
    , dmfNextToken
    , dmfLimit
    , dmfLogGroupName
    
    , describeMetricFiltersResponse
    , DescribeMetricFiltersResponse
    
    , dmfrsNextToken
    , dmfrsMetricFilters
    , dmfrsStatus
    ) where
import           Network.AWS.CloudWatchLogs.Types
import           Network.AWS.CloudWatchLogs.Types.Product
import           Network.AWS.Pager
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response
data DescribeMetricFilters = DescribeMetricFilters'
    { _dmfFilterNamePrefix :: !(Maybe Text)
    , _dmfNextToken        :: !(Maybe Text)
    , _dmfLimit            :: !(Maybe Nat)
    , _dmfLogGroupName     :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)
describeMetricFilters
    :: Text 
    -> DescribeMetricFilters
describeMetricFilters pLogGroupName_ =
    DescribeMetricFilters'
    { _dmfFilterNamePrefix = Nothing
    , _dmfNextToken = Nothing
    , _dmfLimit = Nothing
    , _dmfLogGroupName = pLogGroupName_
    }
dmfFilterNamePrefix :: Lens' DescribeMetricFilters (Maybe Text)
dmfFilterNamePrefix = lens _dmfFilterNamePrefix (\ s a -> s{_dmfFilterNamePrefix = a});
dmfNextToken :: Lens' DescribeMetricFilters (Maybe Text)
dmfNextToken = lens _dmfNextToken (\ s a -> s{_dmfNextToken = a});
dmfLimit :: Lens' DescribeMetricFilters (Maybe Natural)
dmfLimit = lens _dmfLimit (\ s a -> s{_dmfLimit = a}) . mapping _Nat;
dmfLogGroupName :: Lens' DescribeMetricFilters Text
dmfLogGroupName = lens _dmfLogGroupName (\ s a -> s{_dmfLogGroupName = a});
instance AWSPager DescribeMetricFilters where
        page rq rs
          | stop (rs ^. dmfrsNextToken) = Nothing
          | stop (rs ^. dmfrsMetricFilters) = Nothing
          | otherwise =
            Just $ rq & dmfNextToken .~ rs ^. dmfrsNextToken
instance AWSRequest DescribeMetricFilters where
        type Rs DescribeMetricFilters =
             DescribeMetricFiltersResponse
        request = postJSON cloudWatchLogs
        response
          = receiveJSON
              (\ s h x ->
                 DescribeMetricFiltersResponse' <$>
                   (x .?> "nextToken") <*>
                     (x .?> "metricFilters" .!@ mempty)
                     <*> (pure (fromEnum s)))
instance ToHeaders DescribeMetricFilters where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("Logs_20140328.DescribeMetricFilters" ::
                       ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])
instance ToJSON DescribeMetricFilters where
        toJSON DescribeMetricFilters'{..}
          = object
              (catMaybes
                 [("filterNamePrefix" .=) <$> _dmfFilterNamePrefix,
                  ("nextToken" .=) <$> _dmfNextToken,
                  ("limit" .=) <$> _dmfLimit,
                  Just ("logGroupName" .= _dmfLogGroupName)])
instance ToPath DescribeMetricFilters where
        toPath = const "/"
instance ToQuery DescribeMetricFilters where
        toQuery = const mempty
data DescribeMetricFiltersResponse = DescribeMetricFiltersResponse'
    { _dmfrsNextToken     :: !(Maybe Text)
    , _dmfrsMetricFilters :: !(Maybe [MetricFilter])
    , _dmfrsStatus        :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)
describeMetricFiltersResponse
    :: Int 
    -> DescribeMetricFiltersResponse
describeMetricFiltersResponse pStatus_ =
    DescribeMetricFiltersResponse'
    { _dmfrsNextToken = Nothing
    , _dmfrsMetricFilters = Nothing
    , _dmfrsStatus = pStatus_
    }
dmfrsNextToken :: Lens' DescribeMetricFiltersResponse (Maybe Text)
dmfrsNextToken = lens _dmfrsNextToken (\ s a -> s{_dmfrsNextToken = a});
dmfrsMetricFilters :: Lens' DescribeMetricFiltersResponse [MetricFilter]
dmfrsMetricFilters = lens _dmfrsMetricFilters (\ s a -> s{_dmfrsMetricFilters = a}) . _Default . _Coerce;
dmfrsStatus :: Lens' DescribeMetricFiltersResponse Int
dmfrsStatus = lens _dmfrsStatus (\ s a -> s{_dmfrsStatus = a});