{-# 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.DirectConnect.CreateDirectConnectGateway
-- 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 Direct Connect gateway, which is an intermediate object that
-- enables you to connect a set of virtual interfaces and virtual private
-- gateways. A Direct Connect gateway is global and visible in any Amazon
-- Web Services Region after it is created. The virtual interfaces and
-- virtual private gateways that are connected through a Direct Connect
-- gateway can be in different Amazon Web Services Regions. This enables
-- you to connect to a VPC in any Region, regardless of the Region in which
-- the virtual interfaces are located, and pass traffic between them.
module Amazonka.DirectConnect.CreateDirectConnectGateway
  ( -- * Creating a Request
    CreateDirectConnectGateway (..),
    newCreateDirectConnectGateway,

    -- * Request Lenses
    createDirectConnectGateway_amazonSideAsn,
    createDirectConnectGateway_directConnectGatewayName,

    -- * Destructuring the Response
    CreateDirectConnectGatewayResponse (..),
    newCreateDirectConnectGatewayResponse,

    -- * Response Lenses
    createDirectConnectGatewayResponse_directConnectGateway,
    createDirectConnectGatewayResponse_httpStatus,
  )
where

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

-- | /See:/ 'newCreateDirectConnectGateway' smart constructor.
data CreateDirectConnectGateway = CreateDirectConnectGateway'
  { -- | The autonomous system number (ASN) for Border Gateway Protocol (BGP) to
    -- be configured on the Amazon side of the connection. The ASN must be in
    -- the private range of 64,512 to 65,534 or 4,200,000,000 to 4,294,967,294.
    -- The default is 64512.
    CreateDirectConnectGateway -> Maybe Integer
amazonSideAsn :: Prelude.Maybe Prelude.Integer,
    -- | The name of the Direct Connect gateway.
    CreateDirectConnectGateway -> Text
directConnectGatewayName :: Prelude.Text
  }
  deriving (CreateDirectConnectGateway -> CreateDirectConnectGateway -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateDirectConnectGateway -> CreateDirectConnectGateway -> Bool
$c/= :: CreateDirectConnectGateway -> CreateDirectConnectGateway -> Bool
== :: CreateDirectConnectGateway -> CreateDirectConnectGateway -> Bool
$c== :: CreateDirectConnectGateway -> CreateDirectConnectGateway -> Bool
Prelude.Eq, ReadPrec [CreateDirectConnectGateway]
ReadPrec CreateDirectConnectGateway
Int -> ReadS CreateDirectConnectGateway
ReadS [CreateDirectConnectGateway]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateDirectConnectGateway]
$creadListPrec :: ReadPrec [CreateDirectConnectGateway]
readPrec :: ReadPrec CreateDirectConnectGateway
$creadPrec :: ReadPrec CreateDirectConnectGateway
readList :: ReadS [CreateDirectConnectGateway]
$creadList :: ReadS [CreateDirectConnectGateway]
readsPrec :: Int -> ReadS CreateDirectConnectGateway
$creadsPrec :: Int -> ReadS CreateDirectConnectGateway
Prelude.Read, Int -> CreateDirectConnectGateway -> ShowS
[CreateDirectConnectGateway] -> ShowS
CreateDirectConnectGateway -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateDirectConnectGateway] -> ShowS
$cshowList :: [CreateDirectConnectGateway] -> ShowS
show :: CreateDirectConnectGateway -> String
$cshow :: CreateDirectConnectGateway -> String
showsPrec :: Int -> CreateDirectConnectGateway -> ShowS
$cshowsPrec :: Int -> CreateDirectConnectGateway -> ShowS
Prelude.Show, forall x.
Rep CreateDirectConnectGateway x -> CreateDirectConnectGateway
forall x.
CreateDirectConnectGateway -> Rep CreateDirectConnectGateway x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateDirectConnectGateway x -> CreateDirectConnectGateway
$cfrom :: forall x.
CreateDirectConnectGateway -> Rep CreateDirectConnectGateway x
Prelude.Generic)

-- |
-- Create a value of 'CreateDirectConnectGateway' 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:
--
-- 'amazonSideAsn', 'createDirectConnectGateway_amazonSideAsn' - The autonomous system number (ASN) for Border Gateway Protocol (BGP) to
-- be configured on the Amazon side of the connection. The ASN must be in
-- the private range of 64,512 to 65,534 or 4,200,000,000 to 4,294,967,294.
-- The default is 64512.
--
-- 'directConnectGatewayName', 'createDirectConnectGateway_directConnectGatewayName' - The name of the Direct Connect gateway.
newCreateDirectConnectGateway ::
  -- | 'directConnectGatewayName'
  Prelude.Text ->
  CreateDirectConnectGateway
newCreateDirectConnectGateway :: Text -> CreateDirectConnectGateway
newCreateDirectConnectGateway
  Text
pDirectConnectGatewayName_ =
    CreateDirectConnectGateway'
      { $sel:amazonSideAsn:CreateDirectConnectGateway' :: Maybe Integer
amazonSideAsn =
          forall a. Maybe a
Prelude.Nothing,
        $sel:directConnectGatewayName:CreateDirectConnectGateway' :: Text
directConnectGatewayName =
          Text
pDirectConnectGatewayName_
      }

-- | The autonomous system number (ASN) for Border Gateway Protocol (BGP) to
-- be configured on the Amazon side of the connection. The ASN must be in
-- the private range of 64,512 to 65,534 or 4,200,000,000 to 4,294,967,294.
-- The default is 64512.
createDirectConnectGateway_amazonSideAsn :: Lens.Lens' CreateDirectConnectGateway (Prelude.Maybe Prelude.Integer)
createDirectConnectGateway_amazonSideAsn :: Lens' CreateDirectConnectGateway (Maybe Integer)
createDirectConnectGateway_amazonSideAsn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDirectConnectGateway' {Maybe Integer
amazonSideAsn :: Maybe Integer
$sel:amazonSideAsn:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Maybe Integer
amazonSideAsn} -> Maybe Integer
amazonSideAsn) (\s :: CreateDirectConnectGateway
s@CreateDirectConnectGateway' {} Maybe Integer
a -> CreateDirectConnectGateway
s {$sel:amazonSideAsn:CreateDirectConnectGateway' :: Maybe Integer
amazonSideAsn = Maybe Integer
a} :: CreateDirectConnectGateway)

-- | The name of the Direct Connect gateway.
createDirectConnectGateway_directConnectGatewayName :: Lens.Lens' CreateDirectConnectGateway Prelude.Text
createDirectConnectGateway_directConnectGatewayName :: Lens' CreateDirectConnectGateway Text
createDirectConnectGateway_directConnectGatewayName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDirectConnectGateway' {Text
directConnectGatewayName :: Text
$sel:directConnectGatewayName:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Text
directConnectGatewayName} -> Text
directConnectGatewayName) (\s :: CreateDirectConnectGateway
s@CreateDirectConnectGateway' {} Text
a -> CreateDirectConnectGateway
s {$sel:directConnectGatewayName:CreateDirectConnectGateway' :: Text
directConnectGatewayName = Text
a} :: CreateDirectConnectGateway)

instance Core.AWSRequest CreateDirectConnectGateway where
  type
    AWSResponse CreateDirectConnectGateway =
      CreateDirectConnectGatewayResponse
  request :: (Service -> Service)
-> CreateDirectConnectGateway -> Request CreateDirectConnectGateway
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateDirectConnectGateway
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateDirectConnectGateway)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe DirectConnectGateway
-> Int -> CreateDirectConnectGatewayResponse
CreateDirectConnectGatewayResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"directConnectGateway")
            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 CreateDirectConnectGateway where
  hashWithSalt :: Int -> CreateDirectConnectGateway -> Int
hashWithSalt Int
_salt CreateDirectConnectGateway' {Maybe Integer
Text
directConnectGatewayName :: Text
amazonSideAsn :: Maybe Integer
$sel:directConnectGatewayName:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Text
$sel:amazonSideAsn:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Maybe Integer
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Integer
amazonSideAsn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
directConnectGatewayName

instance Prelude.NFData CreateDirectConnectGateway where
  rnf :: CreateDirectConnectGateway -> ()
rnf CreateDirectConnectGateway' {Maybe Integer
Text
directConnectGatewayName :: Text
amazonSideAsn :: Maybe Integer
$sel:directConnectGatewayName:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Text
$sel:amazonSideAsn:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Maybe Integer
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Integer
amazonSideAsn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
directConnectGatewayName

instance Data.ToHeaders CreateDirectConnectGateway where
  toHeaders :: CreateDirectConnectGateway -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"OvertureService.CreateDirectConnectGateway" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON CreateDirectConnectGateway where
  toJSON :: CreateDirectConnectGateway -> Value
toJSON CreateDirectConnectGateway' {Maybe Integer
Text
directConnectGatewayName :: Text
amazonSideAsn :: Maybe Integer
$sel:directConnectGatewayName:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Text
$sel:amazonSideAsn:CreateDirectConnectGateway' :: CreateDirectConnectGateway -> Maybe Integer
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"amazonSideAsn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Integer
amazonSideAsn,
            forall a. a -> Maybe a
Prelude.Just
              ( Key
"directConnectGatewayName"
                  forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
directConnectGatewayName
              )
          ]
      )

instance Data.ToPath CreateDirectConnectGateway where
  toPath :: CreateDirectConnectGateway -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

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

-- | /See:/ 'newCreateDirectConnectGatewayResponse' smart constructor.
data CreateDirectConnectGatewayResponse = CreateDirectConnectGatewayResponse'
  { -- | The Direct Connect gateway.
    CreateDirectConnectGatewayResponse -> Maybe DirectConnectGateway
directConnectGateway :: Prelude.Maybe DirectConnectGateway,
    -- | The response's http status code.
    CreateDirectConnectGatewayResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateDirectConnectGatewayResponse
-> CreateDirectConnectGatewayResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateDirectConnectGatewayResponse
-> CreateDirectConnectGatewayResponse -> Bool
$c/= :: CreateDirectConnectGatewayResponse
-> CreateDirectConnectGatewayResponse -> Bool
== :: CreateDirectConnectGatewayResponse
-> CreateDirectConnectGatewayResponse -> Bool
$c== :: CreateDirectConnectGatewayResponse
-> CreateDirectConnectGatewayResponse -> Bool
Prelude.Eq, ReadPrec [CreateDirectConnectGatewayResponse]
ReadPrec CreateDirectConnectGatewayResponse
Int -> ReadS CreateDirectConnectGatewayResponse
ReadS [CreateDirectConnectGatewayResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateDirectConnectGatewayResponse]
$creadListPrec :: ReadPrec [CreateDirectConnectGatewayResponse]
readPrec :: ReadPrec CreateDirectConnectGatewayResponse
$creadPrec :: ReadPrec CreateDirectConnectGatewayResponse
readList :: ReadS [CreateDirectConnectGatewayResponse]
$creadList :: ReadS [CreateDirectConnectGatewayResponse]
readsPrec :: Int -> ReadS CreateDirectConnectGatewayResponse
$creadsPrec :: Int -> ReadS CreateDirectConnectGatewayResponse
Prelude.Read, Int -> CreateDirectConnectGatewayResponse -> ShowS
[CreateDirectConnectGatewayResponse] -> ShowS
CreateDirectConnectGatewayResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateDirectConnectGatewayResponse] -> ShowS
$cshowList :: [CreateDirectConnectGatewayResponse] -> ShowS
show :: CreateDirectConnectGatewayResponse -> String
$cshow :: CreateDirectConnectGatewayResponse -> String
showsPrec :: Int -> CreateDirectConnectGatewayResponse -> ShowS
$cshowsPrec :: Int -> CreateDirectConnectGatewayResponse -> ShowS
Prelude.Show, forall x.
Rep CreateDirectConnectGatewayResponse x
-> CreateDirectConnectGatewayResponse
forall x.
CreateDirectConnectGatewayResponse
-> Rep CreateDirectConnectGatewayResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateDirectConnectGatewayResponse x
-> CreateDirectConnectGatewayResponse
$cfrom :: forall x.
CreateDirectConnectGatewayResponse
-> Rep CreateDirectConnectGatewayResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateDirectConnectGatewayResponse' 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:
--
-- 'directConnectGateway', 'createDirectConnectGatewayResponse_directConnectGateway' - The Direct Connect gateway.
--
-- 'httpStatus', 'createDirectConnectGatewayResponse_httpStatus' - The response's http status code.
newCreateDirectConnectGatewayResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateDirectConnectGatewayResponse
newCreateDirectConnectGatewayResponse :: Int -> CreateDirectConnectGatewayResponse
newCreateDirectConnectGatewayResponse Int
pHttpStatus_ =
  CreateDirectConnectGatewayResponse'
    { $sel:directConnectGateway:CreateDirectConnectGatewayResponse' :: Maybe DirectConnectGateway
directConnectGateway =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateDirectConnectGatewayResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The Direct Connect gateway.
createDirectConnectGatewayResponse_directConnectGateway :: Lens.Lens' CreateDirectConnectGatewayResponse (Prelude.Maybe DirectConnectGateway)
createDirectConnectGatewayResponse_directConnectGateway :: Lens'
  CreateDirectConnectGatewayResponse (Maybe DirectConnectGateway)
createDirectConnectGatewayResponse_directConnectGateway = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateDirectConnectGatewayResponse' {Maybe DirectConnectGateway
directConnectGateway :: Maybe DirectConnectGateway
$sel:directConnectGateway:CreateDirectConnectGatewayResponse' :: CreateDirectConnectGatewayResponse -> Maybe DirectConnectGateway
directConnectGateway} -> Maybe DirectConnectGateway
directConnectGateway) (\s :: CreateDirectConnectGatewayResponse
s@CreateDirectConnectGatewayResponse' {} Maybe DirectConnectGateway
a -> CreateDirectConnectGatewayResponse
s {$sel:directConnectGateway:CreateDirectConnectGatewayResponse' :: Maybe DirectConnectGateway
directConnectGateway = Maybe DirectConnectGateway
a} :: CreateDirectConnectGatewayResponse)

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

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