{-# 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.SMS.GenerateChangeSet
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Generates a target change set for a currently launched stack and writes
-- it to an Amazon S3 object in the customer’s Amazon S3 bucket.
module Amazonka.SMS.GenerateChangeSet
  ( -- * Creating a Request
    GenerateChangeSet (..),
    newGenerateChangeSet,

    -- * Request Lenses
    generateChangeSet_appId,
    generateChangeSet_changesetFormat,

    -- * Destructuring the Response
    GenerateChangeSetResponse (..),
    newGenerateChangeSetResponse,

    -- * Response Lenses
    generateChangeSetResponse_s3Location,
    generateChangeSetResponse_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.SMS.Types

-- | /See:/ 'newGenerateChangeSet' smart constructor.
data GenerateChangeSet = GenerateChangeSet'
  { -- | The ID of the application associated with the change set.
    GenerateChangeSet -> Maybe Text
appId :: Prelude.Maybe Prelude.Text,
    -- | The format for the change set.
    GenerateChangeSet -> Maybe OutputFormat
changesetFormat :: Prelude.Maybe OutputFormat
  }
  deriving (GenerateChangeSet -> GenerateChangeSet -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GenerateChangeSet -> GenerateChangeSet -> Bool
$c/= :: GenerateChangeSet -> GenerateChangeSet -> Bool
== :: GenerateChangeSet -> GenerateChangeSet -> Bool
$c== :: GenerateChangeSet -> GenerateChangeSet -> Bool
Prelude.Eq, ReadPrec [GenerateChangeSet]
ReadPrec GenerateChangeSet
Int -> ReadS GenerateChangeSet
ReadS [GenerateChangeSet]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GenerateChangeSet]
$creadListPrec :: ReadPrec [GenerateChangeSet]
readPrec :: ReadPrec GenerateChangeSet
$creadPrec :: ReadPrec GenerateChangeSet
readList :: ReadS [GenerateChangeSet]
$creadList :: ReadS [GenerateChangeSet]
readsPrec :: Int -> ReadS GenerateChangeSet
$creadsPrec :: Int -> ReadS GenerateChangeSet
Prelude.Read, Int -> GenerateChangeSet -> ShowS
[GenerateChangeSet] -> ShowS
GenerateChangeSet -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GenerateChangeSet] -> ShowS
$cshowList :: [GenerateChangeSet] -> ShowS
show :: GenerateChangeSet -> String
$cshow :: GenerateChangeSet -> String
showsPrec :: Int -> GenerateChangeSet -> ShowS
$cshowsPrec :: Int -> GenerateChangeSet -> ShowS
Prelude.Show, forall x. Rep GenerateChangeSet x -> GenerateChangeSet
forall x. GenerateChangeSet -> Rep GenerateChangeSet x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GenerateChangeSet x -> GenerateChangeSet
$cfrom :: forall x. GenerateChangeSet -> Rep GenerateChangeSet x
Prelude.Generic)

-- |
-- Create a value of 'GenerateChangeSet' 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:
--
-- 'appId', 'generateChangeSet_appId' - The ID of the application associated with the change set.
--
-- 'changesetFormat', 'generateChangeSet_changesetFormat' - The format for the change set.
newGenerateChangeSet ::
  GenerateChangeSet
newGenerateChangeSet :: GenerateChangeSet
newGenerateChangeSet =
  GenerateChangeSet'
    { $sel:appId:GenerateChangeSet' :: Maybe Text
appId = forall a. Maybe a
Prelude.Nothing,
      $sel:changesetFormat:GenerateChangeSet' :: Maybe OutputFormat
changesetFormat = forall a. Maybe a
Prelude.Nothing
    }

-- | The ID of the application associated with the change set.
generateChangeSet_appId :: Lens.Lens' GenerateChangeSet (Prelude.Maybe Prelude.Text)
generateChangeSet_appId :: Lens' GenerateChangeSet (Maybe Text)
generateChangeSet_appId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GenerateChangeSet' {Maybe Text
appId :: Maybe Text
$sel:appId:GenerateChangeSet' :: GenerateChangeSet -> Maybe Text
appId} -> Maybe Text
appId) (\s :: GenerateChangeSet
s@GenerateChangeSet' {} Maybe Text
a -> GenerateChangeSet
s {$sel:appId:GenerateChangeSet' :: Maybe Text
appId = Maybe Text
a} :: GenerateChangeSet)

-- | The format for the change set.
generateChangeSet_changesetFormat :: Lens.Lens' GenerateChangeSet (Prelude.Maybe OutputFormat)
generateChangeSet_changesetFormat :: Lens' GenerateChangeSet (Maybe OutputFormat)
generateChangeSet_changesetFormat = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GenerateChangeSet' {Maybe OutputFormat
changesetFormat :: Maybe OutputFormat
$sel:changesetFormat:GenerateChangeSet' :: GenerateChangeSet -> Maybe OutputFormat
changesetFormat} -> Maybe OutputFormat
changesetFormat) (\s :: GenerateChangeSet
s@GenerateChangeSet' {} Maybe OutputFormat
a -> GenerateChangeSet
s {$sel:changesetFormat:GenerateChangeSet' :: Maybe OutputFormat
changesetFormat = Maybe OutputFormat
a} :: GenerateChangeSet)

instance Core.AWSRequest GenerateChangeSet where
  type
    AWSResponse GenerateChangeSet =
      GenerateChangeSetResponse
  request :: (Service -> Service)
-> GenerateChangeSet -> Request GenerateChangeSet
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 GenerateChangeSet
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse GenerateChangeSet)))
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 S3Location -> Int -> GenerateChangeSetResponse
GenerateChangeSetResponse'
            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
"s3Location")
            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 GenerateChangeSet where
  hashWithSalt :: Int -> GenerateChangeSet -> Int
hashWithSalt Int
_salt GenerateChangeSet' {Maybe Text
Maybe OutputFormat
changesetFormat :: Maybe OutputFormat
appId :: Maybe Text
$sel:changesetFormat:GenerateChangeSet' :: GenerateChangeSet -> Maybe OutputFormat
$sel:appId:GenerateChangeSet' :: GenerateChangeSet -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
appId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe OutputFormat
changesetFormat

instance Prelude.NFData GenerateChangeSet where
  rnf :: GenerateChangeSet -> ()
rnf GenerateChangeSet' {Maybe Text
Maybe OutputFormat
changesetFormat :: Maybe OutputFormat
appId :: Maybe Text
$sel:changesetFormat:GenerateChangeSet' :: GenerateChangeSet -> Maybe OutputFormat
$sel:appId:GenerateChangeSet' :: GenerateChangeSet -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
appId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe OutputFormat
changesetFormat

instance Data.ToHeaders GenerateChangeSet where
  toHeaders :: GenerateChangeSet -> 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
"AWSServerMigrationService_V2016_10_24.GenerateChangeSet" ::
                          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 GenerateChangeSet where
  toJSON :: GenerateChangeSet -> Value
toJSON GenerateChangeSet' {Maybe Text
Maybe OutputFormat
changesetFormat :: Maybe OutputFormat
appId :: Maybe Text
$sel:changesetFormat:GenerateChangeSet' :: GenerateChangeSet -> Maybe OutputFormat
$sel:appId:GenerateChangeSet' :: GenerateChangeSet -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"appId" 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 Text
appId,
            (Key
"changesetFormat" 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 OutputFormat
changesetFormat
          ]
      )

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

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

-- | /See:/ 'newGenerateChangeSetResponse' smart constructor.
data GenerateChangeSetResponse = GenerateChangeSetResponse'
  { -- | The location of the Amazon S3 object.
    GenerateChangeSetResponse -> Maybe S3Location
s3Location :: Prelude.Maybe S3Location,
    -- | The response's http status code.
    GenerateChangeSetResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (GenerateChangeSetResponse -> GenerateChangeSetResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GenerateChangeSetResponse -> GenerateChangeSetResponse -> Bool
$c/= :: GenerateChangeSetResponse -> GenerateChangeSetResponse -> Bool
== :: GenerateChangeSetResponse -> GenerateChangeSetResponse -> Bool
$c== :: GenerateChangeSetResponse -> GenerateChangeSetResponse -> Bool
Prelude.Eq, ReadPrec [GenerateChangeSetResponse]
ReadPrec GenerateChangeSetResponse
Int -> ReadS GenerateChangeSetResponse
ReadS [GenerateChangeSetResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GenerateChangeSetResponse]
$creadListPrec :: ReadPrec [GenerateChangeSetResponse]
readPrec :: ReadPrec GenerateChangeSetResponse
$creadPrec :: ReadPrec GenerateChangeSetResponse
readList :: ReadS [GenerateChangeSetResponse]
$creadList :: ReadS [GenerateChangeSetResponse]
readsPrec :: Int -> ReadS GenerateChangeSetResponse
$creadsPrec :: Int -> ReadS GenerateChangeSetResponse
Prelude.Read, Int -> GenerateChangeSetResponse -> ShowS
[GenerateChangeSetResponse] -> ShowS
GenerateChangeSetResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GenerateChangeSetResponse] -> ShowS
$cshowList :: [GenerateChangeSetResponse] -> ShowS
show :: GenerateChangeSetResponse -> String
$cshow :: GenerateChangeSetResponse -> String
showsPrec :: Int -> GenerateChangeSetResponse -> ShowS
$cshowsPrec :: Int -> GenerateChangeSetResponse -> ShowS
Prelude.Show, forall x.
Rep GenerateChangeSetResponse x -> GenerateChangeSetResponse
forall x.
GenerateChangeSetResponse -> Rep GenerateChangeSetResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GenerateChangeSetResponse x -> GenerateChangeSetResponse
$cfrom :: forall x.
GenerateChangeSetResponse -> Rep GenerateChangeSetResponse x
Prelude.Generic)

-- |
-- Create a value of 'GenerateChangeSetResponse' 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:
--
-- 's3Location', 'generateChangeSetResponse_s3Location' - The location of the Amazon S3 object.
--
-- 'httpStatus', 'generateChangeSetResponse_httpStatus' - The response's http status code.
newGenerateChangeSetResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GenerateChangeSetResponse
newGenerateChangeSetResponse :: Int -> GenerateChangeSetResponse
newGenerateChangeSetResponse Int
pHttpStatus_ =
  GenerateChangeSetResponse'
    { $sel:s3Location:GenerateChangeSetResponse' :: Maybe S3Location
s3Location =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GenerateChangeSetResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The location of the Amazon S3 object.
generateChangeSetResponse_s3Location :: Lens.Lens' GenerateChangeSetResponse (Prelude.Maybe S3Location)
generateChangeSetResponse_s3Location :: Lens' GenerateChangeSetResponse (Maybe S3Location)
generateChangeSetResponse_s3Location = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GenerateChangeSetResponse' {Maybe S3Location
s3Location :: Maybe S3Location
$sel:s3Location:GenerateChangeSetResponse' :: GenerateChangeSetResponse -> Maybe S3Location
s3Location} -> Maybe S3Location
s3Location) (\s :: GenerateChangeSetResponse
s@GenerateChangeSetResponse' {} Maybe S3Location
a -> GenerateChangeSetResponse
s {$sel:s3Location:GenerateChangeSetResponse' :: Maybe S3Location
s3Location = Maybe S3Location
a} :: GenerateChangeSetResponse)

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

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