packages feed

aws-0.0.4: Aws/S3/Commands/GetBucket.hs

{-# LANGUAGE TypeFamilies, RecordWildCards, TupleSections, OverloadedStrings, MultiParamTypeClasses, FlexibleInstances #-}
module Aws.S3.Commands.GetBucket
where

import           Aws.Response
import           Aws.S3.Info
import           Aws.S3.Metadata
import           Aws.S3.Model
import           Aws.S3.Query
import           Aws.S3.Response
import           Aws.Signature
import           Aws.Transaction
import           Aws.Xml
import           Control.Applicative
import           Control.Arrow              (second)
import           Data.ByteString.Char8      ({- IsString -})
import           Data.Maybe
import           Text.XML.Enumerator.Cursor (($/), (&|), (&//))
import qualified Data.ByteString.UTF8       as BU
import qualified Data.Text                  as T
import qualified Data.Traversable
import qualified Network.HTTP.Types         as HTTP
import qualified Text.XML.Enumerator.Cursor as Cu

data GetBucket
    = GetBucket {
        gbBucket    :: Bucket
      , gbDelimiter :: Maybe String
      , gbMarker    :: Maybe String
      , gbMaxKeys   :: Maybe Int
      , gbPrefix    :: Maybe String
      }
    deriving (Show)

getBucket :: Bucket -> GetBucket
getBucket bucket 
    = GetBucket { 
        gbBucket    = bucket
      , gbDelimiter = Nothing
      , gbMarker    = Nothing
      , gbMaxKeys   = Nothing
      , gbPrefix    = Nothing
      }

data GetBucketResponse
    = GetBucketResponse {
        gbrName           :: Bucket
      , gbrDelimiter      :: Maybe String
      , gbrMarker         :: Maybe String
      , gbrMaxKeys        :: Maybe Int
      , gbrPrefix         :: Maybe String
      , gbrContents       :: [ObjectInfo]
      , gbrCommonPrefixes :: [String]
      }
    deriving (Show)

instance SignQuery GetBucket where
    type Info GetBucket = S3Info
    signQuery GetBucket {..} = s3SignQuery S3Query { 
                                 s3QBucket = Just $ BU.fromString gbBucket
                               , s3QSubresources = []
                               , s3QQuery = HTTP.simpleQueryToQuery $ map (second BU.fromString) $ catMaybes [
                                              ("delimiter",) <$> gbDelimiter
                                            , ("marker",) <$> gbMarker
                                            , ("max-keys",) <$> show <$> gbMaxKeys
                                            , ("prefix",) <$> gbPrefix
                                            ]
                               }

instance ResponseIteratee GetBucketResponse where
    type ResponseMetadata GetBucketResponse = S3Metadata

    responseIteratee = s3XmlResponseIteratee parse
        where parse cursor
                  = do name <- force "Missing Name" $ cursor $/ elCont "Name"
                       let delimiter = listToMaybe $ cursor $/ elCont "Delimiter"
                       let marker = listToMaybe $ cursor $/ elCont "Marker"
                       maxKeys <- Data.Traversable.sequence . listToMaybe $ cursor $/ elCont "MaxKeys" &| readInt
                       let prefix = listToMaybe $ cursor $/ elCont "Prefix"
                       contents <- sequence $ cursor $/ Cu.laxElement "Contents" &| parseObjectInfo
                       let commonPrefixes = cursor $/ Cu.laxElement "CommonPrefixes" &// Cu.content &| T.unpack
                       return GetBucketResponse{
                                                gbrName           = name
                                              , gbrDelimiter      = delimiter
                                              , gbrMarker         = marker
                                              , gbrMaxKeys        = maxKeys
                                              , gbrPrefix         = prefix
                                              , gbrContents       = contents
                                              , gbrCommonPrefixes = commonPrefixes
                                              }

instance Transaction GetBucket GetBucketResponse