{-# 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.WAFRegional.CreateRateBasedRule
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- This is __AWS WAF Classic__ documentation. For more information, see
-- <https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html AWS WAF Classic>
-- in the developer guide.
--
-- __For the latest version of AWS WAF__, use the AWS WAFV2 API and see the
-- <https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html AWS WAF Developer Guide>.
-- With the latest version, AWS WAF has a single set of endpoints for
-- regional and global use.
--
-- Creates a RateBasedRule. The @RateBasedRule@ contains a @RateLimit@,
-- which specifies the maximum number of requests that AWS WAF allows from
-- a specified IP address in a five-minute period. The @RateBasedRule@ also
-- contains the @IPSet@ objects, @ByteMatchSet@ objects, and other
-- predicates that identify the requests that you want to count or block if
-- these requests exceed the @RateLimit@.
--
-- If you add more than one predicate to a @RateBasedRule@, a request not
-- only must exceed the @RateLimit@, but it also must match all the
-- conditions to be counted or blocked. For example, suppose you add the
-- following to a @RateBasedRule@:
--
-- -   An @IPSet@ that matches the IP address @192.0.2.44\/32@
--
-- -   A @ByteMatchSet@ that matches @BadBot@ in the @User-Agent@ header
--
-- Further, you specify a @RateLimit@ of 1,000.
--
-- You then add the @RateBasedRule@ to a @WebACL@ and specify that you want
-- to block requests that meet the conditions in the rule. For a request to
-- be blocked, it must come from the IP address 192.0.2.44 /and/ the
-- @User-Agent@ header in the request must contain the value @BadBot@.
-- Further, requests that match these two conditions must be received at a
-- rate of more than 1,000 requests every five minutes. If both conditions
-- are met and the rate is exceeded, AWS WAF blocks the requests. If the
-- rate drops below 1,000 for a five-minute period, AWS WAF no longer
-- blocks the requests.
--
-- As a second example, suppose you want to limit requests to a particular
-- page on your site. To do this, you could add the following to a
-- @RateBasedRule@:
--
-- -   A @ByteMatchSet@ with @FieldToMatch@ of @URI@
--
-- -   A @PositionalConstraint@ of @STARTS_WITH@
--
-- -   A @TargetString@ of @login@
--
-- Further, you specify a @RateLimit@ of 1,000.
--
-- By adding this @RateBasedRule@ to a @WebACL@, you could limit requests
-- to your login page without affecting the rest of your site.
--
-- To create and configure a @RateBasedRule@, perform the following steps:
--
-- 1.  Create and update the predicates that you want to include in the
--     rule. For more information, see CreateByteMatchSet, CreateIPSet, and
--     CreateSqlInjectionMatchSet.
--
-- 2.  Use GetChangeToken to get the change token that you provide in the
--     @ChangeToken@ parameter of a @CreateRule@ request.
--
-- 3.  Submit a @CreateRateBasedRule@ request.
--
-- 4.  Use @GetChangeToken@ to get the change token that you provide in the
--     @ChangeToken@ parameter of an UpdateRule request.
--
-- 5.  Submit an @UpdateRateBasedRule@ request to specify the predicates
--     that you want to include in the rule.
--
-- 6.  Create and update a @WebACL@ that contains the @RateBasedRule@. For
--     more information, see CreateWebACL.
--
-- For more information about how to use the AWS WAF API to allow or block
-- HTTP requests, see the
-- <https://docs.aws.amazon.com/waf/latest/developerguide/ AWS WAF Developer Guide>.
module Amazonka.WAFRegional.CreateRateBasedRule
  ( -- * Creating a Request
    CreateRateBasedRule (..),
    newCreateRateBasedRule,

    -- * Request Lenses
    createRateBasedRule_tags,
    createRateBasedRule_name,
    createRateBasedRule_metricName,
    createRateBasedRule_rateKey,
    createRateBasedRule_rateLimit,
    createRateBasedRule_changeToken,

    -- * Destructuring the Response
    CreateRateBasedRuleResponse (..),
    newCreateRateBasedRuleResponse,

    -- * Response Lenses
    createRateBasedRuleResponse_changeToken,
    createRateBasedRuleResponse_rule,
    createRateBasedRuleResponse_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.WAFRegional.Types

-- | /See:/ 'newCreateRateBasedRule' smart constructor.
data CreateRateBasedRule = CreateRateBasedRule'
  { CreateRateBasedRule -> Maybe (NonEmpty Tag)
tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
    -- | A friendly name or description of the RateBasedRule. You can\'t change
    -- the name of a @RateBasedRule@ after you create it.
    CreateRateBasedRule -> Text
name :: Prelude.Text,
    -- | A friendly name or description for the metrics for this @RateBasedRule@.
    -- The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with
    -- maximum length 128 and minimum length one. It can\'t contain whitespace
    -- or metric names reserved for AWS WAF, including \"All\" and
    -- \"Default_Action.\" You can\'t change the name of the metric after you
    -- create the @RateBasedRule@.
    CreateRateBasedRule -> Text
metricName :: Prelude.Text,
    -- | The field that AWS WAF uses to determine if requests are likely arriving
    -- from a single source and thus subject to rate monitoring. The only valid
    -- value for @RateKey@ is @IP@. @IP@ indicates that requests that arrive
    -- from the same IP address are subject to the @RateLimit@ that is
    -- specified in the @RateBasedRule@.
    CreateRateBasedRule -> RateKey
rateKey :: RateKey,
    -- | The maximum number of requests, which have an identical value in the
    -- field that is specified by @RateKey@, allowed in a five-minute period.
    -- If the number of requests exceeds the @RateLimit@ and the other
    -- predicates specified in the rule are also met, AWS WAF triggers the
    -- action that is specified for this rule.
    CreateRateBasedRule -> Natural
rateLimit :: Prelude.Natural,
    -- | The @ChangeToken@ that you used to submit the @CreateRateBasedRule@
    -- request. You can also use this value to query the status of the request.
    -- For more information, see GetChangeTokenStatus.
    CreateRateBasedRule -> Text
changeToken :: Prelude.Text
  }
  deriving (CreateRateBasedRule -> CreateRateBasedRule -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateRateBasedRule -> CreateRateBasedRule -> Bool
$c/= :: CreateRateBasedRule -> CreateRateBasedRule -> Bool
== :: CreateRateBasedRule -> CreateRateBasedRule -> Bool
$c== :: CreateRateBasedRule -> CreateRateBasedRule -> Bool
Prelude.Eq, ReadPrec [CreateRateBasedRule]
ReadPrec CreateRateBasedRule
Int -> ReadS CreateRateBasedRule
ReadS [CreateRateBasedRule]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateRateBasedRule]
$creadListPrec :: ReadPrec [CreateRateBasedRule]
readPrec :: ReadPrec CreateRateBasedRule
$creadPrec :: ReadPrec CreateRateBasedRule
readList :: ReadS [CreateRateBasedRule]
$creadList :: ReadS [CreateRateBasedRule]
readsPrec :: Int -> ReadS CreateRateBasedRule
$creadsPrec :: Int -> ReadS CreateRateBasedRule
Prelude.Read, Int -> CreateRateBasedRule -> ShowS
[CreateRateBasedRule] -> ShowS
CreateRateBasedRule -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateRateBasedRule] -> ShowS
$cshowList :: [CreateRateBasedRule] -> ShowS
show :: CreateRateBasedRule -> String
$cshow :: CreateRateBasedRule -> String
showsPrec :: Int -> CreateRateBasedRule -> ShowS
$cshowsPrec :: Int -> CreateRateBasedRule -> ShowS
Prelude.Show, forall x. Rep CreateRateBasedRule x -> CreateRateBasedRule
forall x. CreateRateBasedRule -> Rep CreateRateBasedRule x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateRateBasedRule x -> CreateRateBasedRule
$cfrom :: forall x. CreateRateBasedRule -> Rep CreateRateBasedRule x
Prelude.Generic)

-- |
-- Create a value of 'CreateRateBasedRule' 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:
--
-- 'tags', 'createRateBasedRule_tags' -
--
-- 'name', 'createRateBasedRule_name' - A friendly name or description of the RateBasedRule. You can\'t change
-- the name of a @RateBasedRule@ after you create it.
--
-- 'metricName', 'createRateBasedRule_metricName' - A friendly name or description for the metrics for this @RateBasedRule@.
-- The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with
-- maximum length 128 and minimum length one. It can\'t contain whitespace
-- or metric names reserved for AWS WAF, including \"All\" and
-- \"Default_Action.\" You can\'t change the name of the metric after you
-- create the @RateBasedRule@.
--
-- 'rateKey', 'createRateBasedRule_rateKey' - The field that AWS WAF uses to determine if requests are likely arriving
-- from a single source and thus subject to rate monitoring. The only valid
-- value for @RateKey@ is @IP@. @IP@ indicates that requests that arrive
-- from the same IP address are subject to the @RateLimit@ that is
-- specified in the @RateBasedRule@.
--
-- 'rateLimit', 'createRateBasedRule_rateLimit' - The maximum number of requests, which have an identical value in the
-- field that is specified by @RateKey@, allowed in a five-minute period.
-- If the number of requests exceeds the @RateLimit@ and the other
-- predicates specified in the rule are also met, AWS WAF triggers the
-- action that is specified for this rule.
--
-- 'changeToken', 'createRateBasedRule_changeToken' - The @ChangeToken@ that you used to submit the @CreateRateBasedRule@
-- request. You can also use this value to query the status of the request.
-- For more information, see GetChangeTokenStatus.
newCreateRateBasedRule ::
  -- | 'name'
  Prelude.Text ->
  -- | 'metricName'
  Prelude.Text ->
  -- | 'rateKey'
  RateKey ->
  -- | 'rateLimit'
  Prelude.Natural ->
  -- | 'changeToken'
  Prelude.Text ->
  CreateRateBasedRule
newCreateRateBasedRule :: Text -> Text -> RateKey -> Natural -> Text -> CreateRateBasedRule
newCreateRateBasedRule
  Text
pName_
  Text
pMetricName_
  RateKey
pRateKey_
  Natural
pRateLimit_
  Text
pChangeToken_ =
    CreateRateBasedRule'
      { $sel:tags:CreateRateBasedRule' :: Maybe (NonEmpty Tag)
tags = forall a. Maybe a
Prelude.Nothing,
        $sel:name:CreateRateBasedRule' :: Text
name = Text
pName_,
        $sel:metricName:CreateRateBasedRule' :: Text
metricName = Text
pMetricName_,
        $sel:rateKey:CreateRateBasedRule' :: RateKey
rateKey = RateKey
pRateKey_,
        $sel:rateLimit:CreateRateBasedRule' :: Natural
rateLimit = Natural
pRateLimit_,
        $sel:changeToken:CreateRateBasedRule' :: Text
changeToken = Text
pChangeToken_
      }

createRateBasedRule_tags :: Lens.Lens' CreateRateBasedRule (Prelude.Maybe (Prelude.NonEmpty Tag))
createRateBasedRule_tags :: Lens' CreateRateBasedRule (Maybe (NonEmpty Tag))
createRateBasedRule_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRule' {Maybe (NonEmpty Tag)
tags :: Maybe (NonEmpty Tag)
$sel:tags:CreateRateBasedRule' :: CreateRateBasedRule -> Maybe (NonEmpty Tag)
tags} -> Maybe (NonEmpty Tag)
tags) (\s :: CreateRateBasedRule
s@CreateRateBasedRule' {} Maybe (NonEmpty Tag)
a -> CreateRateBasedRule
s {$sel:tags:CreateRateBasedRule' :: Maybe (NonEmpty Tag)
tags = Maybe (NonEmpty Tag)
a} :: CreateRateBasedRule) 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 friendly name or description of the RateBasedRule. You can\'t change
-- the name of a @RateBasedRule@ after you create it.
createRateBasedRule_name :: Lens.Lens' CreateRateBasedRule Prelude.Text
createRateBasedRule_name :: Lens' CreateRateBasedRule Text
createRateBasedRule_name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRule' {Text
name :: Text
$sel:name:CreateRateBasedRule' :: CreateRateBasedRule -> Text
name} -> Text
name) (\s :: CreateRateBasedRule
s@CreateRateBasedRule' {} Text
a -> CreateRateBasedRule
s {$sel:name:CreateRateBasedRule' :: Text
name = Text
a} :: CreateRateBasedRule)

-- | A friendly name or description for the metrics for this @RateBasedRule@.
-- The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with
-- maximum length 128 and minimum length one. It can\'t contain whitespace
-- or metric names reserved for AWS WAF, including \"All\" and
-- \"Default_Action.\" You can\'t change the name of the metric after you
-- create the @RateBasedRule@.
createRateBasedRule_metricName :: Lens.Lens' CreateRateBasedRule Prelude.Text
createRateBasedRule_metricName :: Lens' CreateRateBasedRule Text
createRateBasedRule_metricName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRule' {Text
metricName :: Text
$sel:metricName:CreateRateBasedRule' :: CreateRateBasedRule -> Text
metricName} -> Text
metricName) (\s :: CreateRateBasedRule
s@CreateRateBasedRule' {} Text
a -> CreateRateBasedRule
s {$sel:metricName:CreateRateBasedRule' :: Text
metricName = Text
a} :: CreateRateBasedRule)

-- | The field that AWS WAF uses to determine if requests are likely arriving
-- from a single source and thus subject to rate monitoring. The only valid
-- value for @RateKey@ is @IP@. @IP@ indicates that requests that arrive
-- from the same IP address are subject to the @RateLimit@ that is
-- specified in the @RateBasedRule@.
createRateBasedRule_rateKey :: Lens.Lens' CreateRateBasedRule RateKey
createRateBasedRule_rateKey :: Lens' CreateRateBasedRule RateKey
createRateBasedRule_rateKey = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRule' {RateKey
rateKey :: RateKey
$sel:rateKey:CreateRateBasedRule' :: CreateRateBasedRule -> RateKey
rateKey} -> RateKey
rateKey) (\s :: CreateRateBasedRule
s@CreateRateBasedRule' {} RateKey
a -> CreateRateBasedRule
s {$sel:rateKey:CreateRateBasedRule' :: RateKey
rateKey = RateKey
a} :: CreateRateBasedRule)

-- | The maximum number of requests, which have an identical value in the
-- field that is specified by @RateKey@, allowed in a five-minute period.
-- If the number of requests exceeds the @RateLimit@ and the other
-- predicates specified in the rule are also met, AWS WAF triggers the
-- action that is specified for this rule.
createRateBasedRule_rateLimit :: Lens.Lens' CreateRateBasedRule Prelude.Natural
createRateBasedRule_rateLimit :: Lens' CreateRateBasedRule Natural
createRateBasedRule_rateLimit = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRule' {Natural
rateLimit :: Natural
$sel:rateLimit:CreateRateBasedRule' :: CreateRateBasedRule -> Natural
rateLimit} -> Natural
rateLimit) (\s :: CreateRateBasedRule
s@CreateRateBasedRule' {} Natural
a -> CreateRateBasedRule
s {$sel:rateLimit:CreateRateBasedRule' :: Natural
rateLimit = Natural
a} :: CreateRateBasedRule)

-- | The @ChangeToken@ that you used to submit the @CreateRateBasedRule@
-- request. You can also use this value to query the status of the request.
-- For more information, see GetChangeTokenStatus.
createRateBasedRule_changeToken :: Lens.Lens' CreateRateBasedRule Prelude.Text
createRateBasedRule_changeToken :: Lens' CreateRateBasedRule Text
createRateBasedRule_changeToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRule' {Text
changeToken :: Text
$sel:changeToken:CreateRateBasedRule' :: CreateRateBasedRule -> Text
changeToken} -> Text
changeToken) (\s :: CreateRateBasedRule
s@CreateRateBasedRule' {} Text
a -> CreateRateBasedRule
s {$sel:changeToken:CreateRateBasedRule' :: Text
changeToken = Text
a} :: CreateRateBasedRule)

instance Core.AWSRequest CreateRateBasedRule where
  type
    AWSResponse CreateRateBasedRule =
      CreateRateBasedRuleResponse
  request :: (Service -> Service)
-> CreateRateBasedRule -> Request CreateRateBasedRule
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 CreateRateBasedRule
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateRateBasedRule)))
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 Text
-> Maybe RateBasedRule -> Int -> CreateRateBasedRuleResponse
CreateRateBasedRuleResponse'
            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
"ChangeToken")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"Rule")
            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 CreateRateBasedRule where
  hashWithSalt :: Int -> CreateRateBasedRule -> Int
hashWithSalt Int
_salt CreateRateBasedRule' {Natural
Maybe (NonEmpty Tag)
Text
RateKey
changeToken :: Text
rateLimit :: Natural
rateKey :: RateKey
metricName :: Text
name :: Text
tags :: Maybe (NonEmpty Tag)
$sel:changeToken:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:rateLimit:CreateRateBasedRule' :: CreateRateBasedRule -> Natural
$sel:rateKey:CreateRateBasedRule' :: CreateRateBasedRule -> RateKey
$sel:metricName:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:name:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:tags:CreateRateBasedRule' :: CreateRateBasedRule -> Maybe (NonEmpty Tag)
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Tag)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
metricName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` RateKey
rateKey
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Natural
rateLimit
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
changeToken

instance Prelude.NFData CreateRateBasedRule where
  rnf :: CreateRateBasedRule -> ()
rnf CreateRateBasedRule' {Natural
Maybe (NonEmpty Tag)
Text
RateKey
changeToken :: Text
rateLimit :: Natural
rateKey :: RateKey
metricName :: Text
name :: Text
tags :: Maybe (NonEmpty Tag)
$sel:changeToken:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:rateLimit:CreateRateBasedRule' :: CreateRateBasedRule -> Natural
$sel:rateKey:CreateRateBasedRule' :: CreateRateBasedRule -> RateKey
$sel:metricName:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:name:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:tags:CreateRateBasedRule' :: CreateRateBasedRule -> Maybe (NonEmpty Tag)
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Tag)
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
name
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
metricName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf RateKey
rateKey
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Natural
rateLimit
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
changeToken

instance Data.ToHeaders CreateRateBasedRule where
  toHeaders :: CreateRateBasedRule -> 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
"AWSWAF_Regional_20161128.CreateRateBasedRule" ::
                          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 CreateRateBasedRule where
  toJSON :: CreateRateBasedRule -> Value
toJSON CreateRateBasedRule' {Natural
Maybe (NonEmpty Tag)
Text
RateKey
changeToken :: Text
rateLimit :: Natural
rateKey :: RateKey
metricName :: Text
name :: Text
tags :: Maybe (NonEmpty Tag)
$sel:changeToken:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:rateLimit:CreateRateBasedRule' :: CreateRateBasedRule -> Natural
$sel:rateKey:CreateRateBasedRule' :: CreateRateBasedRule -> RateKey
$sel:metricName:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:name:CreateRateBasedRule' :: CreateRateBasedRule -> Text
$sel:tags:CreateRateBasedRule' :: CreateRateBasedRule -> Maybe (NonEmpty Tag)
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Tags" 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 (NonEmpty Tag)
tags,
            forall a. a -> Maybe a
Prelude.Just (Key
"Name" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
name),
            forall a. a -> Maybe a
Prelude.Just (Key
"MetricName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
metricName),
            forall a. a -> Maybe a
Prelude.Just (Key
"RateKey" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= RateKey
rateKey),
            forall a. a -> Maybe a
Prelude.Just (Key
"RateLimit" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Natural
rateLimit),
            forall a. a -> Maybe a
Prelude.Just (Key
"ChangeToken" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
changeToken)
          ]
      )

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

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

-- | /See:/ 'newCreateRateBasedRuleResponse' smart constructor.
data CreateRateBasedRuleResponse = CreateRateBasedRuleResponse'
  { -- | The @ChangeToken@ that you used to submit the @CreateRateBasedRule@
    -- request. You can also use this value to query the status of the request.
    -- For more information, see GetChangeTokenStatus.
    CreateRateBasedRuleResponse -> Maybe Text
changeToken :: Prelude.Maybe Prelude.Text,
    -- | The RateBasedRule that is returned in the @CreateRateBasedRule@
    -- response.
    CreateRateBasedRuleResponse -> Maybe RateBasedRule
rule :: Prelude.Maybe RateBasedRule,
    -- | The response's http status code.
    CreateRateBasedRuleResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateRateBasedRuleResponse -> CreateRateBasedRuleResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateRateBasedRuleResponse -> CreateRateBasedRuleResponse -> Bool
$c/= :: CreateRateBasedRuleResponse -> CreateRateBasedRuleResponse -> Bool
== :: CreateRateBasedRuleResponse -> CreateRateBasedRuleResponse -> Bool
$c== :: CreateRateBasedRuleResponse -> CreateRateBasedRuleResponse -> Bool
Prelude.Eq, ReadPrec [CreateRateBasedRuleResponse]
ReadPrec CreateRateBasedRuleResponse
Int -> ReadS CreateRateBasedRuleResponse
ReadS [CreateRateBasedRuleResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateRateBasedRuleResponse]
$creadListPrec :: ReadPrec [CreateRateBasedRuleResponse]
readPrec :: ReadPrec CreateRateBasedRuleResponse
$creadPrec :: ReadPrec CreateRateBasedRuleResponse
readList :: ReadS [CreateRateBasedRuleResponse]
$creadList :: ReadS [CreateRateBasedRuleResponse]
readsPrec :: Int -> ReadS CreateRateBasedRuleResponse
$creadsPrec :: Int -> ReadS CreateRateBasedRuleResponse
Prelude.Read, Int -> CreateRateBasedRuleResponse -> ShowS
[CreateRateBasedRuleResponse] -> ShowS
CreateRateBasedRuleResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateRateBasedRuleResponse] -> ShowS
$cshowList :: [CreateRateBasedRuleResponse] -> ShowS
show :: CreateRateBasedRuleResponse -> String
$cshow :: CreateRateBasedRuleResponse -> String
showsPrec :: Int -> CreateRateBasedRuleResponse -> ShowS
$cshowsPrec :: Int -> CreateRateBasedRuleResponse -> ShowS
Prelude.Show, forall x.
Rep CreateRateBasedRuleResponse x -> CreateRateBasedRuleResponse
forall x.
CreateRateBasedRuleResponse -> Rep CreateRateBasedRuleResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateRateBasedRuleResponse x -> CreateRateBasedRuleResponse
$cfrom :: forall x.
CreateRateBasedRuleResponse -> Rep CreateRateBasedRuleResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateRateBasedRuleResponse' 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:
--
-- 'changeToken', 'createRateBasedRuleResponse_changeToken' - The @ChangeToken@ that you used to submit the @CreateRateBasedRule@
-- request. You can also use this value to query the status of the request.
-- For more information, see GetChangeTokenStatus.
--
-- 'rule', 'createRateBasedRuleResponse_rule' - The RateBasedRule that is returned in the @CreateRateBasedRule@
-- response.
--
-- 'httpStatus', 'createRateBasedRuleResponse_httpStatus' - The response's http status code.
newCreateRateBasedRuleResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateRateBasedRuleResponse
newCreateRateBasedRuleResponse :: Int -> CreateRateBasedRuleResponse
newCreateRateBasedRuleResponse Int
pHttpStatus_ =
  CreateRateBasedRuleResponse'
    { $sel:changeToken:CreateRateBasedRuleResponse' :: Maybe Text
changeToken =
        forall a. Maybe a
Prelude.Nothing,
      $sel:rule:CreateRateBasedRuleResponse' :: Maybe RateBasedRule
rule = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateRateBasedRuleResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The @ChangeToken@ that you used to submit the @CreateRateBasedRule@
-- request. You can also use this value to query the status of the request.
-- For more information, see GetChangeTokenStatus.
createRateBasedRuleResponse_changeToken :: Lens.Lens' CreateRateBasedRuleResponse (Prelude.Maybe Prelude.Text)
createRateBasedRuleResponse_changeToken :: Lens' CreateRateBasedRuleResponse (Maybe Text)
createRateBasedRuleResponse_changeToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRuleResponse' {Maybe Text
changeToken :: Maybe Text
$sel:changeToken:CreateRateBasedRuleResponse' :: CreateRateBasedRuleResponse -> Maybe Text
changeToken} -> Maybe Text
changeToken) (\s :: CreateRateBasedRuleResponse
s@CreateRateBasedRuleResponse' {} Maybe Text
a -> CreateRateBasedRuleResponse
s {$sel:changeToken:CreateRateBasedRuleResponse' :: Maybe Text
changeToken = Maybe Text
a} :: CreateRateBasedRuleResponse)

-- | The RateBasedRule that is returned in the @CreateRateBasedRule@
-- response.
createRateBasedRuleResponse_rule :: Lens.Lens' CreateRateBasedRuleResponse (Prelude.Maybe RateBasedRule)
createRateBasedRuleResponse_rule :: Lens' CreateRateBasedRuleResponse (Maybe RateBasedRule)
createRateBasedRuleResponse_rule = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateRateBasedRuleResponse' {Maybe RateBasedRule
rule :: Maybe RateBasedRule
$sel:rule:CreateRateBasedRuleResponse' :: CreateRateBasedRuleResponse -> Maybe RateBasedRule
rule} -> Maybe RateBasedRule
rule) (\s :: CreateRateBasedRuleResponse
s@CreateRateBasedRuleResponse' {} Maybe RateBasedRule
a -> CreateRateBasedRuleResponse
s {$sel:rule:CreateRateBasedRuleResponse' :: Maybe RateBasedRule
rule = Maybe RateBasedRule
a} :: CreateRateBasedRuleResponse)

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

instance Prelude.NFData CreateRateBasedRuleResponse where
  rnf :: CreateRateBasedRuleResponse -> ()
rnf CreateRateBasedRuleResponse' {Int
Maybe Text
Maybe RateBasedRule
httpStatus :: Int
rule :: Maybe RateBasedRule
changeToken :: Maybe Text
$sel:httpStatus:CreateRateBasedRuleResponse' :: CreateRateBasedRuleResponse -> Int
$sel:rule:CreateRateBasedRuleResponse' :: CreateRateBasedRuleResponse -> Maybe RateBasedRule
$sel:changeToken:CreateRateBasedRuleResponse' :: CreateRateBasedRuleResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
changeToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RateBasedRule
rule
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus