{-# 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.S3.Types.IntelligentTieringFilter
-- 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.S3.Types.IntelligentTieringFilter 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.S3.Internal
import Amazonka.S3.Types.IntelligentTieringAndOperator
import Amazonka.S3.Types.Tag

-- | The @Filter@ is used to identify objects that the S3 Intelligent-Tiering
-- configuration applies to.
--
-- /See:/ 'newIntelligentTieringFilter' smart constructor.
data IntelligentTieringFilter = IntelligentTieringFilter'
  { -- | A conjunction (logical AND) of predicates, which is used in evaluating a
    -- metrics filter. The operator must have at least two predicates, and an
    -- object must match all of the predicates in order for the filter to
    -- apply.
    IntelligentTieringFilter -> Maybe IntelligentTieringAndOperator
and :: Prelude.Maybe IntelligentTieringAndOperator,
    -- | An object key name prefix that identifies the subset of objects to which
    -- the rule applies.
    --
    -- Replacement must be made for object keys containing special characters
    -- (such as carriage returns) when using XML requests. For more
    -- information, see
    -- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints XML related object key constraints>.
    IntelligentTieringFilter -> Maybe Text
prefix :: Prelude.Maybe Prelude.Text,
    IntelligentTieringFilter -> Maybe Tag
tag :: Prelude.Maybe Tag
  }
  deriving (IntelligentTieringFilter -> IntelligentTieringFilter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IntelligentTieringFilter -> IntelligentTieringFilter -> Bool
$c/= :: IntelligentTieringFilter -> IntelligentTieringFilter -> Bool
== :: IntelligentTieringFilter -> IntelligentTieringFilter -> Bool
$c== :: IntelligentTieringFilter -> IntelligentTieringFilter -> Bool
Prelude.Eq, ReadPrec [IntelligentTieringFilter]
ReadPrec IntelligentTieringFilter
Int -> ReadS IntelligentTieringFilter
ReadS [IntelligentTieringFilter]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [IntelligentTieringFilter]
$creadListPrec :: ReadPrec [IntelligentTieringFilter]
readPrec :: ReadPrec IntelligentTieringFilter
$creadPrec :: ReadPrec IntelligentTieringFilter
readList :: ReadS [IntelligentTieringFilter]
$creadList :: ReadS [IntelligentTieringFilter]
readsPrec :: Int -> ReadS IntelligentTieringFilter
$creadsPrec :: Int -> ReadS IntelligentTieringFilter
Prelude.Read, Int -> IntelligentTieringFilter -> ShowS
[IntelligentTieringFilter] -> ShowS
IntelligentTieringFilter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IntelligentTieringFilter] -> ShowS
$cshowList :: [IntelligentTieringFilter] -> ShowS
show :: IntelligentTieringFilter -> String
$cshow :: IntelligentTieringFilter -> String
showsPrec :: Int -> IntelligentTieringFilter -> ShowS
$cshowsPrec :: Int -> IntelligentTieringFilter -> ShowS
Prelude.Show, forall x.
Rep IntelligentTieringFilter x -> IntelligentTieringFilter
forall x.
IntelligentTieringFilter -> Rep IntelligentTieringFilter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep IntelligentTieringFilter x -> IntelligentTieringFilter
$cfrom :: forall x.
IntelligentTieringFilter -> Rep IntelligentTieringFilter x
Prelude.Generic)

-- |
-- Create a value of 'IntelligentTieringFilter' 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:
--
-- 'and', 'intelligentTieringFilter_and' - A conjunction (logical AND) of predicates, which is used in evaluating a
-- metrics filter. The operator must have at least two predicates, and an
-- object must match all of the predicates in order for the filter to
-- apply.
--
-- 'prefix', 'intelligentTieringFilter_prefix' - An object key name prefix that identifies the subset of objects to which
-- the rule applies.
--
-- Replacement must be made for object keys containing special characters
-- (such as carriage returns) when using XML requests. For more
-- information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints XML related object key constraints>.
--
-- 'tag', 'intelligentTieringFilter_tag' - Undocumented member.
newIntelligentTieringFilter ::
  IntelligentTieringFilter
newIntelligentTieringFilter :: IntelligentTieringFilter
newIntelligentTieringFilter =
  IntelligentTieringFilter'
    { $sel:and:IntelligentTieringFilter' :: Maybe IntelligentTieringAndOperator
and = forall a. Maybe a
Prelude.Nothing,
      $sel:prefix:IntelligentTieringFilter' :: Maybe Text
prefix = forall a. Maybe a
Prelude.Nothing,
      $sel:tag:IntelligentTieringFilter' :: Maybe Tag
tag = forall a. Maybe a
Prelude.Nothing
    }

-- | A conjunction (logical AND) of predicates, which is used in evaluating a
-- metrics filter. The operator must have at least two predicates, and an
-- object must match all of the predicates in order for the filter to
-- apply.
intelligentTieringFilter_and :: Lens.Lens' IntelligentTieringFilter (Prelude.Maybe IntelligentTieringAndOperator)
intelligentTieringFilter_and :: Lens'
  IntelligentTieringFilter (Maybe IntelligentTieringAndOperator)
intelligentTieringFilter_and = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\IntelligentTieringFilter' {Maybe IntelligentTieringAndOperator
and :: Maybe IntelligentTieringAndOperator
$sel:and:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe IntelligentTieringAndOperator
and} -> Maybe IntelligentTieringAndOperator
and) (\s :: IntelligentTieringFilter
s@IntelligentTieringFilter' {} Maybe IntelligentTieringAndOperator
a -> IntelligentTieringFilter
s {$sel:and:IntelligentTieringFilter' :: Maybe IntelligentTieringAndOperator
and = Maybe IntelligentTieringAndOperator
a} :: IntelligentTieringFilter)

-- | An object key name prefix that identifies the subset of objects to which
-- the rule applies.
--
-- Replacement must be made for object keys containing special characters
-- (such as carriage returns) when using XML requests. For more
-- information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints XML related object key constraints>.
intelligentTieringFilter_prefix :: Lens.Lens' IntelligentTieringFilter (Prelude.Maybe Prelude.Text)
intelligentTieringFilter_prefix :: Lens' IntelligentTieringFilter (Maybe Text)
intelligentTieringFilter_prefix = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\IntelligentTieringFilter' {Maybe Text
prefix :: Maybe Text
$sel:prefix:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Text
prefix} -> Maybe Text
prefix) (\s :: IntelligentTieringFilter
s@IntelligentTieringFilter' {} Maybe Text
a -> IntelligentTieringFilter
s {$sel:prefix:IntelligentTieringFilter' :: Maybe Text
prefix = Maybe Text
a} :: IntelligentTieringFilter)

-- | Undocumented member.
intelligentTieringFilter_tag :: Lens.Lens' IntelligentTieringFilter (Prelude.Maybe Tag)
intelligentTieringFilter_tag :: Lens' IntelligentTieringFilter (Maybe Tag)
intelligentTieringFilter_tag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\IntelligentTieringFilter' {Maybe Tag
tag :: Maybe Tag
$sel:tag:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Tag
tag} -> Maybe Tag
tag) (\s :: IntelligentTieringFilter
s@IntelligentTieringFilter' {} Maybe Tag
a -> IntelligentTieringFilter
s {$sel:tag:IntelligentTieringFilter' :: Maybe Tag
tag = Maybe Tag
a} :: IntelligentTieringFilter)

instance Data.FromXML IntelligentTieringFilter where
  parseXML :: [Node] -> Either String IntelligentTieringFilter
parseXML [Node]
x =
    Maybe IntelligentTieringAndOperator
-> Maybe Text -> Maybe Tag -> IntelligentTieringFilter
IntelligentTieringFilter'
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"And")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"Prefix")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"Tag")

instance Prelude.Hashable IntelligentTieringFilter where
  hashWithSalt :: Int -> IntelligentTieringFilter -> Int
hashWithSalt Int
_salt IntelligentTieringFilter' {Maybe Text
Maybe Tag
Maybe IntelligentTieringAndOperator
tag :: Maybe Tag
prefix :: Maybe Text
and :: Maybe IntelligentTieringAndOperator
$sel:tag:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Tag
$sel:prefix:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Text
$sel:and:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe IntelligentTieringAndOperator
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe IntelligentTieringAndOperator
and
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
prefix
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Tag
tag

instance Prelude.NFData IntelligentTieringFilter where
  rnf :: IntelligentTieringFilter -> ()
rnf IntelligentTieringFilter' {Maybe Text
Maybe Tag
Maybe IntelligentTieringAndOperator
tag :: Maybe Tag
prefix :: Maybe Text
and :: Maybe IntelligentTieringAndOperator
$sel:tag:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Tag
$sel:prefix:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Text
$sel:and:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe IntelligentTieringAndOperator
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe IntelligentTieringAndOperator
and
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
prefix
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Tag
tag

instance Data.ToXML IntelligentTieringFilter where
  toXML :: IntelligentTieringFilter -> XML
toXML IntelligentTieringFilter' {Maybe Text
Maybe Tag
Maybe IntelligentTieringAndOperator
tag :: Maybe Tag
prefix :: Maybe Text
and :: Maybe IntelligentTieringAndOperator
$sel:tag:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Tag
$sel:prefix:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe Text
$sel:and:IntelligentTieringFilter' :: IntelligentTieringFilter -> Maybe IntelligentTieringAndOperator
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ Name
"And" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe IntelligentTieringAndOperator
and,
        Name
"Prefix" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe Text
prefix,
        Name
"Tag" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe Tag
tag
      ]