{-# 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.QuickSight.Types.MeasureField
-- 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.QuickSight.Types.MeasureField 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.QuickSight.Types.CalculatedMeasureField
import Amazonka.QuickSight.Types.CategoricalMeasureField
import Amazonka.QuickSight.Types.DateMeasureField
import Amazonka.QuickSight.Types.NumericalMeasureField

-- | The measure (metric) type field.
--
-- /See:/ 'newMeasureField' smart constructor.
data MeasureField = MeasureField'
  { -- | The calculated measure field only used in pivot tables.
    MeasureField -> Maybe CalculatedMeasureField
calculatedMeasureField :: Prelude.Maybe CalculatedMeasureField,
    -- | The measure type field with categorical type columns.
    MeasureField -> Maybe CategoricalMeasureField
categoricalMeasureField :: Prelude.Maybe CategoricalMeasureField,
    -- | The measure type field with date type columns.
    MeasureField -> Maybe DateMeasureField
dateMeasureField :: Prelude.Maybe DateMeasureField,
    -- | The measure type field with numerical type columns.
    MeasureField -> Maybe NumericalMeasureField
numericalMeasureField :: Prelude.Maybe NumericalMeasureField
  }
  deriving (MeasureField -> MeasureField -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MeasureField -> MeasureField -> Bool
$c/= :: MeasureField -> MeasureField -> Bool
== :: MeasureField -> MeasureField -> Bool
$c== :: MeasureField -> MeasureField -> Bool
Prelude.Eq, Int -> MeasureField -> ShowS
[MeasureField] -> ShowS
MeasureField -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MeasureField] -> ShowS
$cshowList :: [MeasureField] -> ShowS
show :: MeasureField -> String
$cshow :: MeasureField -> String
showsPrec :: Int -> MeasureField -> ShowS
$cshowsPrec :: Int -> MeasureField -> ShowS
Prelude.Show, forall x. Rep MeasureField x -> MeasureField
forall x. MeasureField -> Rep MeasureField x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MeasureField x -> MeasureField
$cfrom :: forall x. MeasureField -> Rep MeasureField x
Prelude.Generic)

-- |
-- Create a value of 'MeasureField' 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:
--
-- 'calculatedMeasureField', 'measureField_calculatedMeasureField' - The calculated measure field only used in pivot tables.
--
-- 'categoricalMeasureField', 'measureField_categoricalMeasureField' - The measure type field with categorical type columns.
--
-- 'dateMeasureField', 'measureField_dateMeasureField' - The measure type field with date type columns.
--
-- 'numericalMeasureField', 'measureField_numericalMeasureField' - The measure type field with numerical type columns.
newMeasureField ::
  MeasureField
newMeasureField :: MeasureField
newMeasureField =
  MeasureField'
    { $sel:calculatedMeasureField:MeasureField' :: Maybe CalculatedMeasureField
calculatedMeasureField =
        forall a. Maybe a
Prelude.Nothing,
      $sel:categoricalMeasureField:MeasureField' :: Maybe CategoricalMeasureField
categoricalMeasureField = forall a. Maybe a
Prelude.Nothing,
      $sel:dateMeasureField:MeasureField' :: Maybe DateMeasureField
dateMeasureField = forall a. Maybe a
Prelude.Nothing,
      $sel:numericalMeasureField:MeasureField' :: Maybe NumericalMeasureField
numericalMeasureField = forall a. Maybe a
Prelude.Nothing
    }

-- | The calculated measure field only used in pivot tables.
measureField_calculatedMeasureField :: Lens.Lens' MeasureField (Prelude.Maybe CalculatedMeasureField)
measureField_calculatedMeasureField :: Lens' MeasureField (Maybe CalculatedMeasureField)
measureField_calculatedMeasureField = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MeasureField' {Maybe CalculatedMeasureField
calculatedMeasureField :: Maybe CalculatedMeasureField
$sel:calculatedMeasureField:MeasureField' :: MeasureField -> Maybe CalculatedMeasureField
calculatedMeasureField} -> Maybe CalculatedMeasureField
calculatedMeasureField) (\s :: MeasureField
s@MeasureField' {} Maybe CalculatedMeasureField
a -> MeasureField
s {$sel:calculatedMeasureField:MeasureField' :: Maybe CalculatedMeasureField
calculatedMeasureField = Maybe CalculatedMeasureField
a} :: MeasureField)

-- | The measure type field with categorical type columns.
measureField_categoricalMeasureField :: Lens.Lens' MeasureField (Prelude.Maybe CategoricalMeasureField)
measureField_categoricalMeasureField :: Lens' MeasureField (Maybe CategoricalMeasureField)
measureField_categoricalMeasureField = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MeasureField' {Maybe CategoricalMeasureField
categoricalMeasureField :: Maybe CategoricalMeasureField
$sel:categoricalMeasureField:MeasureField' :: MeasureField -> Maybe CategoricalMeasureField
categoricalMeasureField} -> Maybe CategoricalMeasureField
categoricalMeasureField) (\s :: MeasureField
s@MeasureField' {} Maybe CategoricalMeasureField
a -> MeasureField
s {$sel:categoricalMeasureField:MeasureField' :: Maybe CategoricalMeasureField
categoricalMeasureField = Maybe CategoricalMeasureField
a} :: MeasureField)

-- | The measure type field with date type columns.
measureField_dateMeasureField :: Lens.Lens' MeasureField (Prelude.Maybe DateMeasureField)
measureField_dateMeasureField :: Lens' MeasureField (Maybe DateMeasureField)
measureField_dateMeasureField = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MeasureField' {Maybe DateMeasureField
dateMeasureField :: Maybe DateMeasureField
$sel:dateMeasureField:MeasureField' :: MeasureField -> Maybe DateMeasureField
dateMeasureField} -> Maybe DateMeasureField
dateMeasureField) (\s :: MeasureField
s@MeasureField' {} Maybe DateMeasureField
a -> MeasureField
s {$sel:dateMeasureField:MeasureField' :: Maybe DateMeasureField
dateMeasureField = Maybe DateMeasureField
a} :: MeasureField)

-- | The measure type field with numerical type columns.
measureField_numericalMeasureField :: Lens.Lens' MeasureField (Prelude.Maybe NumericalMeasureField)
measureField_numericalMeasureField :: Lens' MeasureField (Maybe NumericalMeasureField)
measureField_numericalMeasureField = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MeasureField' {Maybe NumericalMeasureField
numericalMeasureField :: Maybe NumericalMeasureField
$sel:numericalMeasureField:MeasureField' :: MeasureField -> Maybe NumericalMeasureField
numericalMeasureField} -> Maybe NumericalMeasureField
numericalMeasureField) (\s :: MeasureField
s@MeasureField' {} Maybe NumericalMeasureField
a -> MeasureField
s {$sel:numericalMeasureField:MeasureField' :: Maybe NumericalMeasureField
numericalMeasureField = Maybe NumericalMeasureField
a} :: MeasureField)

instance Data.FromJSON MeasureField where
  parseJSON :: Value -> Parser MeasureField
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"MeasureField"
      ( \Object
x ->
          Maybe CalculatedMeasureField
-> Maybe CategoricalMeasureField
-> Maybe DateMeasureField
-> Maybe NumericalMeasureField
-> MeasureField
MeasureField'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"CalculatedMeasureField")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"CategoricalMeasureField")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"DateMeasureField")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"NumericalMeasureField")
      )

instance Prelude.Hashable MeasureField where
  hashWithSalt :: Int -> MeasureField -> Int
hashWithSalt Int
_salt MeasureField' {Maybe CalculatedMeasureField
Maybe CategoricalMeasureField
Maybe NumericalMeasureField
Maybe DateMeasureField
numericalMeasureField :: Maybe NumericalMeasureField
dateMeasureField :: Maybe DateMeasureField
categoricalMeasureField :: Maybe CategoricalMeasureField
calculatedMeasureField :: Maybe CalculatedMeasureField
$sel:numericalMeasureField:MeasureField' :: MeasureField -> Maybe NumericalMeasureField
$sel:dateMeasureField:MeasureField' :: MeasureField -> Maybe DateMeasureField
$sel:categoricalMeasureField:MeasureField' :: MeasureField -> Maybe CategoricalMeasureField
$sel:calculatedMeasureField:MeasureField' :: MeasureField -> Maybe CalculatedMeasureField
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CalculatedMeasureField
calculatedMeasureField
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CategoricalMeasureField
categoricalMeasureField
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe DateMeasureField
dateMeasureField
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe NumericalMeasureField
numericalMeasureField

instance Prelude.NFData MeasureField where
  rnf :: MeasureField -> ()
rnf MeasureField' {Maybe CalculatedMeasureField
Maybe CategoricalMeasureField
Maybe NumericalMeasureField
Maybe DateMeasureField
numericalMeasureField :: Maybe NumericalMeasureField
dateMeasureField :: Maybe DateMeasureField
categoricalMeasureField :: Maybe CategoricalMeasureField
calculatedMeasureField :: Maybe CalculatedMeasureField
$sel:numericalMeasureField:MeasureField' :: MeasureField -> Maybe NumericalMeasureField
$sel:dateMeasureField:MeasureField' :: MeasureField -> Maybe DateMeasureField
$sel:categoricalMeasureField:MeasureField' :: MeasureField -> Maybe CategoricalMeasureField
$sel:calculatedMeasureField:MeasureField' :: MeasureField -> Maybe CalculatedMeasureField
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe CalculatedMeasureField
calculatedMeasureField
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe CategoricalMeasureField
categoricalMeasureField
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe DateMeasureField
dateMeasureField
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe NumericalMeasureField
numericalMeasureField

instance Data.ToJSON MeasureField where
  toJSON :: MeasureField -> Value
toJSON MeasureField' {Maybe CalculatedMeasureField
Maybe CategoricalMeasureField
Maybe NumericalMeasureField
Maybe DateMeasureField
numericalMeasureField :: Maybe NumericalMeasureField
dateMeasureField :: Maybe DateMeasureField
categoricalMeasureField :: Maybe CategoricalMeasureField
calculatedMeasureField :: Maybe CalculatedMeasureField
$sel:numericalMeasureField:MeasureField' :: MeasureField -> Maybe NumericalMeasureField
$sel:dateMeasureField:MeasureField' :: MeasureField -> Maybe DateMeasureField
$sel:categoricalMeasureField:MeasureField' :: MeasureField -> Maybe CategoricalMeasureField
$sel:calculatedMeasureField:MeasureField' :: MeasureField -> Maybe CalculatedMeasureField
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"CalculatedMeasureField" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe CalculatedMeasureField
calculatedMeasureField,
            (Key
"CategoricalMeasureField" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe CategoricalMeasureField
categoricalMeasureField,
            (Key
"DateMeasureField" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe DateMeasureField
dateMeasureField,
            (Key
"NumericalMeasureField" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe NumericalMeasureField
numericalMeasureField
          ]
      )