{-# 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.ElasticBeanstalk.UpdateConfigurationTemplate
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Updates the specified configuration template to have the specified
-- properties or configuration option values.
--
-- If a property (for example, @ApplicationName@) is not provided, its
-- value remains unchanged. To clear such properties, specify an empty
-- string.
--
-- Related Topics
--
-- -   DescribeConfigurationOptions
module Amazonka.ElasticBeanstalk.UpdateConfigurationTemplate
  ( -- * Creating a Request
    UpdateConfigurationTemplate (..),
    newUpdateConfigurationTemplate,

    -- * Request Lenses
    updateConfigurationTemplate_description,
    updateConfigurationTemplate_optionSettings,
    updateConfigurationTemplate_optionsToRemove,
    updateConfigurationTemplate_applicationName,
    updateConfigurationTemplate_templateName,

    -- * Destructuring the Response
    ConfigurationSettingsDescription (..),
    newConfigurationSettingsDescription,

    -- * Response Lenses
    configurationSettingsDescription_applicationName,
    configurationSettingsDescription_dateCreated,
    configurationSettingsDescription_dateUpdated,
    configurationSettingsDescription_deploymentStatus,
    configurationSettingsDescription_description,
    configurationSettingsDescription_environmentName,
    configurationSettingsDescription_optionSettings,
    configurationSettingsDescription_platformArn,
    configurationSettingsDescription_solutionStackName,
    configurationSettingsDescription_templateName,
  )
where

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

-- | The result message containing the options for the specified solution
-- stack.
--
-- /See:/ 'newUpdateConfigurationTemplate' smart constructor.
data UpdateConfigurationTemplate = UpdateConfigurationTemplate'
  { -- | A new description for the configuration.
    UpdateConfigurationTemplate -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | A list of configuration option settings to update with the new specified
    -- option value.
    UpdateConfigurationTemplate -> Maybe [ConfigurationOptionSetting]
optionSettings :: Prelude.Maybe [ConfigurationOptionSetting],
    -- | A list of configuration options to remove from the configuration set.
    --
    -- Constraint: You can remove only @UserDefined@ configuration options.
    UpdateConfigurationTemplate -> Maybe [OptionSpecification]
optionsToRemove :: Prelude.Maybe [OptionSpecification],
    -- | The name of the application associated with the configuration template
    -- to update.
    --
    -- If no application is found with this name, @UpdateConfigurationTemplate@
    -- returns an @InvalidParameterValue@ error.
    UpdateConfigurationTemplate -> Text
applicationName :: Prelude.Text,
    -- | The name of the configuration template to update.
    --
    -- If no configuration template is found with this name,
    -- @UpdateConfigurationTemplate@ returns an @InvalidParameterValue@ error.
    UpdateConfigurationTemplate -> Text
templateName :: Prelude.Text
  }
  deriving (UpdateConfigurationTemplate -> UpdateConfigurationTemplate -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateConfigurationTemplate -> UpdateConfigurationTemplate -> Bool
$c/= :: UpdateConfigurationTemplate -> UpdateConfigurationTemplate -> Bool
== :: UpdateConfigurationTemplate -> UpdateConfigurationTemplate -> Bool
$c== :: UpdateConfigurationTemplate -> UpdateConfigurationTemplate -> Bool
Prelude.Eq, ReadPrec [UpdateConfigurationTemplate]
ReadPrec UpdateConfigurationTemplate
Int -> ReadS UpdateConfigurationTemplate
ReadS [UpdateConfigurationTemplate]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateConfigurationTemplate]
$creadListPrec :: ReadPrec [UpdateConfigurationTemplate]
readPrec :: ReadPrec UpdateConfigurationTemplate
$creadPrec :: ReadPrec UpdateConfigurationTemplate
readList :: ReadS [UpdateConfigurationTemplate]
$creadList :: ReadS [UpdateConfigurationTemplate]
readsPrec :: Int -> ReadS UpdateConfigurationTemplate
$creadsPrec :: Int -> ReadS UpdateConfigurationTemplate
Prelude.Read, Int -> UpdateConfigurationTemplate -> ShowS
[UpdateConfigurationTemplate] -> ShowS
UpdateConfigurationTemplate -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateConfigurationTemplate] -> ShowS
$cshowList :: [UpdateConfigurationTemplate] -> ShowS
show :: UpdateConfigurationTemplate -> String
$cshow :: UpdateConfigurationTemplate -> String
showsPrec :: Int -> UpdateConfigurationTemplate -> ShowS
$cshowsPrec :: Int -> UpdateConfigurationTemplate -> ShowS
Prelude.Show, forall x.
Rep UpdateConfigurationTemplate x -> UpdateConfigurationTemplate
forall x.
UpdateConfigurationTemplate -> Rep UpdateConfigurationTemplate x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep UpdateConfigurationTemplate x -> UpdateConfigurationTemplate
$cfrom :: forall x.
UpdateConfigurationTemplate -> Rep UpdateConfigurationTemplate x
Prelude.Generic)

-- |
-- Create a value of 'UpdateConfigurationTemplate' 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:
--
-- 'description', 'updateConfigurationTemplate_description' - A new description for the configuration.
--
-- 'optionSettings', 'updateConfigurationTemplate_optionSettings' - A list of configuration option settings to update with the new specified
-- option value.
--
-- 'optionsToRemove', 'updateConfigurationTemplate_optionsToRemove' - A list of configuration options to remove from the configuration set.
--
-- Constraint: You can remove only @UserDefined@ configuration options.
--
-- 'applicationName', 'updateConfigurationTemplate_applicationName' - The name of the application associated with the configuration template
-- to update.
--
-- If no application is found with this name, @UpdateConfigurationTemplate@
-- returns an @InvalidParameterValue@ error.
--
-- 'templateName', 'updateConfigurationTemplate_templateName' - The name of the configuration template to update.
--
-- If no configuration template is found with this name,
-- @UpdateConfigurationTemplate@ returns an @InvalidParameterValue@ error.
newUpdateConfigurationTemplate ::
  -- | 'applicationName'
  Prelude.Text ->
  -- | 'templateName'
  Prelude.Text ->
  UpdateConfigurationTemplate
newUpdateConfigurationTemplate :: Text -> Text -> UpdateConfigurationTemplate
newUpdateConfigurationTemplate
  Text
pApplicationName_
  Text
pTemplateName_ =
    UpdateConfigurationTemplate'
      { $sel:description:UpdateConfigurationTemplate' :: Maybe Text
description =
          forall a. Maybe a
Prelude.Nothing,
        $sel:optionSettings:UpdateConfigurationTemplate' :: Maybe [ConfigurationOptionSetting]
optionSettings = forall a. Maybe a
Prelude.Nothing,
        $sel:optionsToRemove:UpdateConfigurationTemplate' :: Maybe [OptionSpecification]
optionsToRemove = forall a. Maybe a
Prelude.Nothing,
        $sel:applicationName:UpdateConfigurationTemplate' :: Text
applicationName = Text
pApplicationName_,
        $sel:templateName:UpdateConfigurationTemplate' :: Text
templateName = Text
pTemplateName_
      }

-- | A new description for the configuration.
updateConfigurationTemplate_description :: Lens.Lens' UpdateConfigurationTemplate (Prelude.Maybe Prelude.Text)
updateConfigurationTemplate_description :: Lens' UpdateConfigurationTemplate (Maybe Text)
updateConfigurationTemplate_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateConfigurationTemplate' {Maybe Text
description :: Maybe Text
$sel:description:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe Text
description} -> Maybe Text
description) (\s :: UpdateConfigurationTemplate
s@UpdateConfigurationTemplate' {} Maybe Text
a -> UpdateConfigurationTemplate
s {$sel:description:UpdateConfigurationTemplate' :: Maybe Text
description = Maybe Text
a} :: UpdateConfigurationTemplate)

-- | A list of configuration option settings to update with the new specified
-- option value.
updateConfigurationTemplate_optionSettings :: Lens.Lens' UpdateConfigurationTemplate (Prelude.Maybe [ConfigurationOptionSetting])
updateConfigurationTemplate_optionSettings :: Lens'
  UpdateConfigurationTemplate (Maybe [ConfigurationOptionSetting])
updateConfigurationTemplate_optionSettings = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateConfigurationTemplate' {Maybe [ConfigurationOptionSetting]
optionSettings :: Maybe [ConfigurationOptionSetting]
$sel:optionSettings:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [ConfigurationOptionSetting]
optionSettings} -> Maybe [ConfigurationOptionSetting]
optionSettings) (\s :: UpdateConfigurationTemplate
s@UpdateConfigurationTemplate' {} Maybe [ConfigurationOptionSetting]
a -> UpdateConfigurationTemplate
s {$sel:optionSettings:UpdateConfigurationTemplate' :: Maybe [ConfigurationOptionSetting]
optionSettings = Maybe [ConfigurationOptionSetting]
a} :: UpdateConfigurationTemplate) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | A list of configuration options to remove from the configuration set.
--
-- Constraint: You can remove only @UserDefined@ configuration options.
updateConfigurationTemplate_optionsToRemove :: Lens.Lens' UpdateConfigurationTemplate (Prelude.Maybe [OptionSpecification])
updateConfigurationTemplate_optionsToRemove :: Lens' UpdateConfigurationTemplate (Maybe [OptionSpecification])
updateConfigurationTemplate_optionsToRemove = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateConfigurationTemplate' {Maybe [OptionSpecification]
optionsToRemove :: Maybe [OptionSpecification]
$sel:optionsToRemove:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [OptionSpecification]
optionsToRemove} -> Maybe [OptionSpecification]
optionsToRemove) (\s :: UpdateConfigurationTemplate
s@UpdateConfigurationTemplate' {} Maybe [OptionSpecification]
a -> UpdateConfigurationTemplate
s {$sel:optionsToRemove:UpdateConfigurationTemplate' :: Maybe [OptionSpecification]
optionsToRemove = Maybe [OptionSpecification]
a} :: UpdateConfigurationTemplate) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The name of the application associated with the configuration template
-- to update.
--
-- If no application is found with this name, @UpdateConfigurationTemplate@
-- returns an @InvalidParameterValue@ error.
updateConfigurationTemplate_applicationName :: Lens.Lens' UpdateConfigurationTemplate Prelude.Text
updateConfigurationTemplate_applicationName :: Lens' UpdateConfigurationTemplate Text
updateConfigurationTemplate_applicationName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateConfigurationTemplate' {Text
applicationName :: Text
$sel:applicationName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
applicationName} -> Text
applicationName) (\s :: UpdateConfigurationTemplate
s@UpdateConfigurationTemplate' {} Text
a -> UpdateConfigurationTemplate
s {$sel:applicationName:UpdateConfigurationTemplate' :: Text
applicationName = Text
a} :: UpdateConfigurationTemplate)

-- | The name of the configuration template to update.
--
-- If no configuration template is found with this name,
-- @UpdateConfigurationTemplate@ returns an @InvalidParameterValue@ error.
updateConfigurationTemplate_templateName :: Lens.Lens' UpdateConfigurationTemplate Prelude.Text
updateConfigurationTemplate_templateName :: Lens' UpdateConfigurationTemplate Text
updateConfigurationTemplate_templateName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateConfigurationTemplate' {Text
templateName :: Text
$sel:templateName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
templateName} -> Text
templateName) (\s :: UpdateConfigurationTemplate
s@UpdateConfigurationTemplate' {} Text
a -> UpdateConfigurationTemplate
s {$sel:templateName:UpdateConfigurationTemplate' :: Text
templateName = Text
a} :: UpdateConfigurationTemplate)

instance Core.AWSRequest UpdateConfigurationTemplate where
  type
    AWSResponse UpdateConfigurationTemplate =
      ConfigurationSettingsDescription
  request :: (Service -> Service)
-> UpdateConfigurationTemplate
-> Request UpdateConfigurationTemplate
request Service -> Service
overrides =
    forall a. ToRequest a => Service -> a -> Request a
Request.postQuery (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy UpdateConfigurationTemplate
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse UpdateConfigurationTemplate)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
Text
-> (Int
    -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXMLWrapper
      Text
"UpdateConfigurationTemplateResult"
      (\Int
s ResponseHeaders
h [Node]
x -> forall a. FromXML a => [Node] -> Either String a
Data.parseXML [Node]
x)

instance Prelude.Hashable UpdateConfigurationTemplate where
  hashWithSalt :: Int -> UpdateConfigurationTemplate -> Int
hashWithSalt Int
_salt UpdateConfigurationTemplate' {Maybe [ConfigurationOptionSetting]
Maybe [OptionSpecification]
Maybe Text
Text
templateName :: Text
applicationName :: Text
optionsToRemove :: Maybe [OptionSpecification]
optionSettings :: Maybe [ConfigurationOptionSetting]
description :: Maybe Text
$sel:templateName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
$sel:applicationName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
$sel:optionsToRemove:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [OptionSpecification]
$sel:optionSettings:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [ConfigurationOptionSetting]
$sel:description:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [ConfigurationOptionSetting]
optionSettings
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [OptionSpecification]
optionsToRemove
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
applicationName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
templateName

instance Prelude.NFData UpdateConfigurationTemplate where
  rnf :: UpdateConfigurationTemplate -> ()
rnf UpdateConfigurationTemplate' {Maybe [ConfigurationOptionSetting]
Maybe [OptionSpecification]
Maybe Text
Text
templateName :: Text
applicationName :: Text
optionsToRemove :: Maybe [OptionSpecification]
optionSettings :: Maybe [ConfigurationOptionSetting]
description :: Maybe Text
$sel:templateName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
$sel:applicationName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
$sel:optionsToRemove:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [OptionSpecification]
$sel:optionSettings:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [ConfigurationOptionSetting]
$sel:description:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [ConfigurationOptionSetting]
optionSettings
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [OptionSpecification]
optionsToRemove
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
applicationName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
templateName

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

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

instance Data.ToQuery UpdateConfigurationTemplate where
  toQuery :: UpdateConfigurationTemplate -> QueryString
toQuery UpdateConfigurationTemplate' {Maybe [ConfigurationOptionSetting]
Maybe [OptionSpecification]
Maybe Text
Text
templateName :: Text
applicationName :: Text
optionsToRemove :: Maybe [OptionSpecification]
optionSettings :: Maybe [ConfigurationOptionSetting]
description :: Maybe Text
$sel:templateName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
$sel:applicationName:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Text
$sel:optionsToRemove:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [OptionSpecification]
$sel:optionSettings:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe [ConfigurationOptionSetting]
$sel:description:UpdateConfigurationTemplate' :: UpdateConfigurationTemplate -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: ( ByteString
"UpdateConfigurationTemplate" ::
                      Prelude.ByteString
                  ),
        ByteString
"Version"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2010-12-01" :: Prelude.ByteString),
        ByteString
"Description" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe Text
description,
        ByteString
"OptionSettings"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: forall a. ToQuery a => a -> QueryString
Data.toQuery
            ( forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Data.toQueryList ByteString
"member"
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [ConfigurationOptionSetting]
optionSettings
            ),
        ByteString
"OptionsToRemove"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: forall a. ToQuery a => a -> QueryString
Data.toQuery
            ( forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Data.toQueryList ByteString
"member"
                forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [OptionSpecification]
optionsToRemove
            ),
        ByteString
"ApplicationName" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
applicationName,
        ByteString
"TemplateName" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
templateName
      ]