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

-- | The filter used to describe a set of objects for analyses. A filter must
-- have exactly one prefix, one tag, or one conjunction
-- (AnalyticsAndOperator). If no filter is provided, all objects will be
-- considered in any analysis.
--
-- /See:/ 'newAnalyticsFilter' smart constructor.
data AnalyticsFilter = AnalyticsFilter'
  { -- | A conjunction (logical AND) of predicates, which is used in evaluating
    -- an analytics filter. The operator must have at least two predicates.
    AnalyticsFilter -> Maybe AnalyticsAndOperator
and :: Prelude.Maybe AnalyticsAndOperator,
    -- | The prefix to use when evaluating an analytics filter.
    AnalyticsFilter -> Maybe Text
prefix :: Prelude.Maybe Prelude.Text,
    -- | The tag to use when evaluating an analytics filter.
    AnalyticsFilter -> Maybe Tag
tag :: Prelude.Maybe Tag
  }
  deriving (AnalyticsFilter -> AnalyticsFilter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AnalyticsFilter -> AnalyticsFilter -> Bool
$c/= :: AnalyticsFilter -> AnalyticsFilter -> Bool
== :: AnalyticsFilter -> AnalyticsFilter -> Bool
$c== :: AnalyticsFilter -> AnalyticsFilter -> Bool
Prelude.Eq, ReadPrec [AnalyticsFilter]
ReadPrec AnalyticsFilter
Int -> ReadS AnalyticsFilter
ReadS [AnalyticsFilter]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AnalyticsFilter]
$creadListPrec :: ReadPrec [AnalyticsFilter]
readPrec :: ReadPrec AnalyticsFilter
$creadPrec :: ReadPrec AnalyticsFilter
readList :: ReadS [AnalyticsFilter]
$creadList :: ReadS [AnalyticsFilter]
readsPrec :: Int -> ReadS AnalyticsFilter
$creadsPrec :: Int -> ReadS AnalyticsFilter
Prelude.Read, Int -> AnalyticsFilter -> ShowS
[AnalyticsFilter] -> ShowS
AnalyticsFilter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AnalyticsFilter] -> ShowS
$cshowList :: [AnalyticsFilter] -> ShowS
show :: AnalyticsFilter -> String
$cshow :: AnalyticsFilter -> String
showsPrec :: Int -> AnalyticsFilter -> ShowS
$cshowsPrec :: Int -> AnalyticsFilter -> ShowS
Prelude.Show, forall x. Rep AnalyticsFilter x -> AnalyticsFilter
forall x. AnalyticsFilter -> Rep AnalyticsFilter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AnalyticsFilter x -> AnalyticsFilter
$cfrom :: forall x. AnalyticsFilter -> Rep AnalyticsFilter x
Prelude.Generic)

-- |
-- Create a value of 'AnalyticsFilter' 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', 'analyticsFilter_and' - A conjunction (logical AND) of predicates, which is used in evaluating
-- an analytics filter. The operator must have at least two predicates.
--
-- 'prefix', 'analyticsFilter_prefix' - The prefix to use when evaluating an analytics filter.
--
-- 'tag', 'analyticsFilter_tag' - The tag to use when evaluating an analytics filter.
newAnalyticsFilter ::
  AnalyticsFilter
newAnalyticsFilter :: AnalyticsFilter
newAnalyticsFilter =
  AnalyticsFilter'
    { $sel:and:AnalyticsFilter' :: Maybe AnalyticsAndOperator
and = forall a. Maybe a
Prelude.Nothing,
      $sel:prefix:AnalyticsFilter' :: Maybe Text
prefix = forall a. Maybe a
Prelude.Nothing,
      $sel:tag:AnalyticsFilter' :: Maybe Tag
tag = forall a. Maybe a
Prelude.Nothing
    }

-- | A conjunction (logical AND) of predicates, which is used in evaluating
-- an analytics filter. The operator must have at least two predicates.
analyticsFilter_and :: Lens.Lens' AnalyticsFilter (Prelude.Maybe AnalyticsAndOperator)
analyticsFilter_and :: Lens' AnalyticsFilter (Maybe AnalyticsAndOperator)
analyticsFilter_and = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AnalyticsFilter' {Maybe AnalyticsAndOperator
and :: Maybe AnalyticsAndOperator
$sel:and:AnalyticsFilter' :: AnalyticsFilter -> Maybe AnalyticsAndOperator
and} -> Maybe AnalyticsAndOperator
and) (\s :: AnalyticsFilter
s@AnalyticsFilter' {} Maybe AnalyticsAndOperator
a -> AnalyticsFilter
s {$sel:and:AnalyticsFilter' :: Maybe AnalyticsAndOperator
and = Maybe AnalyticsAndOperator
a} :: AnalyticsFilter)

-- | The prefix to use when evaluating an analytics filter.
analyticsFilter_prefix :: Lens.Lens' AnalyticsFilter (Prelude.Maybe Prelude.Text)
analyticsFilter_prefix :: Lens' AnalyticsFilter (Maybe Text)
analyticsFilter_prefix = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AnalyticsFilter' {Maybe Text
prefix :: Maybe Text
$sel:prefix:AnalyticsFilter' :: AnalyticsFilter -> Maybe Text
prefix} -> Maybe Text
prefix) (\s :: AnalyticsFilter
s@AnalyticsFilter' {} Maybe Text
a -> AnalyticsFilter
s {$sel:prefix:AnalyticsFilter' :: Maybe Text
prefix = Maybe Text
a} :: AnalyticsFilter)

-- | The tag to use when evaluating an analytics filter.
analyticsFilter_tag :: Lens.Lens' AnalyticsFilter (Prelude.Maybe Tag)
analyticsFilter_tag :: Lens' AnalyticsFilter (Maybe Tag)
analyticsFilter_tag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AnalyticsFilter' {Maybe Tag
tag :: Maybe Tag
$sel:tag:AnalyticsFilter' :: AnalyticsFilter -> Maybe Tag
tag} -> Maybe Tag
tag) (\s :: AnalyticsFilter
s@AnalyticsFilter' {} Maybe Tag
a -> AnalyticsFilter
s {$sel:tag:AnalyticsFilter' :: Maybe Tag
tag = Maybe Tag
a} :: AnalyticsFilter)

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