{-# 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.CreateDistribution
-- 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 CloudFront distribution.
module Amazonka.CloudFront.CreateDistribution
  ( -- * Creating a Request
    CreateDistribution (..),
    newCreateDistribution,

    -- * Request Lenses
    createDistribution_distributionConfig,

    -- * Destructuring the Response
    CreateDistributionResponse (..),
    newCreateDistributionResponse,

    -- * Response Lenses
    createDistributionResponse_distribution,
    createDistributionResponse_eTag,
    createDistributionResponse_location,
    createDistributionResponse_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.
--
-- /See:/ 'newCreateDistribution' smart constructor.
data CreateDistribution = CreateDistribution'
  { -- | The distribution\'s configuration information.
    CreateDistribution -> DistributionConfig
distributionConfig :: DistributionConfig
  }
  deriving (CreateDistribution -> CreateDistribution -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateDistribution -> CreateDistribution -> Bool
$c/= :: CreateDistribution -> CreateDistribution -> Bool
== :: CreateDistribution -> CreateDistribution -> Bool
$c== :: CreateDistribution -> CreateDistribution -> Bool
Prelude.Eq, Int -> CreateDistribution -> ShowS
[CreateDistribution] -> ShowS
CreateDistribution -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateDistribution] -> ShowS
$cshowList :: [CreateDistribution] -> ShowS
show :: CreateDistribution -> String
$cshow :: CreateDistribution -> String
showsPrec :: Int -> CreateDistribution -> ShowS
$cshowsPrec :: Int -> CreateDistribution -> ShowS
Prelude.Show, forall x. Rep CreateDistribution x -> CreateDistribution
forall x. CreateDistribution -> Rep CreateDistribution x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateDistribution x -> CreateDistribution
$cfrom :: forall x. CreateDistribution -> Rep CreateDistribution x
Prelude.Generic)

-- |
-- Create a value of 'CreateDistribution' 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:
--
-- 'distributionConfig', 'createDistribution_distributionConfig' - The distribution\'s configuration information.
newCreateDistribution ::
  -- | 'distributionConfig'
  DistributionConfig ->
  CreateDistribution
newCreateDistribution :: DistributionConfig -> CreateDistribution
newCreateDistribution DistributionConfig
pDistributionConfig_ =
  CreateDistribution'
    { $sel:distributionConfig:CreateDistribution' :: DistributionConfig
distributionConfig =
        DistributionConfig
pDistributionConfig_
    }

-- | The distribution\'s configuration information.
createDistribution_distributionConfig :: Lens.Lens' CreateDistribution DistributionConfig
createDistribution_distributionConfig :: Lens' CreateDistribution DistributionConfig
createDistribution_distributionConfig = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDistribution' {DistributionConfig
distributionConfig :: DistributionConfig
$sel:distributionConfig:CreateDistribution' :: CreateDistribution -> DistributionConfig
distributionConfig} -> DistributionConfig
distributionConfig) (\s :: CreateDistribution
s@CreateDistribution' {} DistributionConfig
a -> CreateDistribution
s {$sel:distributionConfig:CreateDistribution' :: DistributionConfig
distributionConfig = DistributionConfig
a} :: CreateDistribution)

instance Core.AWSRequest CreateDistribution where
  type
    AWSResponse CreateDistribution =
      CreateDistributionResponse
  request :: (Service -> Service)
-> CreateDistribution -> Request CreateDistribution
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 CreateDistribution
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateDistribution)))
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 -> CreateDistributionResponse
CreateDistributionResponse'
            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 CreateDistribution where
  hashWithSalt :: Int -> CreateDistribution -> Int
hashWithSalt Int
_salt CreateDistribution' {DistributionConfig
distributionConfig :: DistributionConfig
$sel:distributionConfig:CreateDistribution' :: CreateDistribution -> DistributionConfig
..} =
    Int
_salt forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` DistributionConfig
distributionConfig

instance Prelude.NFData CreateDistribution where
  rnf :: CreateDistribution -> ()
rnf CreateDistribution' {DistributionConfig
distributionConfig :: DistributionConfig
$sel:distributionConfig:CreateDistribution' :: CreateDistribution -> DistributionConfig
..} =
    forall a. NFData a => a -> ()
Prelude.rnf DistributionConfig
distributionConfig

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

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

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

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

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

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

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

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

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

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

instance Prelude.NFData CreateDistributionResponse where
  rnf :: CreateDistributionResponse -> ()
rnf CreateDistributionResponse' {Int
Maybe Text
Maybe Distribution
httpStatus :: Int
location :: Maybe Text
eTag :: Maybe Text
distribution :: Maybe Distribution
$sel:httpStatus:CreateDistributionResponse' :: CreateDistributionResponse -> Int
$sel:location:CreateDistributionResponse' :: CreateDistributionResponse -> Maybe Text
$sel:eTag:CreateDistributionResponse' :: CreateDistributionResponse -> Maybe Text
$sel:distribution:CreateDistributionResponse' :: CreateDistributionResponse -> 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