{-# LANGUAGE ScopedTypeVariables #-}

module Antiope.S3.GetObject
  ( lazyByteString
  , getObject
  , getObjectForS3Uri
  ) where

import Antiope.S3.Types             (S3Uri (S3Uri))
import Control.Monad.Trans.AWS      hiding (send)
import Control.Monad.Trans.Resource
import Data.Conduit.Lazy            (lazyConsume)
import Network.AWS                  (MonadAWS)
import Network.AWS.Data.Body        (_streamBody)

import qualified Data.ByteString.Lazy as LBS
import qualified Network.AWS          as AWS
import qualified Network.AWS.S3       as AWS

-- | Access the response body as a lazy bytestring
lazyByteString :: MonadResource m => RsBody -> m LBS.ByteString
lazyByteString rsBody = liftResourceT $ LBS.fromChunks <$> lazyConsume (_streamBody rsBody)

getObject :: MonadAWS m
  => AWS.BucketName
  -> AWS.ObjectKey
  -> m (AWS.Rs AWS.GetObject)
getObject bucketName objectKey = AWS.send $ AWS.getObject bucketName objectKey

getObjectForS3Uri :: MonadAWS m
  => S3Uri
  -> m AWS.GetObjectResponse
getObjectForS3Uri (S3Uri bucketName objectKey) = getObject bucketName objectKey