module Network.AWS.S3.ListObjects
    (
    
      ListObjects
    
    , listObjects
    
    , loBucket
    , loDelimiter
    , loEncodingType
    , loMarker
    , loMaxKeys
    , loPrefix
    
    , ListObjectsResponse
    
    , listObjectsResponse
    
    , lorCommonPrefixes
    , lorContents
    , lorDelimiter
    , lorEncodingType
    , lorIsTruncated
    , lorMarker
    , lorMaxKeys
    , lorName
    , lorNextMarker
    , lorPrefix
    ) where
import Network.AWS.Prelude
import Network.AWS.Request.S3
import Network.AWS.S3.Types
import qualified GHC.Exts
data ListObjects = ListObjects
    { _loBucket       :: Text
    , _loDelimiter    :: Maybe Text
    , _loEncodingType :: Maybe EncodingType
    , _loMarker       :: Maybe Text
    , _loMaxKeys      :: Maybe Int
    , _loPrefix       :: Maybe Text
    } deriving (Eq, Show)
listObjects :: Text 
            -> ListObjects
listObjects p1 = ListObjects
    { _loBucket       = p1
    , _loDelimiter    = Nothing
    , _loEncodingType = Nothing
    , _loMarker       = Nothing
    , _loMaxKeys      = Nothing
    , _loPrefix       = Nothing
    }
loBucket :: Lens' ListObjects Text
loBucket = lens _loBucket (\s a -> s { _loBucket = a })
loDelimiter :: Lens' ListObjects (Maybe Text)
loDelimiter = lens _loDelimiter (\s a -> s { _loDelimiter = a })
loEncodingType :: Lens' ListObjects (Maybe EncodingType)
loEncodingType = lens _loEncodingType (\s a -> s { _loEncodingType = a })
loMarker :: Lens' ListObjects (Maybe Text)
loMarker = lens _loMarker (\s a -> s { _loMarker = a })
loMaxKeys :: Lens' ListObjects (Maybe Int)
loMaxKeys = lens _loMaxKeys (\s a -> s { _loMaxKeys = a })
loPrefix :: Lens' ListObjects (Maybe Text)
loPrefix = lens _loPrefix (\s a -> s { _loPrefix = a })
data ListObjectsResponse = ListObjectsResponse
    { _lorCommonPrefixes :: List "CommonPrefixes" CommonPrefix
    , _lorContents       :: List "Contents" Object
    , _lorDelimiter      :: Maybe Text
    , _lorEncodingType   :: Maybe EncodingType
    , _lorIsTruncated    :: Maybe Bool
    , _lorMarker         :: Maybe Text
    , _lorMaxKeys        :: Maybe Int
    , _lorName           :: Maybe Text
    , _lorNextMarker     :: Maybe Text
    , _lorPrefix         :: Maybe Text
    } deriving (Eq, Show)
listObjectsResponse :: ListObjectsResponse
listObjectsResponse = ListObjectsResponse
    { _lorIsTruncated    = Nothing
    , _lorMarker         = Nothing
    , _lorNextMarker     = Nothing
    , _lorContents       = mempty
    , _lorName           = Nothing
    , _lorPrefix         = Nothing
    , _lorDelimiter      = Nothing
    , _lorMaxKeys        = Nothing
    , _lorCommonPrefixes = mempty
    , _lorEncodingType   = Nothing
    }
lorCommonPrefixes :: Lens' ListObjectsResponse [CommonPrefix]
lorCommonPrefixes =
    lens _lorCommonPrefixes (\s a -> s { _lorCommonPrefixes = a })
        . _List
lorContents :: Lens' ListObjectsResponse [Object]
lorContents = lens _lorContents (\s a -> s { _lorContents = a }) . _List
lorDelimiter :: Lens' ListObjectsResponse (Maybe Text)
lorDelimiter = lens _lorDelimiter (\s a -> s { _lorDelimiter = a })
lorEncodingType :: Lens' ListObjectsResponse (Maybe EncodingType)
lorEncodingType = lens _lorEncodingType (\s a -> s { _lorEncodingType = a })
lorIsTruncated :: Lens' ListObjectsResponse (Maybe Bool)
lorIsTruncated = lens _lorIsTruncated (\s a -> s { _lorIsTruncated = a })
lorMarker :: Lens' ListObjectsResponse (Maybe Text)
lorMarker = lens _lorMarker (\s a -> s { _lorMarker = a })
lorMaxKeys :: Lens' ListObjectsResponse (Maybe Int)
lorMaxKeys = lens _lorMaxKeys (\s a -> s { _lorMaxKeys = a })
lorName :: Lens' ListObjectsResponse (Maybe Text)
lorName = lens _lorName (\s a -> s { _lorName = a })
lorNextMarker :: Lens' ListObjectsResponse (Maybe Text)
lorNextMarker = lens _lorNextMarker (\s a -> s { _lorNextMarker = a })
lorPrefix :: Lens' ListObjectsResponse (Maybe Text)
lorPrefix = lens _lorPrefix (\s a -> s { _lorPrefix = a })
instance ToPath ListObjects where
    toPath ListObjects{..} = mconcat
        [ "/"
        , toText _loBucket
        ]
instance ToQuery ListObjects where
    toQuery ListObjects{..} = mconcat
        [ "delimiter"     =? _loDelimiter
        , "encoding-type" =? _loEncodingType
        , "marker"        =? _loMarker
        , "max-keys"      =? _loMaxKeys
        , "prefix"        =? _loPrefix
        ]
instance ToHeaders ListObjects
instance ToXMLRoot ListObjects where
    toXMLRoot = const (namespaced ns "ListObjects" [])
instance ToXML ListObjects
instance AWSRequest ListObjects where
    type Sv ListObjects = S3
    type Rs ListObjects = ListObjectsResponse
    request  = get
    response = xmlResponse
instance FromXML ListObjectsResponse where
    parseXML x = ListObjectsResponse
        <$> parseXML x
        <*> parseXML x
        <*> x .@? "Delimiter"
        <*> x .@? "EncodingType"
        <*> x .@? "IsTruncated"
        <*> x .@? "Marker"
        <*> x .@? "MaxKeys"
        <*> x .@? "Name"
        <*> x .@? "NextMarker"
        <*> x .@? "Prefix"
instance AWSPager ListObjects where
    page rq rs
        | stop (rs ^. lorIsTruncated) = Nothing
        | otherwise = Just $ rq
            & loMarker .~ rs ^. lorNextMarker