packages feed

amazonka-evidently-2.0: gen/Amazonka/Evidently/Types/Feature.hs

{-# 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.Evidently.Types.Feature
-- 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.Evidently.Types.Feature where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.Evidently.Types.EvaluationRule
import Amazonka.Evidently.Types.FeatureEvaluationStrategy
import Amazonka.Evidently.Types.FeatureStatus
import Amazonka.Evidently.Types.Variation
import Amazonka.Evidently.Types.VariationValueType
import qualified Amazonka.Prelude as Prelude

-- | This structure contains information about one Evidently feature in your
-- account.
--
-- /See:/ 'newFeature' smart constructor.
data Feature = Feature'
  { -- | The name of the variation that is used as the default variation. The
    -- default variation is served to users who are not allocated to any
    -- ongoing launches or experiments of this feature.
    --
    -- This variation must also be listed in the @variations@ structure.
    --
    -- If you omit @defaultVariation@, the first variation listed in the
    -- @variations@ structure is used as the default variation.
    defaultVariation :: Prelude.Maybe Prelude.Text,
    -- | The description of the feature.
    description :: Prelude.Maybe Prelude.Text,
    -- | A set of key-value pairs that specify users who should always be served
    -- a specific variation of a feature. Each key specifies a user using their
    -- user ID, account ID, or some other identifier. The value specifies the
    -- name of the variation that the user is to be served.
    --
    -- For the override to be successful, the value of the key must match the
    -- @entityId@ used in the
    -- <https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_EvaluateFeature.html EvaluateFeature>
    -- operation.
    entityOverrides :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | An array of structures that define the evaluation rules for the feature.
    evaluationRules :: Prelude.Maybe [EvaluationRule],
    -- | The name or ARN of the project that contains the feature.
    project :: Prelude.Maybe Prelude.Text,
    -- | The list of tag keys and values associated with this feature.
    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | The ARN of the feature.
    arn :: Prelude.Text,
    -- | The date and time that the feature is created.
    createdTime :: Data.POSIX,
    -- | If this value is @ALL_RULES@, the traffic allocation specified by any
    -- ongoing launches or experiments is being used. If this is
    -- @DEFAULT_VARIATION@, the default variation is being served to all users.
    evaluationStrategy :: FeatureEvaluationStrategy,
    -- | The date and time that the feature was most recently updated.
    lastUpdatedTime :: Data.POSIX,
    -- | The name of the feature.
    name :: Prelude.Text,
    -- | The current state of the feature.
    status :: FeatureStatus,
    -- | Defines the type of value used to define the different feature
    -- variations. For more information, see
    -- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-variationtypes.html Variation types>
    valueType :: VariationValueType,
    -- | An array of structures that contain the configuration of the feature\'s
    -- different variations.
    variations :: [Variation]
  }
  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)

-- |
-- Create a value of 'Feature' 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:
--
-- 'defaultVariation', 'feature_defaultVariation' - The name of the variation that is used as the default variation. The
-- default variation is served to users who are not allocated to any
-- ongoing launches or experiments of this feature.
--
-- This variation must also be listed in the @variations@ structure.
--
-- If you omit @defaultVariation@, the first variation listed in the
-- @variations@ structure is used as the default variation.
--
-- 'description', 'feature_description' - The description of the feature.
--
-- 'entityOverrides', 'feature_entityOverrides' - A set of key-value pairs that specify users who should always be served
-- a specific variation of a feature. Each key specifies a user using their
-- user ID, account ID, or some other identifier. The value specifies the
-- name of the variation that the user is to be served.
--
-- For the override to be successful, the value of the key must match the
-- @entityId@ used in the
-- <https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_EvaluateFeature.html EvaluateFeature>
-- operation.
--
-- 'evaluationRules', 'feature_evaluationRules' - An array of structures that define the evaluation rules for the feature.
--
-- 'project', 'feature_project' - The name or ARN of the project that contains the feature.
--
-- 'tags', 'feature_tags' - The list of tag keys and values associated with this feature.
--
-- 'arn', 'feature_arn' - The ARN of the feature.
--
-- 'createdTime', 'feature_createdTime' - The date and time that the feature is created.
--
-- 'evaluationStrategy', 'feature_evaluationStrategy' - If this value is @ALL_RULES@, the traffic allocation specified by any
-- ongoing launches or experiments is being used. If this is
-- @DEFAULT_VARIATION@, the default variation is being served to all users.
--
-- 'lastUpdatedTime', 'feature_lastUpdatedTime' - The date and time that the feature was most recently updated.
--
-- 'name', 'feature_name' - The name of the feature.
--
-- 'status', 'feature_status' - The current state of the feature.
--
-- 'valueType', 'feature_valueType' - Defines the type of value used to define the different feature
-- variations. For more information, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-variationtypes.html Variation types>
--
-- 'variations', 'feature_variations' - An array of structures that contain the configuration of the feature\'s
-- different variations.
newFeature ::
  -- | 'arn'
  Prelude.Text ->
  -- | 'createdTime'
  Prelude.UTCTime ->
  -- | 'evaluationStrategy'
  FeatureEvaluationStrategy ->
  -- | 'lastUpdatedTime'
  Prelude.UTCTime ->
  -- | 'name'
  Prelude.Text ->
  -- | 'status'
  FeatureStatus ->
  -- | 'valueType'
  VariationValueType ->
  Feature
newFeature
  pArn_
  pCreatedTime_
  pEvaluationStrategy_
  pLastUpdatedTime_
  pName_
  pStatus_
  pValueType_ =
    Feature'
      { defaultVariation = Prelude.Nothing,
        description = Prelude.Nothing,
        entityOverrides = Prelude.Nothing,
        evaluationRules = Prelude.Nothing,
        project = Prelude.Nothing,
        tags = Prelude.Nothing,
        arn = pArn_,
        createdTime = Data._Time Lens.# pCreatedTime_,
        evaluationStrategy = pEvaluationStrategy_,
        lastUpdatedTime =
          Data._Time Lens.# pLastUpdatedTime_,
        name = pName_,
        status = pStatus_,
        valueType = pValueType_,
        variations = Prelude.mempty
      }

-- | The name of the variation that is used as the default variation. The
-- default variation is served to users who are not allocated to any
-- ongoing launches or experiments of this feature.
--
-- This variation must also be listed in the @variations@ structure.
--
-- If you omit @defaultVariation@, the first variation listed in the
-- @variations@ structure is used as the default variation.
feature_defaultVariation :: Lens.Lens' Feature (Prelude.Maybe Prelude.Text)
feature_defaultVariation = Lens.lens (\Feature' {defaultVariation} -> defaultVariation) (\s@Feature' {} a -> s {defaultVariation = a} :: Feature)

-- | The description of the feature.
feature_description :: Lens.Lens' Feature (Prelude.Maybe Prelude.Text)
feature_description = Lens.lens (\Feature' {description} -> description) (\s@Feature' {} a -> s {description = a} :: Feature)

-- | A set of key-value pairs that specify users who should always be served
-- a specific variation of a feature. Each key specifies a user using their
-- user ID, account ID, or some other identifier. The value specifies the
-- name of the variation that the user is to be served.
--
-- For the override to be successful, the value of the key must match the
-- @entityId@ used in the
-- <https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_EvaluateFeature.html EvaluateFeature>
-- operation.
feature_entityOverrides :: Lens.Lens' Feature (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
feature_entityOverrides = Lens.lens (\Feature' {entityOverrides} -> entityOverrides) (\s@Feature' {} a -> s {entityOverrides = a} :: Feature) Prelude.. Lens.mapping Lens.coerced

-- | An array of structures that define the evaluation rules for the feature.
feature_evaluationRules :: Lens.Lens' Feature (Prelude.Maybe [EvaluationRule])
feature_evaluationRules = Lens.lens (\Feature' {evaluationRules} -> evaluationRules) (\s@Feature' {} a -> s {evaluationRules = a} :: Feature) Prelude.. Lens.mapping Lens.coerced

-- | The name or ARN of the project that contains the feature.
feature_project :: Lens.Lens' Feature (Prelude.Maybe Prelude.Text)
feature_project = Lens.lens (\Feature' {project} -> project) (\s@Feature' {} a -> s {project = a} :: Feature)

-- | The list of tag keys and values associated with this feature.
feature_tags :: Lens.Lens' Feature (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
feature_tags = Lens.lens (\Feature' {tags} -> tags) (\s@Feature' {} a -> s {tags = a} :: Feature) Prelude.. Lens.mapping Lens.coerced

-- | The ARN of the feature.
feature_arn :: Lens.Lens' Feature Prelude.Text
feature_arn = Lens.lens (\Feature' {arn} -> arn) (\s@Feature' {} a -> s {arn = a} :: Feature)

-- | The date and time that the feature is created.
feature_createdTime :: Lens.Lens' Feature Prelude.UTCTime
feature_createdTime = Lens.lens (\Feature' {createdTime} -> createdTime) (\s@Feature' {} a -> s {createdTime = a} :: Feature) Prelude.. Data._Time

-- | If this value is @ALL_RULES@, the traffic allocation specified by any
-- ongoing launches or experiments is being used. If this is
-- @DEFAULT_VARIATION@, the default variation is being served to all users.
feature_evaluationStrategy :: Lens.Lens' Feature FeatureEvaluationStrategy
feature_evaluationStrategy = Lens.lens (\Feature' {evaluationStrategy} -> evaluationStrategy) (\s@Feature' {} a -> s {evaluationStrategy = a} :: Feature)

-- | The date and time that the feature was most recently updated.
feature_lastUpdatedTime :: Lens.Lens' Feature Prelude.UTCTime
feature_lastUpdatedTime = Lens.lens (\Feature' {lastUpdatedTime} -> lastUpdatedTime) (\s@Feature' {} a -> s {lastUpdatedTime = a} :: Feature) Prelude.. Data._Time

-- | The name of the feature.
feature_name :: Lens.Lens' Feature Prelude.Text
feature_name = Lens.lens (\Feature' {name} -> name) (\s@Feature' {} a -> s {name = a} :: Feature)

-- | The current state of the feature.
feature_status :: Lens.Lens' Feature FeatureStatus
feature_status = Lens.lens (\Feature' {status} -> status) (\s@Feature' {} a -> s {status = a} :: Feature)

-- | Defines the type of value used to define the different feature
-- variations. For more information, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-variationtypes.html Variation types>
feature_valueType :: Lens.Lens' Feature VariationValueType
feature_valueType = Lens.lens (\Feature' {valueType} -> valueType) (\s@Feature' {} a -> s {valueType = a} :: Feature)

-- | An array of structures that contain the configuration of the feature\'s
-- different variations.
feature_variations :: Lens.Lens' Feature [Variation]
feature_variations = Lens.lens (\Feature' {variations} -> variations) (\s@Feature' {} a -> s {variations = a} :: Feature) Prelude.. Lens.coerced

instance Data.FromJSON Feature where
  parseJSON =
    Data.withObject
      "Feature"
      ( \x ->
          Feature'
            Prelude.<$> (x Data..:? "defaultVariation")
            Prelude.<*> (x Data..:? "description")
            Prelude.<*> ( x
                            Data..:? "entityOverrides"
                            Data..!= Prelude.mempty
                        )
            Prelude.<*> ( x
                            Data..:? "evaluationRules"
                            Data..!= Prelude.mempty
                        )
            Prelude.<*> (x Data..:? "project")
            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
            Prelude.<*> (x Data..: "arn")
            Prelude.<*> (x Data..: "createdTime")
            Prelude.<*> (x Data..: "evaluationStrategy")
            Prelude.<*> (x Data..: "lastUpdatedTime")
            Prelude.<*> (x Data..: "name")
            Prelude.<*> (x Data..: "status")
            Prelude.<*> (x Data..: "valueType")
            Prelude.<*> (x Data..:? "variations" Data..!= Prelude.mempty)
      )

instance Prelude.Hashable Feature where
  hashWithSalt _salt Feature' {..} =
    _salt
      `Prelude.hashWithSalt` defaultVariation
      `Prelude.hashWithSalt` description
      `Prelude.hashWithSalt` entityOverrides
      `Prelude.hashWithSalt` evaluationRules
      `Prelude.hashWithSalt` project
      `Prelude.hashWithSalt` tags
      `Prelude.hashWithSalt` arn
      `Prelude.hashWithSalt` createdTime
      `Prelude.hashWithSalt` evaluationStrategy
      `Prelude.hashWithSalt` lastUpdatedTime
      `Prelude.hashWithSalt` name
      `Prelude.hashWithSalt` status
      `Prelude.hashWithSalt` valueType
      `Prelude.hashWithSalt` variations

instance Prelude.NFData Feature where
  rnf Feature' {..} =
    Prelude.rnf defaultVariation
      `Prelude.seq` Prelude.rnf description
      `Prelude.seq` Prelude.rnf entityOverrides
      `Prelude.seq` Prelude.rnf evaluationRules
      `Prelude.seq` Prelude.rnf project
      `Prelude.seq` Prelude.rnf tags
      `Prelude.seq` Prelude.rnf arn
      `Prelude.seq` Prelude.rnf createdTime
      `Prelude.seq` Prelude.rnf evaluationStrategy
      `Prelude.seq` Prelude.rnf lastUpdatedTime
      `Prelude.seq` Prelude.rnf name
      `Prelude.seq` Prelude.rnf status
      `Prelude.seq` Prelude.rnf valueType
      `Prelude.seq` Prelude.rnf variations