{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.WAFV2.Types.HeaderMatchPattern
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.WAFV2.Types.HeaderMatchPattern 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 Amazonka.WAFV2.Types.All

-- | The filter to use to identify the subset of headers to inspect in a web
-- request.
--
-- You must specify exactly one setting: either @All@, @IncludedHeaders@,
-- or @ExcludedHeaders@.
--
-- Example JSON:
-- @\"MatchPattern\": { \"ExcludedHeaders\": {\"KeyToExclude1\", \"KeyToExclude2\"} }@
--
-- /See:/ 'newHeaderMatchPattern' smart constructor.
data HeaderMatchPattern = HeaderMatchPattern'
  { -- | Inspect all headers.
    HeaderMatchPattern -> Maybe All
all :: Prelude.Maybe All,
    -- | Inspect only the headers whose keys don\'t match any of the strings
    -- specified here.
    HeaderMatchPattern -> Maybe (NonEmpty Text)
excludedHeaders :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
    -- | Inspect only the headers that have a key that matches one of the strings
    -- specified here.
    HeaderMatchPattern -> Maybe (NonEmpty Text)
includedHeaders :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text)
  }
  deriving (HeaderMatchPattern -> HeaderMatchPattern -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HeaderMatchPattern -> HeaderMatchPattern -> Bool
$c/= :: HeaderMatchPattern -> HeaderMatchPattern -> Bool
== :: HeaderMatchPattern -> HeaderMatchPattern -> Bool
$c== :: HeaderMatchPattern -> HeaderMatchPattern -> Bool
Prelude.Eq, ReadPrec [HeaderMatchPattern]
ReadPrec HeaderMatchPattern
Int -> ReadS HeaderMatchPattern
ReadS [HeaderMatchPattern]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [HeaderMatchPattern]
$creadListPrec :: ReadPrec [HeaderMatchPattern]
readPrec :: ReadPrec HeaderMatchPattern
$creadPrec :: ReadPrec HeaderMatchPattern
readList :: ReadS [HeaderMatchPattern]
$creadList :: ReadS [HeaderMatchPattern]
readsPrec :: Int -> ReadS HeaderMatchPattern
$creadsPrec :: Int -> ReadS HeaderMatchPattern
Prelude.Read, Int -> HeaderMatchPattern -> ShowS
[HeaderMatchPattern] -> ShowS
HeaderMatchPattern -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HeaderMatchPattern] -> ShowS
$cshowList :: [HeaderMatchPattern] -> ShowS
show :: HeaderMatchPattern -> String
$cshow :: HeaderMatchPattern -> String
showsPrec :: Int -> HeaderMatchPattern -> ShowS
$cshowsPrec :: Int -> HeaderMatchPattern -> ShowS
Prelude.Show, forall x. Rep HeaderMatchPattern x -> HeaderMatchPattern
forall x. HeaderMatchPattern -> Rep HeaderMatchPattern x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep HeaderMatchPattern x -> HeaderMatchPattern
$cfrom :: forall x. HeaderMatchPattern -> Rep HeaderMatchPattern x
Prelude.Generic)

-- |
-- Create a value of 'HeaderMatchPattern' 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:
--
-- 'all', 'headerMatchPattern_all' - Inspect all headers.
--
-- 'excludedHeaders', 'headerMatchPattern_excludedHeaders' - Inspect only the headers whose keys don\'t match any of the strings
-- specified here.
--
-- 'includedHeaders', 'headerMatchPattern_includedHeaders' - Inspect only the headers that have a key that matches one of the strings
-- specified here.
newHeaderMatchPattern ::
  HeaderMatchPattern
newHeaderMatchPattern :: HeaderMatchPattern
newHeaderMatchPattern =
  HeaderMatchPattern'
    { $sel:all:HeaderMatchPattern' :: Maybe All
all = forall a. Maybe a
Prelude.Nothing,
      $sel:excludedHeaders:HeaderMatchPattern' :: Maybe (NonEmpty Text)
excludedHeaders = forall a. Maybe a
Prelude.Nothing,
      $sel:includedHeaders:HeaderMatchPattern' :: Maybe (NonEmpty Text)
includedHeaders = forall a. Maybe a
Prelude.Nothing
    }

-- | Inspect all headers.
headerMatchPattern_all :: Lens.Lens' HeaderMatchPattern (Prelude.Maybe All)
headerMatchPattern_all :: Lens' HeaderMatchPattern (Maybe All)
headerMatchPattern_all = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\HeaderMatchPattern' {Maybe All
all :: Maybe All
$sel:all:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe All
all} -> Maybe All
all) (\s :: HeaderMatchPattern
s@HeaderMatchPattern' {} Maybe All
a -> HeaderMatchPattern
s {$sel:all:HeaderMatchPattern' :: Maybe All
all = Maybe All
a} :: HeaderMatchPattern)

-- | Inspect only the headers whose keys don\'t match any of the strings
-- specified here.
headerMatchPattern_excludedHeaders :: Lens.Lens' HeaderMatchPattern (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
headerMatchPattern_excludedHeaders :: Lens' HeaderMatchPattern (Maybe (NonEmpty Text))
headerMatchPattern_excludedHeaders = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\HeaderMatchPattern' {Maybe (NonEmpty Text)
excludedHeaders :: Maybe (NonEmpty Text)
$sel:excludedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
excludedHeaders} -> Maybe (NonEmpty Text)
excludedHeaders) (\s :: HeaderMatchPattern
s@HeaderMatchPattern' {} Maybe (NonEmpty Text)
a -> HeaderMatchPattern
s {$sel:excludedHeaders:HeaderMatchPattern' :: Maybe (NonEmpty Text)
excludedHeaders = Maybe (NonEmpty Text)
a} :: HeaderMatchPattern) 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

-- | Inspect only the headers that have a key that matches one of the strings
-- specified here.
headerMatchPattern_includedHeaders :: Lens.Lens' HeaderMatchPattern (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
headerMatchPattern_includedHeaders :: Lens' HeaderMatchPattern (Maybe (NonEmpty Text))
headerMatchPattern_includedHeaders = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\HeaderMatchPattern' {Maybe (NonEmpty Text)
includedHeaders :: Maybe (NonEmpty Text)
$sel:includedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
includedHeaders} -> Maybe (NonEmpty Text)
includedHeaders) (\s :: HeaderMatchPattern
s@HeaderMatchPattern' {} Maybe (NonEmpty Text)
a -> HeaderMatchPattern
s {$sel:includedHeaders:HeaderMatchPattern' :: Maybe (NonEmpty Text)
includedHeaders = Maybe (NonEmpty Text)
a} :: HeaderMatchPattern) 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

instance Data.FromJSON HeaderMatchPattern where
  parseJSON :: Value -> Parser HeaderMatchPattern
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"HeaderMatchPattern"
      ( \Object
x ->
          Maybe All
-> Maybe (NonEmpty Text)
-> Maybe (NonEmpty Text)
-> HeaderMatchPattern
HeaderMatchPattern'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"All")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"ExcludedHeaders")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"IncludedHeaders")
      )

instance Prelude.Hashable HeaderMatchPattern where
  hashWithSalt :: Int -> HeaderMatchPattern -> Int
hashWithSalt Int
_salt HeaderMatchPattern' {Maybe (NonEmpty Text)
Maybe All
includedHeaders :: Maybe (NonEmpty Text)
excludedHeaders :: Maybe (NonEmpty Text)
all :: Maybe All
$sel:includedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
$sel:excludedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
$sel:all:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe All
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe All
all
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Text)
excludedHeaders
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Text)
includedHeaders

instance Prelude.NFData HeaderMatchPattern where
  rnf :: HeaderMatchPattern -> ()
rnf HeaderMatchPattern' {Maybe (NonEmpty Text)
Maybe All
includedHeaders :: Maybe (NonEmpty Text)
excludedHeaders :: Maybe (NonEmpty Text)
all :: Maybe All
$sel:includedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
$sel:excludedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
$sel:all:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe All
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe All
all
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Text)
excludedHeaders
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Text)
includedHeaders

instance Data.ToJSON HeaderMatchPattern where
  toJSON :: HeaderMatchPattern -> Value
toJSON HeaderMatchPattern' {Maybe (NonEmpty Text)
Maybe All
includedHeaders :: Maybe (NonEmpty Text)
excludedHeaders :: Maybe (NonEmpty Text)
all :: Maybe All
$sel:includedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
$sel:excludedHeaders:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe (NonEmpty Text)
$sel:all:HeaderMatchPattern' :: HeaderMatchPattern -> Maybe All
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"All" 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 All
all,
            (Key
"ExcludedHeaders" 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 Text)
excludedHeaders,
            (Key
"IncludedHeaders" 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 Text)
includedHeaders
          ]
      )