{-# 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.CloudFront.CreateDistributionWithTags
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Create a new distribution with tags.
module Amazonka.CloudFront.CreateDistributionWithTags
  ( -- * Creating a Request
    CreateDistributionWithTags (..),
    newCreateDistributionWithTags,

    -- * Request Lenses
    createDistributionWithTags_distributionConfigWithTags,

    -- * Destructuring the Response
    CreateDistributionWithTagsResponse (..),
    newCreateDistributionWithTagsResponse,

    -- * Response Lenses
    createDistributionWithTagsResponse_distribution,
    createDistributionWithTagsResponse_eTag,
    createDistributionWithTagsResponse_location,
    createDistributionWithTagsResponse_httpStatus,
  )
where

import Amazonka.CloudFront.Types
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

-- | The request to create a new distribution with tags.
--
-- /See:/ 'newCreateDistributionWithTags' smart constructor.
data CreateDistributionWithTags = CreateDistributionWithTags'
  { -- | The distribution\'s configuration information.
    CreateDistributionWithTags -> DistributionConfigWithTags
distributionConfigWithTags :: DistributionConfigWithTags
  }
  deriving (CreateDistributionWithTags -> CreateDistributionWithTags -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateDistributionWithTags -> CreateDistributionWithTags -> Bool
$c/= :: CreateDistributionWithTags -> CreateDistributionWithTags -> Bool
== :: CreateDistributionWithTags -> CreateDistributionWithTags -> Bool
$c== :: CreateDistributionWithTags -> CreateDistributionWithTags -> Bool
Prelude.Eq, Int -> CreateDistributionWithTags -> ShowS
[CreateDistributionWithTags] -> ShowS
CreateDistributionWithTags -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateDistributionWithTags] -> ShowS
$cshowList :: [CreateDistributionWithTags] -> ShowS
show :: CreateDistributionWithTags -> String
$cshow :: CreateDistributionWithTags -> String
showsPrec :: Int -> CreateDistributionWithTags -> ShowS
$cshowsPrec :: Int -> CreateDistributionWithTags -> ShowS
Prelude.Show, forall x.
Rep CreateDistributionWithTags x -> CreateDistributionWithTags
forall x.
CreateDistributionWithTags -> Rep CreateDistributionWithTags x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateDistributionWithTags x -> CreateDistributionWithTags
$cfrom :: forall x.
CreateDistributionWithTags -> Rep CreateDistributionWithTags x
Prelude.Generic)

-- |
-- Create a value of 'CreateDistributionWithTags' 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:
--
-- 'distributionConfigWithTags', 'createDistributionWithTags_distributionConfigWithTags' - The distribution\'s configuration information.
newCreateDistributionWithTags ::
  -- | 'distributionConfigWithTags'
  DistributionConfigWithTags ->
  CreateDistributionWithTags
newCreateDistributionWithTags :: DistributionConfigWithTags -> CreateDistributionWithTags
newCreateDistributionWithTags
  DistributionConfigWithTags
pDistributionConfigWithTags_ =
    CreateDistributionWithTags'
      { $sel:distributionConfigWithTags:CreateDistributionWithTags' :: DistributionConfigWithTags
distributionConfigWithTags =
          DistributionConfigWithTags
pDistributionConfigWithTags_
      }

-- | The distribution\'s configuration information.
createDistributionWithTags_distributionConfigWithTags :: Lens.Lens' CreateDistributionWithTags DistributionConfigWithTags
createDistributionWithTags_distributionConfigWithTags :: Lens' CreateDistributionWithTags DistributionConfigWithTags
createDistributionWithTags_distributionConfigWithTags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDistributionWithTags' {DistributionConfigWithTags
distributionConfigWithTags :: DistributionConfigWithTags
$sel:distributionConfigWithTags:CreateDistributionWithTags' :: CreateDistributionWithTags -> DistributionConfigWithTags
distributionConfigWithTags} -> DistributionConfigWithTags
distributionConfigWithTags) (\s :: CreateDistributionWithTags
s@CreateDistributionWithTags' {} DistributionConfigWithTags
a -> CreateDistributionWithTags
s {$sel:distributionConfigWithTags:CreateDistributionWithTags' :: DistributionConfigWithTags
distributionConfigWithTags = DistributionConfigWithTags
a} :: CreateDistributionWithTags)

instance Core.AWSRequest CreateDistributionWithTags where
  type
    AWSResponse CreateDistributionWithTags =
      CreateDistributionWithTagsResponse
  request :: (Service -> Service)
-> CreateDistributionWithTags -> Request CreateDistributionWithTags
request Service -> Service
overrides =
    forall a. (ToRequest a, ToElement a) => Service -> a -> Request a
Request.postXML (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateDistributionWithTags
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateDistributionWithTags)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXML
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Maybe Distribution
-> Maybe Text
-> Maybe Text
-> Int
-> CreateDistributionWithTagsResponse
CreateDistributionWithTagsResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (forall a. FromXML a => [Node] -> Either String a
Data.parseXML [Node]
x)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"ETag")
            forall (f :: * -> *) a b. Applicative f => 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 CreateDistributionWithTags where
  hashWithSalt :: Int -> CreateDistributionWithTags -> Int
hashWithSalt Int
_salt CreateDistributionWithTags' {DistributionConfigWithTags
distributionConfigWithTags :: DistributionConfigWithTags
$sel:distributionConfigWithTags:CreateDistributionWithTags' :: CreateDistributionWithTags -> DistributionConfigWithTags
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` DistributionConfigWithTags
distributionConfigWithTags

instance Prelude.NFData CreateDistributionWithTags where
  rnf :: CreateDistributionWithTags -> ()
rnf CreateDistributionWithTags' {DistributionConfigWithTags
distributionConfigWithTags :: DistributionConfigWithTags
$sel:distributionConfigWithTags:CreateDistributionWithTags' :: CreateDistributionWithTags -> DistributionConfigWithTags
..} =
    forall a. NFData a => a -> ()
Prelude.rnf DistributionConfigWithTags
distributionConfigWithTags

instance Data.ToElement CreateDistributionWithTags where
  toElement :: CreateDistributionWithTags -> Element
toElement CreateDistributionWithTags' {DistributionConfigWithTags
distributionConfigWithTags :: DistributionConfigWithTags
$sel:distributionConfigWithTags:CreateDistributionWithTags' :: CreateDistributionWithTags -> DistributionConfigWithTags
..} =
    forall a. ToXML a => Name -> a -> Element
Data.mkElement
      Name
"{http://cloudfront.amazonaws.com/doc/2020-05-31/}DistributionConfigWithTags"
      DistributionConfigWithTags
distributionConfigWithTags

instance Data.ToHeaders CreateDistributionWithTags where
  toHeaders :: CreateDistributionWithTags -> ResponseHeaders
toHeaders = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

instance Data.ToPath CreateDistributionWithTags where
  toPath :: CreateDistributionWithTags -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/2020-05-31/distribution"

instance Data.ToQuery CreateDistributionWithTags where
  toQuery :: CreateDistributionWithTags -> QueryString
toQuery =
    forall a b. a -> b -> a
Prelude.const (forall a. Monoid a => [a] -> a
Prelude.mconcat [QueryString
"WithTags"])

-- | The returned result of the corresponding request.
--
-- /See:/ 'newCreateDistributionWithTagsResponse' smart constructor.
data CreateDistributionWithTagsResponse = CreateDistributionWithTagsResponse'
  { -- | The distribution\'s information.
    CreateDistributionWithTagsResponse -> Maybe Distribution
distribution :: Prelude.Maybe Distribution,
    -- | The current version of the distribution created.
    CreateDistributionWithTagsResponse -> Maybe Text
eTag :: Prelude.Maybe Prelude.Text,
    -- | The fully qualified URI of the new distribution resource just created.
    CreateDistributionWithTagsResponse -> Maybe Text
location :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    CreateDistributionWithTagsResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateDistributionWithTagsResponse
-> CreateDistributionWithTagsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateDistributionWithTagsResponse
-> CreateDistributionWithTagsResponse -> Bool
$c/= :: CreateDistributionWithTagsResponse
-> CreateDistributionWithTagsResponse -> Bool
== :: CreateDistributionWithTagsResponse
-> CreateDistributionWithTagsResponse -> Bool
$c== :: CreateDistributionWithTagsResponse
-> CreateDistributionWithTagsResponse -> Bool
Prelude.Eq, Int -> CreateDistributionWithTagsResponse -> ShowS
[CreateDistributionWithTagsResponse] -> ShowS
CreateDistributionWithTagsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateDistributionWithTagsResponse] -> ShowS
$cshowList :: [CreateDistributionWithTagsResponse] -> ShowS
show :: CreateDistributionWithTagsResponse -> String
$cshow :: CreateDistributionWithTagsResponse -> String
showsPrec :: Int -> CreateDistributionWithTagsResponse -> ShowS
$cshowsPrec :: Int -> CreateDistributionWithTagsResponse -> ShowS
Prelude.Show, forall x.
Rep CreateDistributionWithTagsResponse x
-> CreateDistributionWithTagsResponse
forall x.
CreateDistributionWithTagsResponse
-> Rep CreateDistributionWithTagsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateDistributionWithTagsResponse x
-> CreateDistributionWithTagsResponse
$cfrom :: forall x.
CreateDistributionWithTagsResponse
-> Rep CreateDistributionWithTagsResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateDistributionWithTagsResponse' 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:
--
-- 'distribution', 'createDistributionWithTagsResponse_distribution' - The distribution\'s information.
--
-- 'eTag', 'createDistributionWithTagsResponse_eTag' - The current version of the distribution created.
--
-- 'location', 'createDistributionWithTagsResponse_location' - The fully qualified URI of the new distribution resource just created.
--
-- 'httpStatus', 'createDistributionWithTagsResponse_httpStatus' - The response's http status code.
newCreateDistributionWithTagsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateDistributionWithTagsResponse
newCreateDistributionWithTagsResponse :: Int -> CreateDistributionWithTagsResponse
newCreateDistributionWithTagsResponse Int
pHttpStatus_ =
  CreateDistributionWithTagsResponse'
    { $sel:distribution:CreateDistributionWithTagsResponse' :: Maybe Distribution
distribution =
        forall a. Maybe a
Prelude.Nothing,
      $sel:eTag:CreateDistributionWithTagsResponse' :: Maybe Text
eTag = forall a. Maybe a
Prelude.Nothing,
      $sel:location:CreateDistributionWithTagsResponse' :: Maybe Text
location = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateDistributionWithTagsResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The distribution\'s information.
createDistributionWithTagsResponse_distribution :: Lens.Lens' CreateDistributionWithTagsResponse (Prelude.Maybe Distribution)
createDistributionWithTagsResponse_distribution :: Lens' CreateDistributionWithTagsResponse (Maybe Distribution)
createDistributionWithTagsResponse_distribution = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDistributionWithTagsResponse' {Maybe Distribution
distribution :: Maybe Distribution
$sel:distribution:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Maybe Distribution
distribution} -> Maybe Distribution
distribution) (\s :: CreateDistributionWithTagsResponse
s@CreateDistributionWithTagsResponse' {} Maybe Distribution
a -> CreateDistributionWithTagsResponse
s {$sel:distribution:CreateDistributionWithTagsResponse' :: Maybe Distribution
distribution = Maybe Distribution
a} :: CreateDistributionWithTagsResponse)

-- | The current version of the distribution created.
createDistributionWithTagsResponse_eTag :: Lens.Lens' CreateDistributionWithTagsResponse (Prelude.Maybe Prelude.Text)
createDistributionWithTagsResponse_eTag :: Lens' CreateDistributionWithTagsResponse (Maybe Text)
createDistributionWithTagsResponse_eTag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDistributionWithTagsResponse' {Maybe Text
eTag :: Maybe Text
$sel:eTag:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Maybe Text
eTag} -> Maybe Text
eTag) (\s :: CreateDistributionWithTagsResponse
s@CreateDistributionWithTagsResponse' {} Maybe Text
a -> CreateDistributionWithTagsResponse
s {$sel:eTag:CreateDistributionWithTagsResponse' :: Maybe Text
eTag = Maybe Text
a} :: CreateDistributionWithTagsResponse)

-- | The fully qualified URI of the new distribution resource just created.
createDistributionWithTagsResponse_location :: Lens.Lens' CreateDistributionWithTagsResponse (Prelude.Maybe Prelude.Text)
createDistributionWithTagsResponse_location :: Lens' CreateDistributionWithTagsResponse (Maybe Text)
createDistributionWithTagsResponse_location = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDistributionWithTagsResponse' {Maybe Text
location :: Maybe Text
$sel:location:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Maybe Text
location} -> Maybe Text
location) (\s :: CreateDistributionWithTagsResponse
s@CreateDistributionWithTagsResponse' {} Maybe Text
a -> CreateDistributionWithTagsResponse
s {$sel:location:CreateDistributionWithTagsResponse' :: Maybe Text
location = Maybe Text
a} :: CreateDistributionWithTagsResponse)

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

instance
  Prelude.NFData
    CreateDistributionWithTagsResponse
  where
  rnf :: CreateDistributionWithTagsResponse -> ()
rnf CreateDistributionWithTagsResponse' {Int
Maybe Text
Maybe Distribution
httpStatus :: Int
location :: Maybe Text
eTag :: Maybe Text
distribution :: Maybe Distribution
$sel:httpStatus:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Int
$sel:location:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Maybe Text
$sel:eTag:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Maybe Text
$sel:distribution:CreateDistributionWithTagsResponse' :: CreateDistributionWithTagsResponse -> Maybe Distribution
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Distribution
distribution
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
eTag
      seq :: forall a b. a -> b -> b
`Prelude.seq` 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