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

-- | Specifies the configuration and any analyses for the analytics filter of
-- an Amazon S3 bucket.
--
-- /See:/ 'newAnalyticsConfiguration' smart constructor.
data AnalyticsConfiguration = AnalyticsConfiguration'
  { -- | 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.
    AnalyticsConfiguration -> Maybe AnalyticsFilter
filter' :: Prelude.Maybe AnalyticsFilter,
    -- | The ID that identifies the analytics configuration.
    AnalyticsConfiguration -> Text
id :: Prelude.Text,
    -- | Contains data related to access patterns to be collected and made
    -- available to analyze the tradeoffs between different storage classes.
    AnalyticsConfiguration -> StorageClassAnalysis
storageClassAnalysis :: StorageClassAnalysis
  }
  deriving (AnalyticsConfiguration -> AnalyticsConfiguration -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AnalyticsConfiguration -> AnalyticsConfiguration -> Bool
$c/= :: AnalyticsConfiguration -> AnalyticsConfiguration -> Bool
== :: AnalyticsConfiguration -> AnalyticsConfiguration -> Bool
$c== :: AnalyticsConfiguration -> AnalyticsConfiguration -> Bool
Prelude.Eq, ReadPrec [AnalyticsConfiguration]
ReadPrec AnalyticsConfiguration
Int -> ReadS AnalyticsConfiguration
ReadS [AnalyticsConfiguration]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AnalyticsConfiguration]
$creadListPrec :: ReadPrec [AnalyticsConfiguration]
readPrec :: ReadPrec AnalyticsConfiguration
$creadPrec :: ReadPrec AnalyticsConfiguration
readList :: ReadS [AnalyticsConfiguration]
$creadList :: ReadS [AnalyticsConfiguration]
readsPrec :: Int -> ReadS AnalyticsConfiguration
$creadsPrec :: Int -> ReadS AnalyticsConfiguration
Prelude.Read, Int -> AnalyticsConfiguration -> ShowS
[AnalyticsConfiguration] -> ShowS
AnalyticsConfiguration -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AnalyticsConfiguration] -> ShowS
$cshowList :: [AnalyticsConfiguration] -> ShowS
show :: AnalyticsConfiguration -> String
$cshow :: AnalyticsConfiguration -> String
showsPrec :: Int -> AnalyticsConfiguration -> ShowS
$cshowsPrec :: Int -> AnalyticsConfiguration -> ShowS
Prelude.Show, forall x. Rep AnalyticsConfiguration x -> AnalyticsConfiguration
forall x. AnalyticsConfiguration -> Rep AnalyticsConfiguration x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AnalyticsConfiguration x -> AnalyticsConfiguration
$cfrom :: forall x. AnalyticsConfiguration -> Rep AnalyticsConfiguration x
Prelude.Generic)

-- |
-- Create a value of 'AnalyticsConfiguration' 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:
--
-- 'filter'', 'analyticsConfiguration_filter' - 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.
--
-- 'id', 'analyticsConfiguration_id' - The ID that identifies the analytics configuration.
--
-- 'storageClassAnalysis', 'analyticsConfiguration_storageClassAnalysis' - Contains data related to access patterns to be collected and made
-- available to analyze the tradeoffs between different storage classes.
newAnalyticsConfiguration ::
  -- | 'id'
  Prelude.Text ->
  -- | 'storageClassAnalysis'
  StorageClassAnalysis ->
  AnalyticsConfiguration
newAnalyticsConfiguration :: Text -> StorageClassAnalysis -> AnalyticsConfiguration
newAnalyticsConfiguration Text
pId_ StorageClassAnalysis
pStorageClassAnalysis_ =
  AnalyticsConfiguration'
    { $sel:filter':AnalyticsConfiguration' :: Maybe AnalyticsFilter
filter' = forall a. Maybe a
Prelude.Nothing,
      $sel:id:AnalyticsConfiguration' :: Text
id = Text
pId_,
      $sel:storageClassAnalysis:AnalyticsConfiguration' :: StorageClassAnalysis
storageClassAnalysis = StorageClassAnalysis
pStorageClassAnalysis_
    }

-- | 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.
analyticsConfiguration_filter :: Lens.Lens' AnalyticsConfiguration (Prelude.Maybe AnalyticsFilter)
analyticsConfiguration_filter :: Lens' AnalyticsConfiguration (Maybe AnalyticsFilter)
analyticsConfiguration_filter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AnalyticsConfiguration' {Maybe AnalyticsFilter
filter' :: Maybe AnalyticsFilter
$sel:filter':AnalyticsConfiguration' :: AnalyticsConfiguration -> Maybe AnalyticsFilter
filter'} -> Maybe AnalyticsFilter
filter') (\s :: AnalyticsConfiguration
s@AnalyticsConfiguration' {} Maybe AnalyticsFilter
a -> AnalyticsConfiguration
s {$sel:filter':AnalyticsConfiguration' :: Maybe AnalyticsFilter
filter' = Maybe AnalyticsFilter
a} :: AnalyticsConfiguration)

-- | The ID that identifies the analytics configuration.
analyticsConfiguration_id :: Lens.Lens' AnalyticsConfiguration Prelude.Text
analyticsConfiguration_id :: Lens' AnalyticsConfiguration Text
analyticsConfiguration_id = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AnalyticsConfiguration' {Text
id :: Text
$sel:id:AnalyticsConfiguration' :: AnalyticsConfiguration -> Text
id} -> Text
id) (\s :: AnalyticsConfiguration
s@AnalyticsConfiguration' {} Text
a -> AnalyticsConfiguration
s {$sel:id:AnalyticsConfiguration' :: Text
id = Text
a} :: AnalyticsConfiguration)

-- | Contains data related to access patterns to be collected and made
-- available to analyze the tradeoffs between different storage classes.
analyticsConfiguration_storageClassAnalysis :: Lens.Lens' AnalyticsConfiguration StorageClassAnalysis
analyticsConfiguration_storageClassAnalysis :: Lens' AnalyticsConfiguration StorageClassAnalysis
analyticsConfiguration_storageClassAnalysis = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AnalyticsConfiguration' {StorageClassAnalysis
storageClassAnalysis :: StorageClassAnalysis
$sel:storageClassAnalysis:AnalyticsConfiguration' :: AnalyticsConfiguration -> StorageClassAnalysis
storageClassAnalysis} -> StorageClassAnalysis
storageClassAnalysis) (\s :: AnalyticsConfiguration
s@AnalyticsConfiguration' {} StorageClassAnalysis
a -> AnalyticsConfiguration
s {$sel:storageClassAnalysis:AnalyticsConfiguration' :: StorageClassAnalysis
storageClassAnalysis = StorageClassAnalysis
a} :: AnalyticsConfiguration)

instance Data.FromXML AnalyticsConfiguration where
  parseXML :: [Node] -> Either String AnalyticsConfiguration
parseXML [Node]
x =
    Maybe AnalyticsFilter
-> Text -> StorageClassAnalysis -> AnalyticsConfiguration
AnalyticsConfiguration'
      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
"Filter")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String a
Data..@ Text
"Id")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String a
Data..@ Text
"StorageClassAnalysis")

instance Prelude.Hashable AnalyticsConfiguration where
  hashWithSalt :: Int -> AnalyticsConfiguration -> Int
hashWithSalt Int
_salt AnalyticsConfiguration' {Maybe AnalyticsFilter
Text
StorageClassAnalysis
storageClassAnalysis :: StorageClassAnalysis
id :: Text
filter' :: Maybe AnalyticsFilter
$sel:storageClassAnalysis:AnalyticsConfiguration' :: AnalyticsConfiguration -> StorageClassAnalysis
$sel:id:AnalyticsConfiguration' :: AnalyticsConfiguration -> Text
$sel:filter':AnalyticsConfiguration' :: AnalyticsConfiguration -> Maybe AnalyticsFilter
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe AnalyticsFilter
filter'
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
id
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` StorageClassAnalysis
storageClassAnalysis

instance Prelude.NFData AnalyticsConfiguration where
  rnf :: AnalyticsConfiguration -> ()
rnf AnalyticsConfiguration' {Maybe AnalyticsFilter
Text
StorageClassAnalysis
storageClassAnalysis :: StorageClassAnalysis
id :: Text
filter' :: Maybe AnalyticsFilter
$sel:storageClassAnalysis:AnalyticsConfiguration' :: AnalyticsConfiguration -> StorageClassAnalysis
$sel:id:AnalyticsConfiguration' :: AnalyticsConfiguration -> Text
$sel:filter':AnalyticsConfiguration' :: AnalyticsConfiguration -> Maybe AnalyticsFilter
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe AnalyticsFilter
filter'
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
id
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf StorageClassAnalysis
storageClassAnalysis

instance Data.ToXML AnalyticsConfiguration where
  toXML :: AnalyticsConfiguration -> XML
toXML AnalyticsConfiguration' {Maybe AnalyticsFilter
Text
StorageClassAnalysis
storageClassAnalysis :: StorageClassAnalysis
id :: Text
filter' :: Maybe AnalyticsFilter
$sel:storageClassAnalysis:AnalyticsConfiguration' :: AnalyticsConfiguration -> StorageClassAnalysis
$sel:id:AnalyticsConfiguration' :: AnalyticsConfiguration -> Text
$sel:filter':AnalyticsConfiguration' :: AnalyticsConfiguration -> Maybe AnalyticsFilter
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ Name
"Filter" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe AnalyticsFilter
filter',
        Name
"Id" forall a. ToXML a => Name -> a -> XML
Data.@= Text
id,
        Name
"StorageClassAnalysis" forall a. ToXML a => Name -> a -> XML
Data.@= StorageClassAnalysis
storageClassAnalysis
      ]