minio-hs/src/Network/Minio/XmlParser.hs
Aditya Manthramurthy 2070a8e13f PutObjectPart and CompleteMultipartUpload with basic tests
- Functional tests are refactored
2017-02-13 16:03:42 +05:30

56 lines
2.1 KiB
Haskell

module Network.Minio.XmlParser
( parseListBuckets
, parseLocation
, parseNewMultipartUpload
, parseCompleteMultipartUploadResponse
) where
import Text.XML
import Text.XML.Cursor
import qualified Data.Text as T
import Data.Time
import Lib.Prelude
import Network.Minio.Data
-- | Represent the time format string returned by S3 API calls.
s3TimeFormat :: [Char]
s3TimeFormat = iso8601DateFormat $ Just "%T%QZ"
-- | Parse the response XML of a list buckets call.
parseListBuckets :: (MonadError MinioErr m) => LByteString -> m [BucketInfo]
parseListBuckets xmldata = do
doc <- either (throwError . MErrXml . show) return $ parseLBS def xmldata
let cursor = fromDocument doc
names = cursor $// element (s3Name "Bucket") &//
element (s3Name "Name") &/ content
timeStrings = cursor $// element (s3Name "Bucket") &//
element (s3Name "CreationDate") &/ content
times <- either (throwError . MErrXml) return $
mapM (parseTimeM True defaultTimeLocale s3TimeFormat . T.unpack)
timeStrings
return $ map (\(n, t) -> BucketInfo n t) $ zip names times
-- | Parse the response XML of a location request.
parseLocation :: (MonadError MinioErr m) => LByteString -> m Region
parseLocation xmldata = do
doc <- either (throwError . MErrXml . show) return $ parseLBS def xmldata
return $ T.concat $ fromDocument doc $/ content
-- | Parse the response XML of an newMultipartUpload call.
parseNewMultipartUpload :: (MonadError MinioErr m)
=> LByteString -> m UploadId
parseNewMultipartUpload xmldata = do
doc <- either (throwError . MErrXml . show) return $ parseLBS def xmldata
return $ T.concat $ fromDocument doc
$// element (s3Name "UploadId") &/ content
-- | Parse the response XML of completeMultipartUpload call.
parseCompleteMultipartUploadResponse :: (MonadError MinioErr m)
=> LByteString -> m ETag
parseCompleteMultipartUploadResponse xmldata = do
doc <- either (throwError . MErrXml . show) return $ parseLBS def xmldata
return $ T.concat $ fromDocument doc
$// element (s3Name "ETag") &/ content