{-# 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.MetricsFilter
-- 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.MetricsFilter 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.MetricsAndOperator
import Amazonka.S3.Types.Tag

-- | Specifies a metrics configuration filter. The metrics configuration only
-- includes objects that meet the filter\'s criteria. A filter must be a
-- prefix, an object tag, an access point ARN, or a conjunction
-- (MetricsAndOperator). For more information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html PutBucketMetricsConfiguration>.
--
-- /See:/ 'newMetricsFilter' smart constructor.
data MetricsFilter = MetricsFilter'
  { -- | The access point ARN used when evaluating a metrics filter.
    MetricsFilter -> Maybe Text
accessPointArn :: Prelude.Maybe Prelude.Text,
    -- | 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.
    MetricsFilter -> Maybe MetricsAndOperator
and :: Prelude.Maybe MetricsAndOperator,
    -- | The prefix used when evaluating a metrics filter.
    MetricsFilter -> Maybe Text
prefix :: Prelude.Maybe Prelude.Text,
    -- | The tag used when evaluating a metrics filter.
    MetricsFilter -> Maybe Tag
tag :: Prelude.Maybe Tag
  }
  deriving (MetricsFilter -> MetricsFilter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetricsFilter -> MetricsFilter -> Bool
$c/= :: MetricsFilter -> MetricsFilter -> Bool
== :: MetricsFilter -> MetricsFilter -> Bool
$c== :: MetricsFilter -> MetricsFilter -> Bool
Prelude.Eq, ReadPrec [MetricsFilter]
ReadPrec MetricsFilter
Int -> ReadS MetricsFilter
ReadS [MetricsFilter]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MetricsFilter]
$creadListPrec :: ReadPrec [MetricsFilter]
readPrec :: ReadPrec MetricsFilter
$creadPrec :: ReadPrec MetricsFilter
readList :: ReadS [MetricsFilter]
$creadList :: ReadS [MetricsFilter]
readsPrec :: Int -> ReadS MetricsFilter
$creadsPrec :: Int -> ReadS MetricsFilter
Prelude.Read, Int -> MetricsFilter -> ShowS
[MetricsFilter] -> ShowS
MetricsFilter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetricsFilter] -> ShowS
$cshowList :: [MetricsFilter] -> ShowS
show :: MetricsFilter -> String
$cshow :: MetricsFilter -> String
showsPrec :: Int -> MetricsFilter -> ShowS
$cshowsPrec :: Int -> MetricsFilter -> ShowS
Prelude.Show, forall x. Rep MetricsFilter x -> MetricsFilter
forall x. MetricsFilter -> Rep MetricsFilter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MetricsFilter x -> MetricsFilter
$cfrom :: forall x. MetricsFilter -> Rep MetricsFilter x
Prelude.Generic)

-- |
-- Create a value of 'MetricsFilter' 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:
--
-- 'accessPointArn', 'metricsFilter_accessPointArn' - The access point ARN used when evaluating a metrics filter.
--
-- 'and', 'metricsFilter_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', 'metricsFilter_prefix' - The prefix used when evaluating a metrics filter.
--
-- 'tag', 'metricsFilter_tag' - The tag used when evaluating a metrics filter.
newMetricsFilter ::
  MetricsFilter
newMetricsFilter :: MetricsFilter
newMetricsFilter =
  MetricsFilter'
    { $sel:accessPointArn:MetricsFilter' :: Maybe Text
accessPointArn = forall a. Maybe a
Prelude.Nothing,
      $sel:and:MetricsFilter' :: Maybe MetricsAndOperator
and = forall a. Maybe a
Prelude.Nothing,
      $sel:prefix:MetricsFilter' :: Maybe Text
prefix = forall a. Maybe a
Prelude.Nothing,
      $sel:tag:MetricsFilter' :: Maybe Tag
tag = forall a. Maybe a
Prelude.Nothing
    }

-- | The access point ARN used when evaluating a metrics filter.
metricsFilter_accessPointArn :: Lens.Lens' MetricsFilter (Prelude.Maybe Prelude.Text)
metricsFilter_accessPointArn :: Lens' MetricsFilter (Maybe Text)
metricsFilter_accessPointArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricsFilter' {Maybe Text
accessPointArn :: Maybe Text
$sel:accessPointArn:MetricsFilter' :: MetricsFilter -> Maybe Text
accessPointArn} -> Maybe Text
accessPointArn) (\s :: MetricsFilter
s@MetricsFilter' {} Maybe Text
a -> MetricsFilter
s {$sel:accessPointArn:MetricsFilter' :: Maybe Text
accessPointArn = Maybe Text
a} :: MetricsFilter)

-- | 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.
metricsFilter_and :: Lens.Lens' MetricsFilter (Prelude.Maybe MetricsAndOperator)
metricsFilter_and :: Lens' MetricsFilter (Maybe MetricsAndOperator)
metricsFilter_and = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricsFilter' {Maybe MetricsAndOperator
and :: Maybe MetricsAndOperator
$sel:and:MetricsFilter' :: MetricsFilter -> Maybe MetricsAndOperator
and} -> Maybe MetricsAndOperator
and) (\s :: MetricsFilter
s@MetricsFilter' {} Maybe MetricsAndOperator
a -> MetricsFilter
s {$sel:and:MetricsFilter' :: Maybe MetricsAndOperator
and = Maybe MetricsAndOperator
a} :: MetricsFilter)

-- | The prefix used when evaluating a metrics filter.
metricsFilter_prefix :: Lens.Lens' MetricsFilter (Prelude.Maybe Prelude.Text)
metricsFilter_prefix :: Lens' MetricsFilter (Maybe Text)
metricsFilter_prefix = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricsFilter' {Maybe Text
prefix :: Maybe Text
$sel:prefix:MetricsFilter' :: MetricsFilter -> Maybe Text
prefix} -> Maybe Text
prefix) (\s :: MetricsFilter
s@MetricsFilter' {} Maybe Text
a -> MetricsFilter
s {$sel:prefix:MetricsFilter' :: Maybe Text
prefix = Maybe Text
a} :: MetricsFilter)

-- | The tag used when evaluating a metrics filter.
metricsFilter_tag :: Lens.Lens' MetricsFilter (Prelude.Maybe Tag)
metricsFilter_tag :: Lens' MetricsFilter (Maybe Tag)
metricsFilter_tag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricsFilter' {Maybe Tag
tag :: Maybe Tag
$sel:tag:MetricsFilter' :: MetricsFilter -> Maybe Tag
tag} -> Maybe Tag
tag) (\s :: MetricsFilter
s@MetricsFilter' {} Maybe Tag
a -> MetricsFilter
s {$sel:tag:MetricsFilter' :: Maybe Tag
tag = Maybe Tag
a} :: MetricsFilter)

instance Data.FromXML MetricsFilter where
  parseXML :: [Node] -> Either String MetricsFilter
parseXML [Node]
x =
    Maybe Text
-> Maybe MetricsAndOperator
-> Maybe Text
-> Maybe Tag
-> MetricsFilter
MetricsFilter'
      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
"AccessPointArn")
      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
"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 MetricsFilter where
  hashWithSalt :: Int -> MetricsFilter -> Int
hashWithSalt Int
_salt MetricsFilter' {Maybe Text
Maybe Tag
Maybe MetricsAndOperator
tag :: Maybe Tag
prefix :: Maybe Text
and :: Maybe MetricsAndOperator
accessPointArn :: Maybe Text
$sel:tag:MetricsFilter' :: MetricsFilter -> Maybe Tag
$sel:prefix:MetricsFilter' :: MetricsFilter -> Maybe Text
$sel:and:MetricsFilter' :: MetricsFilter -> Maybe MetricsAndOperator
$sel:accessPointArn:MetricsFilter' :: MetricsFilter -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
accessPointArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe MetricsAndOperator
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 MetricsFilter where
  rnf :: MetricsFilter -> ()
rnf MetricsFilter' {Maybe Text
Maybe Tag
Maybe MetricsAndOperator
tag :: Maybe Tag
prefix :: Maybe Text
and :: Maybe MetricsAndOperator
accessPointArn :: Maybe Text
$sel:tag:MetricsFilter' :: MetricsFilter -> Maybe Tag
$sel:prefix:MetricsFilter' :: MetricsFilter -> Maybe Text
$sel:and:MetricsFilter' :: MetricsFilter -> Maybe MetricsAndOperator
$sel:accessPointArn:MetricsFilter' :: MetricsFilter -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
accessPointArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe MetricsAndOperator
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 MetricsFilter where
  toXML :: MetricsFilter -> XML
toXML MetricsFilter' {Maybe Text
Maybe Tag
Maybe MetricsAndOperator
tag :: Maybe Tag
prefix :: Maybe Text
and :: Maybe MetricsAndOperator
accessPointArn :: Maybe Text
$sel:tag:MetricsFilter' :: MetricsFilter -> Maybe Tag
$sel:prefix:MetricsFilter' :: MetricsFilter -> Maybe Text
$sel:and:MetricsFilter' :: MetricsFilter -> Maybe MetricsAndOperator
$sel:accessPointArn:MetricsFilter' :: MetricsFilter -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ Name
"AccessPointArn" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe Text
accessPointArn,
        Name
"And" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe MetricsAndOperator
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
      ]