module Network.AWS.S3.Internal
( Region (..)
, BucketName (..)
, ETag (..)
, ObjectVersionId (..)
, Delimiter
, ObjectKey (..)
, _ObjectKey
, keyPrefix
, keyName
, keyComponents
) where
import Control.Lens
import Data.String
import qualified Data.Text as Text
import Network.AWS.Data.Log
import Network.AWS.Data.XML
import Network.AWS.Prelude
newtype BucketName = BucketName Text
deriving
( Eq
, Ord
, Read
, Show
, Data
, Typeable
, Generic
, IsString
, FromText
, ToText
, ToByteString
, FromXML
, ToXML
, ToQuery
, ToLog
)
newtype ETag = ETag ByteString
deriving
( Eq
, Ord
, Read
, Show
, Data
, Typeable
, Generic
, IsString
, FromText
, ToText
, ToByteString
, FromXML
, ToXML
, ToQuery
, ToLog
)
newtype ObjectVersionId = ObjectVersionId Text
deriving
( Eq
, Ord
, Read
, Show
, Data
, Typeable
, Generic
, IsString
, FromText
, ToText
, ToByteString
, FromXML
, ToXML
, ToQuery
, ToLog
)
newtype ObjectKey = ObjectKey Text
deriving
( Eq
, Ord
, Read
, Show
, Data
, Typeable
, Generic
, IsString
, FromText
, ToText
, ToByteString
, FromXML
, ToXML
, ToQuery
, ToPath
, ToLog
)
type Delimiter = Char
_ObjectKey :: Iso' ObjectKey Text
_ObjectKey = iso (\(ObjectKey k) -> k) ObjectKey
keyPrefix :: Delimiter -> Traversal' ObjectKey Text
keyPrefix c = _ObjectKeySnoc True c . _1
keyName :: Delimiter -> Traversal' ObjectKey Text
keyName c = _ObjectKeySnoc False c . _2
keyComponents :: Delimiter -> IndexedTraversal' Int ObjectKey Text
keyComponents !c f (ObjectKey k) = cat <$> traversed f split
where
split = Text.split (== c) k
cat = ObjectKey . Text.intercalate (Text.singleton c)
_ObjectKeySnoc :: Bool -> Delimiter -> Prism' ObjectKey (Text, Text)
_ObjectKeySnoc dir !c = prism (ObjectKey . uncurry cat) split
where
split x@(ObjectKey k) =
let (h, t) = Text.breakOnEnd suf k
in if | Text.length h <= 1, dir -> Left x
| otherwise -> Right (Text.dropEnd 1 h, t)
cat h t
| Text.null h = t
| Text.null t = h
| suf `Text.isSuffixOf` h = h <> t
| suf `Text.isPrefixOf` t = h <> t
| otherwise = h <> suf <> t
suf = Text.singleton c