{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.S3.CreateBucket
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a new S3 bucket. To create a bucket, you must register with
-- Amazon S3 and have a valid Amazon Web Services Access Key ID to
-- authenticate requests. Anonymous requests are never allowed to create
-- buckets. By creating the bucket, you become the bucket owner.
--
-- Not every string is an acceptable bucket name. For information about
-- bucket naming restrictions, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html Bucket naming rules>.
--
-- If you want to create an Amazon S3 on Outposts bucket, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html Create Bucket>.
--
-- By default, the bucket is created in the US East (N. Virginia) Region.
-- You can optionally specify a Region in the request body. You might
-- choose a Region to optimize latency, minimize costs, or address
-- regulatory requirements. For example, if you reside in Europe, you will
-- probably find it advantageous to create buckets in the Europe (Ireland)
-- Region. For more information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro Accessing a bucket>.
--
-- If you send your create bucket request to the @s3.amazonaws.com@
-- endpoint, the request goes to the us-east-1 Region. Accordingly, the
-- signature calculations in Signature Version 4 must use us-east-1 as the
-- Region, even if the location constraint in the request specifies another
-- Region where the bucket is to be created. If you create a bucket in a
-- Region other than US East (N. Virginia), your application must be able
-- to handle 307 redirect. For more information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html Virtual hosting of buckets>.
--
-- __Access control lists (ACLs)__
--
-- When creating a bucket using this operation, you can optionally
-- configure the bucket ACL to specify the accounts or groups that should
-- be granted specific permissions on the bucket.
--
-- If your CreateBucket request sets bucket owner enforced for S3 Object
-- Ownership and specifies a bucket ACL that provides access to an external
-- Amazon Web Services account, your request fails with a @400@ error and
-- returns the @InvalidBucketAclWithObjectOwnership@ error code. For more
-- information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html Controlling object ownership>
-- in the /Amazon S3 User Guide/.
--
-- There are two ways to grant the appropriate permissions using the
-- request headers.
--
-- -   Specify a canned ACL using the @x-amz-acl@ request header. Amazon S3
--     supports a set of predefined ACLs, known as /canned ACLs/. Each
--     canned ACL has a predefined set of grantees and permissions. For
--     more information, see
--     <https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL Canned ACL>.
--
-- -   Specify access permissions explicitly using the @x-amz-grant-read@,
--     @x-amz-grant-write@, @x-amz-grant-read-acp@,
--     @x-amz-grant-write-acp@, and @x-amz-grant-full-control@ headers.
--     These headers map to the set of permissions Amazon S3 supports in an
--     ACL. For more information, see
--     <https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html Access control list (ACL) overview>.
--
--     You specify each grantee as a type=value pair, where the type is one
--     of the following:
--
--     -   @id@ – if the value specified is the canonical user ID of an
--         Amazon Web Services account
--
--     -   @uri@ – if you are granting permissions to a predefined group
--
--     -   @emailAddress@ – if the value specified is the email address of
--         an Amazon Web Services account
--
--         Using email addresses to specify a grantee is only supported in
--         the following Amazon Web Services Regions:
--
--         -   US East (N. Virginia)
--
--         -   US West (N. California)
--
--         -   US West (Oregon)
--
--         -   Asia Pacific (Singapore)
--
--         -   Asia Pacific (Sydney)
--
--         -   Asia Pacific (Tokyo)
--
--         -   Europe (Ireland)
--
--         -   South America (São Paulo)
--
--         For a list of all the Amazon S3 supported Regions and endpoints,
--         see
--         <https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region Regions and Endpoints>
--         in the Amazon Web Services General Reference.
--
--     For example, the following @x-amz-grant-read@ header grants the
--     Amazon Web Services accounts identified by account IDs permissions
--     to read object data and its metadata:
--
--     @x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" @
--
-- You can use either a canned ACL or specify access permissions
-- explicitly. You cannot do both.
--
-- __Permissions__
--
-- In addition to @s3:CreateBucket@, the following permissions are required
-- when your CreateBucket includes specific headers:
--
-- -   __ACLs__ - If your @CreateBucket@ request specifies ACL permissions
--     and the ACL is public-read, public-read-write, authenticated-read,
--     or if you specify access permissions explicitly through any other
--     ACL, both @s3:CreateBucket@ and @s3:PutBucketAcl@ permissions are
--     needed. If the ACL the @CreateBucket@ request is private or doesn\'t
--     specify any ACLs, only @s3:CreateBucket@ permission is needed.
--
-- -   __Object Lock__ - If @ObjectLockEnabledForBucket@ is set to true in
--     your @CreateBucket@ request, @s3:PutBucketObjectLockConfiguration@
--     and @s3:PutBucketVersioning@ permissions are required.
--
-- -   __S3 Object Ownership__ - If your CreateBucket request includes the
--     the @x-amz-object-ownership@ header, @s3:PutBucketOwnershipControls@
--     permission is required.
--
-- The following operations are related to @CreateBucket@:
--
-- -   <https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html PutObject>
--
-- -   <https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html DeleteBucket>
module Amazonka.S3.CreateBucket
  ( -- * Creating a Request
    CreateBucket (..),
    newCreateBucket,

    -- * Request Lenses
    createBucket_acl,
    createBucket_createBucketConfiguration,
    createBucket_grantFullControl,
    createBucket_grantRead,
    createBucket_grantReadACP,
    createBucket_grantWrite,
    createBucket_grantWriteACP,
    createBucket_objectLockEnabledForBucket,
    createBucket_objectOwnership,
    createBucket_bucket,

    -- * Destructuring the Response
    CreateBucketResponse (..),
    newCreateBucketResponse,

    -- * Response Lenses
    createBucketResponse_location,
    createBucketResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.S3.Types

-- | /See:/ 'newCreateBucket' smart constructor.
data CreateBucket = CreateBucket'
  { -- | The canned ACL to apply to the bucket.
    CreateBucket -> Maybe BucketCannedACL
acl :: Prelude.Maybe BucketCannedACL,
    -- | The configuration information for the bucket.
    CreateBucket -> Maybe CreateBucketConfiguration
createBucketConfiguration :: Prelude.Maybe CreateBucketConfiguration,
    -- | Allows grantee the read, write, read ACP, and write ACP permissions on
    -- the bucket.
    CreateBucket -> Maybe Text
grantFullControl :: Prelude.Maybe Prelude.Text,
    -- | Allows grantee to list the objects in the bucket.
    CreateBucket -> Maybe Text
grantRead :: Prelude.Maybe Prelude.Text,
    -- | Allows grantee to read the bucket ACL.
    CreateBucket -> Maybe Text
grantReadACP :: Prelude.Maybe Prelude.Text,
    -- | Allows grantee to create new objects in the bucket.
    --
    -- For the bucket and object owners of existing objects, also allows
    -- deletions and overwrites of those objects.
    CreateBucket -> Maybe Text
grantWrite :: Prelude.Maybe Prelude.Text,
    -- | Allows grantee to write the ACL for the applicable bucket.
    CreateBucket -> Maybe Text
grantWriteACP :: Prelude.Maybe Prelude.Text,
    -- | Specifies whether you want S3 Object Lock to be enabled for the new
    -- bucket.
    CreateBucket -> Maybe Bool
objectLockEnabledForBucket :: Prelude.Maybe Prelude.Bool,
    CreateBucket -> Maybe ObjectOwnership
objectOwnership :: Prelude.Maybe ObjectOwnership,
    -- | The name of the bucket to create.
    CreateBucket -> BucketName
bucket :: BucketName
  }
  deriving (CreateBucket -> CreateBucket -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateBucket -> CreateBucket -> Bool
$c/= :: CreateBucket -> CreateBucket -> Bool
== :: CreateBucket -> CreateBucket -> Bool
$c== :: CreateBucket -> CreateBucket -> Bool
Prelude.Eq, ReadPrec [CreateBucket]
ReadPrec CreateBucket
Int -> ReadS CreateBucket
ReadS [CreateBucket]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateBucket]
$creadListPrec :: ReadPrec [CreateBucket]
readPrec :: ReadPrec CreateBucket
$creadPrec :: ReadPrec CreateBucket
readList :: ReadS [CreateBucket]
$creadList :: ReadS [CreateBucket]
readsPrec :: Int -> ReadS CreateBucket
$creadsPrec :: Int -> ReadS CreateBucket
Prelude.Read, Int -> CreateBucket -> ShowS
[CreateBucket] -> ShowS
CreateBucket -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateBucket] -> ShowS
$cshowList :: [CreateBucket] -> ShowS
show :: CreateBucket -> String
$cshow :: CreateBucket -> String
showsPrec :: Int -> CreateBucket -> ShowS
$cshowsPrec :: Int -> CreateBucket -> ShowS
Prelude.Show, forall x. Rep CreateBucket x -> CreateBucket
forall x. CreateBucket -> Rep CreateBucket x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateBucket x -> CreateBucket
$cfrom :: forall x. CreateBucket -> Rep CreateBucket x
Prelude.Generic)

-- |
-- Create a value of 'CreateBucket' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'acl', 'createBucket_acl' - The canned ACL to apply to the bucket.
--
-- 'createBucketConfiguration', 'createBucket_createBucketConfiguration' - The configuration information for the bucket.
--
-- 'grantFullControl', 'createBucket_grantFullControl' - Allows grantee the read, write, read ACP, and write ACP permissions on
-- the bucket.
--
-- 'grantRead', 'createBucket_grantRead' - Allows grantee to list the objects in the bucket.
--
-- 'grantReadACP', 'createBucket_grantReadACP' - Allows grantee to read the bucket ACL.
--
-- 'grantWrite', 'createBucket_grantWrite' - Allows grantee to create new objects in the bucket.
--
-- For the bucket and object owners of existing objects, also allows
-- deletions and overwrites of those objects.
--
-- 'grantWriteACP', 'createBucket_grantWriteACP' - Allows grantee to write the ACL for the applicable bucket.
--
-- 'objectLockEnabledForBucket', 'createBucket_objectLockEnabledForBucket' - Specifies whether you want S3 Object Lock to be enabled for the new
-- bucket.
--
-- 'objectOwnership', 'createBucket_objectOwnership' - Undocumented member.
--
-- 'bucket', 'createBucket_bucket' - The name of the bucket to create.
newCreateBucket ::
  -- | 'bucket'
  BucketName ->
  CreateBucket
newCreateBucket :: BucketName -> CreateBucket
newCreateBucket BucketName
pBucket_ =
  CreateBucket'
    { $sel:acl:CreateBucket' :: Maybe BucketCannedACL
acl = forall a. Maybe a
Prelude.Nothing,
      $sel:createBucketConfiguration:CreateBucket' :: Maybe CreateBucketConfiguration
createBucketConfiguration = forall a. Maybe a
Prelude.Nothing,
      $sel:grantFullControl:CreateBucket' :: Maybe Text
grantFullControl = forall a. Maybe a
Prelude.Nothing,
      $sel:grantRead:CreateBucket' :: Maybe Text
grantRead = forall a. Maybe a
Prelude.Nothing,
      $sel:grantReadACP:CreateBucket' :: Maybe Text
grantReadACP = forall a. Maybe a
Prelude.Nothing,
      $sel:grantWrite:CreateBucket' :: Maybe Text
grantWrite = forall a. Maybe a
Prelude.Nothing,
      $sel:grantWriteACP:CreateBucket' :: Maybe Text
grantWriteACP = forall a. Maybe a
Prelude.Nothing,
      $sel:objectLockEnabledForBucket:CreateBucket' :: Maybe Bool
objectLockEnabledForBucket = forall a. Maybe a
Prelude.Nothing,
      $sel:objectOwnership:CreateBucket' :: Maybe ObjectOwnership
objectOwnership = forall a. Maybe a
Prelude.Nothing,
      $sel:bucket:CreateBucket' :: BucketName
bucket = BucketName
pBucket_
    }

-- | The canned ACL to apply to the bucket.
createBucket_acl :: Lens.Lens' CreateBucket (Prelude.Maybe BucketCannedACL)
createBucket_acl :: Lens' CreateBucket (Maybe BucketCannedACL)
createBucket_acl = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe BucketCannedACL
acl :: Maybe BucketCannedACL
$sel:acl:CreateBucket' :: CreateBucket -> Maybe BucketCannedACL
acl} -> Maybe BucketCannedACL
acl) (\s :: CreateBucket
s@CreateBucket' {} Maybe BucketCannedACL
a -> CreateBucket
s {$sel:acl:CreateBucket' :: Maybe BucketCannedACL
acl = Maybe BucketCannedACL
a} :: CreateBucket)

-- | The configuration information for the bucket.
createBucket_createBucketConfiguration :: Lens.Lens' CreateBucket (Prelude.Maybe CreateBucketConfiguration)
createBucket_createBucketConfiguration :: Lens' CreateBucket (Maybe CreateBucketConfiguration)
createBucket_createBucketConfiguration = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe CreateBucketConfiguration
createBucketConfiguration :: Maybe CreateBucketConfiguration
$sel:createBucketConfiguration:CreateBucket' :: CreateBucket -> Maybe CreateBucketConfiguration
createBucketConfiguration} -> Maybe CreateBucketConfiguration
createBucketConfiguration) (\s :: CreateBucket
s@CreateBucket' {} Maybe CreateBucketConfiguration
a -> CreateBucket
s {$sel:createBucketConfiguration:CreateBucket' :: Maybe CreateBucketConfiguration
createBucketConfiguration = Maybe CreateBucketConfiguration
a} :: CreateBucket)

-- | Allows grantee the read, write, read ACP, and write ACP permissions on
-- the bucket.
createBucket_grantFullControl :: Lens.Lens' CreateBucket (Prelude.Maybe Prelude.Text)
createBucket_grantFullControl :: Lens' CreateBucket (Maybe Text)
createBucket_grantFullControl = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe Text
grantFullControl :: Maybe Text
$sel:grantFullControl:CreateBucket' :: CreateBucket -> Maybe Text
grantFullControl} -> Maybe Text
grantFullControl) (\s :: CreateBucket
s@CreateBucket' {} Maybe Text
a -> CreateBucket
s {$sel:grantFullControl:CreateBucket' :: Maybe Text
grantFullControl = Maybe Text
a} :: CreateBucket)

-- | Allows grantee to list the objects in the bucket.
createBucket_grantRead :: Lens.Lens' CreateBucket (Prelude.Maybe Prelude.Text)
createBucket_grantRead :: Lens' CreateBucket (Maybe Text)
createBucket_grantRead = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe Text
grantRead :: Maybe Text
$sel:grantRead:CreateBucket' :: CreateBucket -> Maybe Text
grantRead} -> Maybe Text
grantRead) (\s :: CreateBucket
s@CreateBucket' {} Maybe Text
a -> CreateBucket
s {$sel:grantRead:CreateBucket' :: Maybe Text
grantRead = Maybe Text
a} :: CreateBucket)

-- | Allows grantee to read the bucket ACL.
createBucket_grantReadACP :: Lens.Lens' CreateBucket (Prelude.Maybe Prelude.Text)
createBucket_grantReadACP :: Lens' CreateBucket (Maybe Text)
createBucket_grantReadACP = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe Text
grantReadACP :: Maybe Text
$sel:grantReadACP:CreateBucket' :: CreateBucket -> Maybe Text
grantReadACP} -> Maybe Text
grantReadACP) (\s :: CreateBucket
s@CreateBucket' {} Maybe Text
a -> CreateBucket
s {$sel:grantReadACP:CreateBucket' :: Maybe Text
grantReadACP = Maybe Text
a} :: CreateBucket)

-- | Allows grantee to create new objects in the bucket.
--
-- For the bucket and object owners of existing objects, also allows
-- deletions and overwrites of those objects.
createBucket_grantWrite :: Lens.Lens' CreateBucket (Prelude.Maybe Prelude.Text)
createBucket_grantWrite :: Lens' CreateBucket (Maybe Text)
createBucket_grantWrite = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe Text
grantWrite :: Maybe Text
$sel:grantWrite:CreateBucket' :: CreateBucket -> Maybe Text
grantWrite} -> Maybe Text
grantWrite) (\s :: CreateBucket
s@CreateBucket' {} Maybe Text
a -> CreateBucket
s {$sel:grantWrite:CreateBucket' :: Maybe Text
grantWrite = Maybe Text
a} :: CreateBucket)

-- | Allows grantee to write the ACL for the applicable bucket.
createBucket_grantWriteACP :: Lens.Lens' CreateBucket (Prelude.Maybe Prelude.Text)
createBucket_grantWriteACP :: Lens' CreateBucket (Maybe Text)
createBucket_grantWriteACP = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe Text
grantWriteACP :: Maybe Text
$sel:grantWriteACP:CreateBucket' :: CreateBucket -> Maybe Text
grantWriteACP} -> Maybe Text
grantWriteACP) (\s :: CreateBucket
s@CreateBucket' {} Maybe Text
a -> CreateBucket
s {$sel:grantWriteACP:CreateBucket' :: Maybe Text
grantWriteACP = Maybe Text
a} :: CreateBucket)

-- | Specifies whether you want S3 Object Lock to be enabled for the new
-- bucket.
createBucket_objectLockEnabledForBucket :: Lens.Lens' CreateBucket (Prelude.Maybe Prelude.Bool)
createBucket_objectLockEnabledForBucket :: Lens' CreateBucket (Maybe Bool)
createBucket_objectLockEnabledForBucket = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe Bool
objectLockEnabledForBucket :: Maybe Bool
$sel:objectLockEnabledForBucket:CreateBucket' :: CreateBucket -> Maybe Bool
objectLockEnabledForBucket} -> Maybe Bool
objectLockEnabledForBucket) (\s :: CreateBucket
s@CreateBucket' {} Maybe Bool
a -> CreateBucket
s {$sel:objectLockEnabledForBucket:CreateBucket' :: Maybe Bool
objectLockEnabledForBucket = Maybe Bool
a} :: CreateBucket)

-- | Undocumented member.
createBucket_objectOwnership :: Lens.Lens' CreateBucket (Prelude.Maybe ObjectOwnership)
createBucket_objectOwnership :: Lens' CreateBucket (Maybe ObjectOwnership)
createBucket_objectOwnership = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {Maybe ObjectOwnership
objectOwnership :: Maybe ObjectOwnership
$sel:objectOwnership:CreateBucket' :: CreateBucket -> Maybe ObjectOwnership
objectOwnership} -> Maybe ObjectOwnership
objectOwnership) (\s :: CreateBucket
s@CreateBucket' {} Maybe ObjectOwnership
a -> CreateBucket
s {$sel:objectOwnership:CreateBucket' :: Maybe ObjectOwnership
objectOwnership = Maybe ObjectOwnership
a} :: CreateBucket)

-- | The name of the bucket to create.
createBucket_bucket :: Lens.Lens' CreateBucket BucketName
createBucket_bucket :: Lens' CreateBucket BucketName
createBucket_bucket = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucket' {BucketName
bucket :: BucketName
$sel:bucket:CreateBucket' :: CreateBucket -> BucketName
bucket} -> BucketName
bucket) (\s :: CreateBucket
s@CreateBucket' {} BucketName
a -> CreateBucket
s {$sel:bucket:CreateBucket' :: BucketName
bucket = BucketName
a} :: CreateBucket)

instance Core.AWSRequest CreateBucket where
  type AWSResponse CreateBucket = CreateBucketResponse
  request :: (Service -> Service) -> CreateBucket -> Request CreateBucket
request Service -> Service
overrides =
    forall a. Request a -> Request a
Request.s3vhost
      forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. (ToRequest a, ToElement a) => Service -> a -> Request a
Request.putXML (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateBucket
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateBucket)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Maybe Text -> Int -> CreateBucketResponse
CreateBucketResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"Location")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable CreateBucket where
  hashWithSalt :: Int -> CreateBucket -> Int
hashWithSalt Int
_salt CreateBucket' {Maybe Bool
Maybe Text
Maybe BucketCannedACL
Maybe CreateBucketConfiguration
Maybe ObjectOwnership
BucketName
bucket :: BucketName
objectOwnership :: Maybe ObjectOwnership
objectLockEnabledForBucket :: Maybe Bool
grantWriteACP :: Maybe Text
grantWrite :: Maybe Text
grantReadACP :: Maybe Text
grantRead :: Maybe Text
grantFullControl :: Maybe Text
createBucketConfiguration :: Maybe CreateBucketConfiguration
acl :: Maybe BucketCannedACL
$sel:bucket:CreateBucket' :: CreateBucket -> BucketName
$sel:objectOwnership:CreateBucket' :: CreateBucket -> Maybe ObjectOwnership
$sel:objectLockEnabledForBucket:CreateBucket' :: CreateBucket -> Maybe Bool
$sel:grantWriteACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantWrite:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantReadACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantRead:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantFullControl:CreateBucket' :: CreateBucket -> Maybe Text
$sel:createBucketConfiguration:CreateBucket' :: CreateBucket -> Maybe CreateBucketConfiguration
$sel:acl:CreateBucket' :: CreateBucket -> Maybe BucketCannedACL
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe BucketCannedACL
acl
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CreateBucketConfiguration
createBucketConfiguration
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
grantFullControl
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
grantRead
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
grantReadACP
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
grantWrite
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
grantWriteACP
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
objectLockEnabledForBucket
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ObjectOwnership
objectOwnership
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` BucketName
bucket

instance Prelude.NFData CreateBucket where
  rnf :: CreateBucket -> ()
rnf CreateBucket' {Maybe Bool
Maybe Text
Maybe BucketCannedACL
Maybe CreateBucketConfiguration
Maybe ObjectOwnership
BucketName
bucket :: BucketName
objectOwnership :: Maybe ObjectOwnership
objectLockEnabledForBucket :: Maybe Bool
grantWriteACP :: Maybe Text
grantWrite :: Maybe Text
grantReadACP :: Maybe Text
grantRead :: Maybe Text
grantFullControl :: Maybe Text
createBucketConfiguration :: Maybe CreateBucketConfiguration
acl :: Maybe BucketCannedACL
$sel:bucket:CreateBucket' :: CreateBucket -> BucketName
$sel:objectOwnership:CreateBucket' :: CreateBucket -> Maybe ObjectOwnership
$sel:objectLockEnabledForBucket:CreateBucket' :: CreateBucket -> Maybe Bool
$sel:grantWriteACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantWrite:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantReadACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantRead:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantFullControl:CreateBucket' :: CreateBucket -> Maybe Text
$sel:createBucketConfiguration:CreateBucket' :: CreateBucket -> Maybe CreateBucketConfiguration
$sel:acl:CreateBucket' :: CreateBucket -> Maybe BucketCannedACL
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe BucketCannedACL
acl
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe CreateBucketConfiguration
createBucketConfiguration
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
grantFullControl
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
grantRead
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
grantReadACP
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
grantWrite
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
grantWriteACP
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
objectLockEnabledForBucket
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ObjectOwnership
objectOwnership
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf BucketName
bucket

instance Data.ToElement CreateBucket where
  toElement :: CreateBucket -> Element
toElement CreateBucket' {Maybe Bool
Maybe Text
Maybe BucketCannedACL
Maybe CreateBucketConfiguration
Maybe ObjectOwnership
BucketName
bucket :: BucketName
objectOwnership :: Maybe ObjectOwnership
objectLockEnabledForBucket :: Maybe Bool
grantWriteACP :: Maybe Text
grantWrite :: Maybe Text
grantReadACP :: Maybe Text
grantRead :: Maybe Text
grantFullControl :: Maybe Text
createBucketConfiguration :: Maybe CreateBucketConfiguration
acl :: Maybe BucketCannedACL
$sel:bucket:CreateBucket' :: CreateBucket -> BucketName
$sel:objectOwnership:CreateBucket' :: CreateBucket -> Maybe ObjectOwnership
$sel:objectLockEnabledForBucket:CreateBucket' :: CreateBucket -> Maybe Bool
$sel:grantWriteACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantWrite:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantReadACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantRead:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantFullControl:CreateBucket' :: CreateBucket -> Maybe Text
$sel:createBucketConfiguration:CreateBucket' :: CreateBucket -> Maybe CreateBucketConfiguration
$sel:acl:CreateBucket' :: CreateBucket -> Maybe BucketCannedACL
..} =
    forall a. ToXML a => Name -> a -> Element
Data.mkElement
      Name
"{http://s3.amazonaws.com/doc/2006-03-01/}CreateBucketConfiguration"
      Maybe CreateBucketConfiguration
createBucketConfiguration

instance Data.ToHeaders CreateBucket where
  toHeaders :: CreateBucket -> ResponseHeaders
toHeaders CreateBucket' {Maybe Bool
Maybe Text
Maybe BucketCannedACL
Maybe CreateBucketConfiguration
Maybe ObjectOwnership
BucketName
bucket :: BucketName
objectOwnership :: Maybe ObjectOwnership
objectLockEnabledForBucket :: Maybe Bool
grantWriteACP :: Maybe Text
grantWrite :: Maybe Text
grantReadACP :: Maybe Text
grantRead :: Maybe Text
grantFullControl :: Maybe Text
createBucketConfiguration :: Maybe CreateBucketConfiguration
acl :: Maybe BucketCannedACL
$sel:bucket:CreateBucket' :: CreateBucket -> BucketName
$sel:objectOwnership:CreateBucket' :: CreateBucket -> Maybe ObjectOwnership
$sel:objectLockEnabledForBucket:CreateBucket' :: CreateBucket -> Maybe Bool
$sel:grantWriteACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantWrite:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantReadACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantRead:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantFullControl:CreateBucket' :: CreateBucket -> Maybe Text
$sel:createBucketConfiguration:CreateBucket' :: CreateBucket -> Maybe CreateBucketConfiguration
$sel:acl:CreateBucket' :: CreateBucket -> Maybe BucketCannedACL
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ HeaderName
"x-amz-acl" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe BucketCannedACL
acl,
        HeaderName
"x-amz-grant-full-control" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Text
grantFullControl,
        HeaderName
"x-amz-grant-read" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Text
grantRead,
        HeaderName
"x-amz-grant-read-acp" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Text
grantReadACP,
        HeaderName
"x-amz-grant-write" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Text
grantWrite,
        HeaderName
"x-amz-grant-write-acp" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Text
grantWriteACP,
        HeaderName
"x-amz-bucket-object-lock-enabled"
          forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Bool
objectLockEnabledForBucket,
        HeaderName
"x-amz-object-ownership" forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe ObjectOwnership
objectOwnership
      ]

instance Data.ToPath CreateBucket where
  toPath :: CreateBucket -> ByteString
toPath CreateBucket' {Maybe Bool
Maybe Text
Maybe BucketCannedACL
Maybe CreateBucketConfiguration
Maybe ObjectOwnership
BucketName
bucket :: BucketName
objectOwnership :: Maybe ObjectOwnership
objectLockEnabledForBucket :: Maybe Bool
grantWriteACP :: Maybe Text
grantWrite :: Maybe Text
grantReadACP :: Maybe Text
grantRead :: Maybe Text
grantFullControl :: Maybe Text
createBucketConfiguration :: Maybe CreateBucketConfiguration
acl :: Maybe BucketCannedACL
$sel:bucket:CreateBucket' :: CreateBucket -> BucketName
$sel:objectOwnership:CreateBucket' :: CreateBucket -> Maybe ObjectOwnership
$sel:objectLockEnabledForBucket:CreateBucket' :: CreateBucket -> Maybe Bool
$sel:grantWriteACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantWrite:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantReadACP:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantRead:CreateBucket' :: CreateBucket -> Maybe Text
$sel:grantFullControl:CreateBucket' :: CreateBucket -> Maybe Text
$sel:createBucketConfiguration:CreateBucket' :: CreateBucket -> Maybe CreateBucketConfiguration
$sel:acl:CreateBucket' :: CreateBucket -> Maybe BucketCannedACL
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat [ByteString
"/", forall a. ToByteString a => a -> ByteString
Data.toBS BucketName
bucket]

instance Data.ToQuery CreateBucket where
  toQuery :: CreateBucket -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newCreateBucketResponse' smart constructor.
data CreateBucketResponse = CreateBucketResponse'
  { -- | A forward slash followed by the name of the bucket.
    CreateBucketResponse -> Maybe Text
location :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    CreateBucketResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateBucketResponse -> CreateBucketResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateBucketResponse -> CreateBucketResponse -> Bool
$c/= :: CreateBucketResponse -> CreateBucketResponse -> Bool
== :: CreateBucketResponse -> CreateBucketResponse -> Bool
$c== :: CreateBucketResponse -> CreateBucketResponse -> Bool
Prelude.Eq, ReadPrec [CreateBucketResponse]
ReadPrec CreateBucketResponse
Int -> ReadS CreateBucketResponse
ReadS [CreateBucketResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateBucketResponse]
$creadListPrec :: ReadPrec [CreateBucketResponse]
readPrec :: ReadPrec CreateBucketResponse
$creadPrec :: ReadPrec CreateBucketResponse
readList :: ReadS [CreateBucketResponse]
$creadList :: ReadS [CreateBucketResponse]
readsPrec :: Int -> ReadS CreateBucketResponse
$creadsPrec :: Int -> ReadS CreateBucketResponse
Prelude.Read, Int -> CreateBucketResponse -> ShowS
[CreateBucketResponse] -> ShowS
CreateBucketResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateBucketResponse] -> ShowS
$cshowList :: [CreateBucketResponse] -> ShowS
show :: CreateBucketResponse -> String
$cshow :: CreateBucketResponse -> String
showsPrec :: Int -> CreateBucketResponse -> ShowS
$cshowsPrec :: Int -> CreateBucketResponse -> ShowS
Prelude.Show, forall x. Rep CreateBucketResponse x -> CreateBucketResponse
forall x. CreateBucketResponse -> Rep CreateBucketResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateBucketResponse x -> CreateBucketResponse
$cfrom :: forall x. CreateBucketResponse -> Rep CreateBucketResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateBucketResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'location', 'createBucketResponse_location' - A forward slash followed by the name of the bucket.
--
-- 'httpStatus', 'createBucketResponse_httpStatus' - The response's http status code.
newCreateBucketResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateBucketResponse
newCreateBucketResponse :: Int -> CreateBucketResponse
newCreateBucketResponse Int
pHttpStatus_ =
  CreateBucketResponse'
    { $sel:location:CreateBucketResponse' :: Maybe Text
location = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateBucketResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | A forward slash followed by the name of the bucket.
createBucketResponse_location :: Lens.Lens' CreateBucketResponse (Prelude.Maybe Prelude.Text)
createBucketResponse_location :: Lens' CreateBucketResponse (Maybe Text)
createBucketResponse_location = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucketResponse' {Maybe Text
location :: Maybe Text
$sel:location:CreateBucketResponse' :: CreateBucketResponse -> Maybe Text
location} -> Maybe Text
location) (\s :: CreateBucketResponse
s@CreateBucketResponse' {} Maybe Text
a -> CreateBucketResponse
s {$sel:location:CreateBucketResponse' :: Maybe Text
location = Maybe Text
a} :: CreateBucketResponse)

-- | The response's http status code.
createBucketResponse_httpStatus :: Lens.Lens' CreateBucketResponse Prelude.Int
createBucketResponse_httpStatus :: Lens' CreateBucketResponse Int
createBucketResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateBucketResponse' {Int
httpStatus :: Int
$sel:httpStatus:CreateBucketResponse' :: CreateBucketResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: CreateBucketResponse
s@CreateBucketResponse' {} Int
a -> CreateBucketResponse
s {$sel:httpStatus:CreateBucketResponse' :: Int
httpStatus = Int
a} :: CreateBucketResponse)

instance Prelude.NFData CreateBucketResponse where
  rnf :: CreateBucketResponse -> ()
rnf CreateBucketResponse' {Int
Maybe Text
httpStatus :: Int
location :: Maybe Text
$sel:httpStatus:CreateBucketResponse' :: CreateBucketResponse -> Int
$sel:location:CreateBucketResponse' :: CreateBucketResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
location
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus