{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
--
-- Module      : Network.AWS.ARN.S3
-- Copyright   : (C) 2020-2023 Bellroy Pty Ltd
-- License     : BSD-3-Clause
-- Maintainer  : Bellroy Tech Team <haskell@bellroy.com>
-- Stability   : experimental
module Network.AWS.ARN.S3
  ( -- * S3 Object
    Object (..),
    parseObject,
    renderObject,

    -- * S3 Bucket
    Bucket (..),
    parseBucket,
    renderBucket,

    -- ** Prisms
    _Object,
    _Bucket,
  )
where

import Data.Hashable (Hashable)
import Data.Text (Text)
import qualified Data.Text as T
import GHC.Generics (Generic)
import Network.AWS.ARN.Internal.Lens (Prism', prism')

-- $setup
-- >>> :set -XOverloadedStrings
-- >>> import Network.AWS.ARN.Internal.Lens ((^?))

-- | An AWS S3 object, made of a bucket and an object key.
--
-- >>> "bucket-name/my/object" ^? _Object
-- Just (Object {bucket = Bucket {bucketName = "bucket-name"}, objectKey = "my/object"})
--
-- >>> "bucket-name" ^? _Object
-- Nothing
--
-- >>> bucket <$> "bucket-name/my/object" ^? _Object
-- Just (Bucket {bucketName = "bucket-name"})
--
-- @since 0.3.1.0
data Object = Object
  { Object -> Bucket
bucket :: Bucket,
    Object -> Text
objectKey :: Text
  }
  deriving (Object -> Object -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Object -> Object -> Bool
$c/= :: Object -> Object -> Bool
== :: Object -> Object -> Bool
$c== :: Object -> Object -> Bool
Eq, Eq Object
Object -> Object -> Bool
Object -> Object -> Ordering
Object -> Object -> Object
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Object -> Object -> Object
$cmin :: Object -> Object -> Object
max :: Object -> Object -> Object
$cmax :: Object -> Object -> Object
>= :: Object -> Object -> Bool
$c>= :: Object -> Object -> Bool
> :: Object -> Object -> Bool
$c> :: Object -> Object -> Bool
<= :: Object -> Object -> Bool
$c<= :: Object -> Object -> Bool
< :: Object -> Object -> Bool
$c< :: Object -> Object -> Bool
compare :: Object -> Object -> Ordering
$ccompare :: Object -> Object -> Ordering
Ord, Eq Object
Int -> Object -> Int
Object -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: Object -> Int
$chash :: Object -> Int
hashWithSalt :: Int -> Object -> Int
$chashWithSalt :: Int -> Object -> Int
Hashable, Int -> Object -> ShowS
[Object] -> ShowS
Object -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Object] -> ShowS
$cshowList :: [Object] -> ShowS
show :: Object -> String
$cshow :: Object -> String
showsPrec :: Int -> Object -> ShowS
$cshowsPrec :: Int -> Object -> ShowS
Show, forall x. Rep Object x -> Object
forall x. Object -> Rep Object x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Object x -> Object
$cfrom :: forall x. Object -> Rep Object x
Generic)

-- | @since 0.3.1.0
parseObject :: Text -> Maybe Object
parseObject :: Text -> Maybe Object
parseObject Text
t = case Text -> Text -> (Text, Text)
T.breakOn Text
"/" Text
t of
  (Text
"", Text
_) -> forall a. Maybe a
Nothing
  (Text
_, Text
"") -> forall a. Maybe a
Nothing
  (Text
bucketName, Text
object) -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Bucket -> Text -> Object
Object (Text -> Bucket
Bucket Text
bucketName) (Int -> Text -> Text
T.drop Int
1 Text
object)

-- | @since 0.3.1.0
renderObject :: Object -> Text
renderObject :: Object -> Text
renderObject Object {Bucket
bucket :: Bucket
$sel:bucket:Object :: Object -> Bucket
bucket, Text
objectKey :: Text
$sel:objectKey:Object :: Object -> Text
objectKey} =
  Bucket -> Text
renderBucket Bucket
bucket forall a. Semigroup a => a -> a -> a
<> Text
"/" forall a. Semigroup a => a -> a -> a
<> Text
objectKey

-- | @since 0.3.1.0
_Object :: Prism' Text Object
_Object :: Prism' Text Object
_Object = forall s a. (a -> s) -> (s -> Maybe a) -> Prism' s a
prism' Object -> Text
renderObject Text -> Maybe Object
parseObject

-- | An AWS S3 bucket, without an object key.
--
-- >>> "bucket-name" ^? _Bucket
-- Just (Bucket {bucketName = "bucket-name"})
--
-- >>> "bucket-name/my/object" ^? _Bucket
-- Nothing
--
-- >>> let b = Bucket "my-bucket" in renderObject . Object b <$> ["obj1", "obj2"]
-- ["my-bucket/obj1","my-bucket/obj2"]
--
-- @since 0.3.1.0
newtype Bucket = Bucket {Bucket -> Text
bucketName :: Text}
  deriving stock (Bucket -> Bucket -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Bucket -> Bucket -> Bool
$c/= :: Bucket -> Bucket -> Bool
== :: Bucket -> Bucket -> Bool
$c== :: Bucket -> Bucket -> Bool
Eq, Eq Bucket
Bucket -> Bucket -> Bool
Bucket -> Bucket -> Ordering
Bucket -> Bucket -> Bucket
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Bucket -> Bucket -> Bucket
$cmin :: Bucket -> Bucket -> Bucket
max :: Bucket -> Bucket -> Bucket
$cmax :: Bucket -> Bucket -> Bucket
>= :: Bucket -> Bucket -> Bool
$c>= :: Bucket -> Bucket -> Bool
> :: Bucket -> Bucket -> Bool
$c> :: Bucket -> Bucket -> Bool
<= :: Bucket -> Bucket -> Bool
$c<= :: Bucket -> Bucket -> Bool
< :: Bucket -> Bucket -> Bool
$c< :: Bucket -> Bucket -> Bool
compare :: Bucket -> Bucket -> Ordering
$ccompare :: Bucket -> Bucket -> Ordering
Ord, Int -> Bucket -> ShowS
[Bucket] -> ShowS
Bucket -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Bucket] -> ShowS
$cshowList :: [Bucket] -> ShowS
show :: Bucket -> String
$cshow :: Bucket -> String
showsPrec :: Int -> Bucket -> ShowS
$cshowsPrec :: Int -> Bucket -> ShowS
Show, forall x. Rep Bucket x -> Bucket
forall x. Bucket -> Rep Bucket x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Bucket x -> Bucket
$cfrom :: forall x. Bucket -> Rep Bucket x
Generic)
  deriving anyclass (Eq Bucket
Int -> Bucket -> Int
Bucket -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: Bucket -> Int
$chash :: Bucket -> Int
hashWithSalt :: Int -> Bucket -> Int
$chashWithSalt :: Int -> Bucket -> Int
Hashable)

-- | @since 0.3.1.0
parseBucket :: Text -> Maybe Bucket
parseBucket :: Text -> Maybe Bucket
parseBucket Text
t = case Text -> Text -> (Text, Text)
T.breakOn Text
"/" Text
t of
  (Text
bucket, Text
"") -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Text -> Bucket
Bucket Text
bucket
  (Text, Text)
_ -> forall a. Maybe a
Nothing

-- | @since 0.3.1.0
renderBucket :: Bucket -> Text
renderBucket :: Bucket -> Text
renderBucket Bucket {Text
bucketName :: Text
$sel:bucketName:Bucket :: Bucket -> Text
bucketName} = Text
bucketName

-- | @since 0.3.1.0
_Bucket :: Prism' Text Bucket
_Bucket :: Prism' Text Bucket
_Bucket = forall s a. (a -> s) -> (s -> Maybe a) -> Prism' s a
prism' Bucket -> Text
renderBucket Text -> Maybe Bucket
parseBucket