{-# 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.CloudWatch.Types.MetricDataQuery
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.CloudWatch.Types.MetricDataQuery where

import Amazonka.CloudWatch.Types.MetricStat
import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude

-- | This structure is used in both @GetMetricData@ and @PutMetricAlarm@. The
-- supported use of this structure is different for those two operations.
--
-- When used in @GetMetricData@, it indicates the metric data to return,
-- and whether this call is just retrieving a batch set of data for one
-- metric, or is performing a math expression on metric data. A single
-- @GetMetricData@ call can include up to 500 @MetricDataQuery@ structures.
--
-- When used in @PutMetricAlarm@, it enables you to create an alarm based
-- on a metric math expression. Each @MetricDataQuery@ in the array
-- specifies either a metric to retrieve, or a math expression to be
-- performed on retrieved metrics. A single @PutMetricAlarm@ call can
-- include up to 20 @MetricDataQuery@ structures in the array. The 20
-- structures can include as many as 10 structures that contain a
-- @MetricStat@ parameter to retrieve a metric, and as many as 10
-- structures that contain the @Expression@ parameter to perform a math
-- expression. Of those @Expression@ structures, one must have @True@ as
-- the value for @ReturnData@. The result of this expression is the value
-- the alarm watches.
--
-- Any expression used in a @PutMetricAlarm@ operation must return a single
-- time series. For more information, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax Metric Math Syntax and Functions>
-- in the /Amazon CloudWatch User Guide/.
--
-- Some of the parameters of this structure also have different uses
-- whether you are using this structure in a @GetMetricData@ operation or a
-- @PutMetricAlarm@ operation. These differences are explained in the
-- following parameter list.
--
-- /See:/ 'newMetricDataQuery' smart constructor.
data MetricDataQuery = MetricDataQuery'
  { -- | When used in @GetMetricData@, this option indicates whether to return
    -- the timestamps and raw data values of this metric. If you are performing
    -- this call just to do math expressions and do not also need the raw data
    -- returned, you can specify @False@. If you omit this, the default of
    -- @True@ is used.
    --
    -- When used in @PutMetricAlarm@, specify @True@ for the one expression
    -- result to use as the alarm. For all other metrics and expressions in the
    -- same @PutMetricAlarm@ operation, specify @ReturnData@ as False.
    MetricDataQuery -> Maybe Bool
returnData :: Prelude.Maybe Prelude.Bool,
    -- | The granularity, in seconds, of the returned data points. For metrics
    -- with regular resolution, a period can be as short as one minute (60
    -- seconds) and must be a multiple of 60. For high-resolution metrics that
    -- are collected at intervals of less than one minute, the period can be 1,
    -- 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those
    -- metrics stored by a @PutMetricData@ operation that includes a
    -- @StorageResolution of 1 second@.
    MetricDataQuery -> Maybe Natural
period :: Prelude.Maybe Prelude.Natural,
    -- | The ID of the account where the metrics are located, if this is a
    -- cross-account alarm.
    --
    -- Use this field only for @PutMetricAlarm@ operations. It is not used in
    -- @GetMetricData@ operations.
    MetricDataQuery -> Maybe Text
accountId :: Prelude.Maybe Prelude.Text,
    -- | The math expression to be performed on the returned data, if this object
    -- is performing a math expression. This expression can use the @Id@ of the
    -- other metrics to refer to those metrics, and can also use the @Id@ of
    -- other expressions to use the result of those expressions. For more
    -- information about metric math expressions, see
    -- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax Metric Math Syntax and Functions>
    -- in the /Amazon CloudWatch User Guide/.
    --
    -- Within each MetricDataQuery object, you must specify either @Expression@
    -- or @MetricStat@ but not both.
    MetricDataQuery -> Maybe Text
expression :: Prelude.Maybe Prelude.Text,
    -- | A human-readable label for this metric or expression. This is especially
    -- useful if this is an expression, so that you know what the value
    -- represents. If the metric or expression is shown in a CloudWatch
    -- dashboard widget, the label is shown. If Label is omitted, CloudWatch
    -- generates a default.
    --
    -- You can put dynamic expressions into a label, so that it is more
    -- descriptive. For more information, see
    -- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/graph-dynamic-labels.html Using Dynamic Labels>.
    MetricDataQuery -> Maybe Text
label :: Prelude.Maybe Prelude.Text,
    -- | The metric to be returned, along with statistics, period, and units. Use
    -- this parameter only if this object is retrieving a metric and not
    -- performing a math expression on returned data.
    --
    -- Within one MetricDataQuery object, you must specify either @Expression@
    -- or @MetricStat@ but not both.
    MetricDataQuery -> Maybe MetricStat
metricStat :: Prelude.Maybe MetricStat,
    -- | A short name used to tie this object to the results in the response.
    -- This name must be unique within a single call to @GetMetricData@. If you
    -- are performing math expressions on this set of data, this name
    -- represents that data and can serve as a variable in the mathematical
    -- expression. The valid characters are letters, numbers, and underscore.
    -- The first character must be a lowercase letter.
    MetricDataQuery -> Text
id :: Prelude.Text
  }
  deriving (MetricDataQuery -> MetricDataQuery -> Bool
(MetricDataQuery -> MetricDataQuery -> Bool)
-> (MetricDataQuery -> MetricDataQuery -> Bool)
-> Eq MetricDataQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetricDataQuery -> MetricDataQuery -> Bool
$c/= :: MetricDataQuery -> MetricDataQuery -> Bool
== :: MetricDataQuery -> MetricDataQuery -> Bool
$c== :: MetricDataQuery -> MetricDataQuery -> Bool
Prelude.Eq, ReadPrec [MetricDataQuery]
ReadPrec MetricDataQuery
Int -> ReadS MetricDataQuery
ReadS [MetricDataQuery]
(Int -> ReadS MetricDataQuery)
-> ReadS [MetricDataQuery]
-> ReadPrec MetricDataQuery
-> ReadPrec [MetricDataQuery]
-> Read MetricDataQuery
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MetricDataQuery]
$creadListPrec :: ReadPrec [MetricDataQuery]
readPrec :: ReadPrec MetricDataQuery
$creadPrec :: ReadPrec MetricDataQuery
readList :: ReadS [MetricDataQuery]
$creadList :: ReadS [MetricDataQuery]
readsPrec :: Int -> ReadS MetricDataQuery
$creadsPrec :: Int -> ReadS MetricDataQuery
Prelude.Read, Int -> MetricDataQuery -> ShowS
[MetricDataQuery] -> ShowS
MetricDataQuery -> String
(Int -> MetricDataQuery -> ShowS)
-> (MetricDataQuery -> String)
-> ([MetricDataQuery] -> ShowS)
-> Show MetricDataQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetricDataQuery] -> ShowS
$cshowList :: [MetricDataQuery] -> ShowS
show :: MetricDataQuery -> String
$cshow :: MetricDataQuery -> String
showsPrec :: Int -> MetricDataQuery -> ShowS
$cshowsPrec :: Int -> MetricDataQuery -> ShowS
Prelude.Show, (forall x. MetricDataQuery -> Rep MetricDataQuery x)
-> (forall x. Rep MetricDataQuery x -> MetricDataQuery)
-> Generic MetricDataQuery
forall x. Rep MetricDataQuery x -> MetricDataQuery
forall x. MetricDataQuery -> Rep MetricDataQuery x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MetricDataQuery x -> MetricDataQuery
$cfrom :: forall x. MetricDataQuery -> Rep MetricDataQuery x
Prelude.Generic)

-- |
-- Create a value of 'MetricDataQuery' 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:
--
-- 'returnData', 'metricDataQuery_returnData' - When used in @GetMetricData@, this option indicates whether to return
-- the timestamps and raw data values of this metric. If you are performing
-- this call just to do math expressions and do not also need the raw data
-- returned, you can specify @False@. If you omit this, the default of
-- @True@ is used.
--
-- When used in @PutMetricAlarm@, specify @True@ for the one expression
-- result to use as the alarm. For all other metrics and expressions in the
-- same @PutMetricAlarm@ operation, specify @ReturnData@ as False.
--
-- 'period', 'metricDataQuery_period' - The granularity, in seconds, of the returned data points. For metrics
-- with regular resolution, a period can be as short as one minute (60
-- seconds) and must be a multiple of 60. For high-resolution metrics that
-- are collected at intervals of less than one minute, the period can be 1,
-- 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those
-- metrics stored by a @PutMetricData@ operation that includes a
-- @StorageResolution of 1 second@.
--
-- 'accountId', 'metricDataQuery_accountId' - The ID of the account where the metrics are located, if this is a
-- cross-account alarm.
--
-- Use this field only for @PutMetricAlarm@ operations. It is not used in
-- @GetMetricData@ operations.
--
-- 'expression', 'metricDataQuery_expression' - The math expression to be performed on the returned data, if this object
-- is performing a math expression. This expression can use the @Id@ of the
-- other metrics to refer to those metrics, and can also use the @Id@ of
-- other expressions to use the result of those expressions. For more
-- information about metric math expressions, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax Metric Math Syntax and Functions>
-- in the /Amazon CloudWatch User Guide/.
--
-- Within each MetricDataQuery object, you must specify either @Expression@
-- or @MetricStat@ but not both.
--
-- 'label', 'metricDataQuery_label' - A human-readable label for this metric or expression. This is especially
-- useful if this is an expression, so that you know what the value
-- represents. If the metric or expression is shown in a CloudWatch
-- dashboard widget, the label is shown. If Label is omitted, CloudWatch
-- generates a default.
--
-- You can put dynamic expressions into a label, so that it is more
-- descriptive. For more information, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/graph-dynamic-labels.html Using Dynamic Labels>.
--
-- 'metricStat', 'metricDataQuery_metricStat' - The metric to be returned, along with statistics, period, and units. Use
-- this parameter only if this object is retrieving a metric and not
-- performing a math expression on returned data.
--
-- Within one MetricDataQuery object, you must specify either @Expression@
-- or @MetricStat@ but not both.
--
-- 'id', 'metricDataQuery_id' - A short name used to tie this object to the results in the response.
-- This name must be unique within a single call to @GetMetricData@. If you
-- are performing math expressions on this set of data, this name
-- represents that data and can serve as a variable in the mathematical
-- expression. The valid characters are letters, numbers, and underscore.
-- The first character must be a lowercase letter.
newMetricDataQuery ::
  -- | 'id'
  Prelude.Text ->
  MetricDataQuery
newMetricDataQuery :: Text -> MetricDataQuery
newMetricDataQuery Text
pId_ =
  MetricDataQuery' :: Maybe Bool
-> Maybe Natural
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe MetricStat
-> Text
-> MetricDataQuery
MetricDataQuery'
    { $sel:returnData:MetricDataQuery' :: Maybe Bool
returnData = Maybe Bool
forall a. Maybe a
Prelude.Nothing,
      $sel:period:MetricDataQuery' :: Maybe Natural
period = Maybe Natural
forall a. Maybe a
Prelude.Nothing,
      $sel:accountId:MetricDataQuery' :: Maybe Text
accountId = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:expression:MetricDataQuery' :: Maybe Text
expression = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:label:MetricDataQuery' :: Maybe Text
label = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:metricStat:MetricDataQuery' :: Maybe MetricStat
metricStat = Maybe MetricStat
forall a. Maybe a
Prelude.Nothing,
      $sel:id:MetricDataQuery' :: Text
id = Text
pId_
    }

-- | When used in @GetMetricData@, this option indicates whether to return
-- the timestamps and raw data values of this metric. If you are performing
-- this call just to do math expressions and do not also need the raw data
-- returned, you can specify @False@. If you omit this, the default of
-- @True@ is used.
--
-- When used in @PutMetricAlarm@, specify @True@ for the one expression
-- result to use as the alarm. For all other metrics and expressions in the
-- same @PutMetricAlarm@ operation, specify @ReturnData@ as False.
metricDataQuery_returnData :: Lens.Lens' MetricDataQuery (Prelude.Maybe Prelude.Bool)
metricDataQuery_returnData :: (Maybe Bool -> f (Maybe Bool))
-> MetricDataQuery -> f MetricDataQuery
metricDataQuery_returnData = (MetricDataQuery -> Maybe Bool)
-> (MetricDataQuery -> Maybe Bool -> MetricDataQuery)
-> Lens MetricDataQuery MetricDataQuery (Maybe Bool) (Maybe Bool)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Maybe Bool
returnData :: Maybe Bool
$sel:returnData:MetricDataQuery' :: MetricDataQuery -> Maybe Bool
returnData} -> Maybe Bool
returnData) (\s :: MetricDataQuery
s@MetricDataQuery' {} Maybe Bool
a -> MetricDataQuery
s {$sel:returnData:MetricDataQuery' :: Maybe Bool
returnData = Maybe Bool
a} :: MetricDataQuery)

-- | The granularity, in seconds, of the returned data points. For metrics
-- with regular resolution, a period can be as short as one minute (60
-- seconds) and must be a multiple of 60. For high-resolution metrics that
-- are collected at intervals of less than one minute, the period can be 1,
-- 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those
-- metrics stored by a @PutMetricData@ operation that includes a
-- @StorageResolution of 1 second@.
metricDataQuery_period :: Lens.Lens' MetricDataQuery (Prelude.Maybe Prelude.Natural)
metricDataQuery_period :: (Maybe Natural -> f (Maybe Natural))
-> MetricDataQuery -> f MetricDataQuery
metricDataQuery_period = (MetricDataQuery -> Maybe Natural)
-> (MetricDataQuery -> Maybe Natural -> MetricDataQuery)
-> Lens
     MetricDataQuery MetricDataQuery (Maybe Natural) (Maybe Natural)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Maybe Natural
period :: Maybe Natural
$sel:period:MetricDataQuery' :: MetricDataQuery -> Maybe Natural
period} -> Maybe Natural
period) (\s :: MetricDataQuery
s@MetricDataQuery' {} Maybe Natural
a -> MetricDataQuery
s {$sel:period:MetricDataQuery' :: Maybe Natural
period = Maybe Natural
a} :: MetricDataQuery)

-- | The ID of the account where the metrics are located, if this is a
-- cross-account alarm.
--
-- Use this field only for @PutMetricAlarm@ operations. It is not used in
-- @GetMetricData@ operations.
metricDataQuery_accountId :: Lens.Lens' MetricDataQuery (Prelude.Maybe Prelude.Text)
metricDataQuery_accountId :: (Maybe Text -> f (Maybe Text))
-> MetricDataQuery -> f MetricDataQuery
metricDataQuery_accountId = (MetricDataQuery -> Maybe Text)
-> (MetricDataQuery -> Maybe Text -> MetricDataQuery)
-> Lens MetricDataQuery MetricDataQuery (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Maybe Text
accountId :: Maybe Text
$sel:accountId:MetricDataQuery' :: MetricDataQuery -> Maybe Text
accountId} -> Maybe Text
accountId) (\s :: MetricDataQuery
s@MetricDataQuery' {} Maybe Text
a -> MetricDataQuery
s {$sel:accountId:MetricDataQuery' :: Maybe Text
accountId = Maybe Text
a} :: MetricDataQuery)

-- | The math expression to be performed on the returned data, if this object
-- is performing a math expression. This expression can use the @Id@ of the
-- other metrics to refer to those metrics, and can also use the @Id@ of
-- other expressions to use the result of those expressions. For more
-- information about metric math expressions, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax Metric Math Syntax and Functions>
-- in the /Amazon CloudWatch User Guide/.
--
-- Within each MetricDataQuery object, you must specify either @Expression@
-- or @MetricStat@ but not both.
metricDataQuery_expression :: Lens.Lens' MetricDataQuery (Prelude.Maybe Prelude.Text)
metricDataQuery_expression :: (Maybe Text -> f (Maybe Text))
-> MetricDataQuery -> f MetricDataQuery
metricDataQuery_expression = (MetricDataQuery -> Maybe Text)
-> (MetricDataQuery -> Maybe Text -> MetricDataQuery)
-> Lens MetricDataQuery MetricDataQuery (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Maybe Text
expression :: Maybe Text
$sel:expression:MetricDataQuery' :: MetricDataQuery -> Maybe Text
expression} -> Maybe Text
expression) (\s :: MetricDataQuery
s@MetricDataQuery' {} Maybe Text
a -> MetricDataQuery
s {$sel:expression:MetricDataQuery' :: Maybe Text
expression = Maybe Text
a} :: MetricDataQuery)

-- | A human-readable label for this metric or expression. This is especially
-- useful if this is an expression, so that you know what the value
-- represents. If the metric or expression is shown in a CloudWatch
-- dashboard widget, the label is shown. If Label is omitted, CloudWatch
-- generates a default.
--
-- You can put dynamic expressions into a label, so that it is more
-- descriptive. For more information, see
-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/graph-dynamic-labels.html Using Dynamic Labels>.
metricDataQuery_label :: Lens.Lens' MetricDataQuery (Prelude.Maybe Prelude.Text)
metricDataQuery_label :: (Maybe Text -> f (Maybe Text))
-> MetricDataQuery -> f MetricDataQuery
metricDataQuery_label = (MetricDataQuery -> Maybe Text)
-> (MetricDataQuery -> Maybe Text -> MetricDataQuery)
-> Lens MetricDataQuery MetricDataQuery (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Maybe Text
label :: Maybe Text
$sel:label:MetricDataQuery' :: MetricDataQuery -> Maybe Text
label} -> Maybe Text
label) (\s :: MetricDataQuery
s@MetricDataQuery' {} Maybe Text
a -> MetricDataQuery
s {$sel:label:MetricDataQuery' :: Maybe Text
label = Maybe Text
a} :: MetricDataQuery)

-- | The metric to be returned, along with statistics, period, and units. Use
-- this parameter only if this object is retrieving a metric and not
-- performing a math expression on returned data.
--
-- Within one MetricDataQuery object, you must specify either @Expression@
-- or @MetricStat@ but not both.
metricDataQuery_metricStat :: Lens.Lens' MetricDataQuery (Prelude.Maybe MetricStat)
metricDataQuery_metricStat :: (Maybe MetricStat -> f (Maybe MetricStat))
-> MetricDataQuery -> f MetricDataQuery
metricDataQuery_metricStat = (MetricDataQuery -> Maybe MetricStat)
-> (MetricDataQuery -> Maybe MetricStat -> MetricDataQuery)
-> Lens
     MetricDataQuery
     MetricDataQuery
     (Maybe MetricStat)
     (Maybe MetricStat)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Maybe MetricStat
metricStat :: Maybe MetricStat
$sel:metricStat:MetricDataQuery' :: MetricDataQuery -> Maybe MetricStat
metricStat} -> Maybe MetricStat
metricStat) (\s :: MetricDataQuery
s@MetricDataQuery' {} Maybe MetricStat
a -> MetricDataQuery
s {$sel:metricStat:MetricDataQuery' :: Maybe MetricStat
metricStat = Maybe MetricStat
a} :: MetricDataQuery)

-- | A short name used to tie this object to the results in the response.
-- This name must be unique within a single call to @GetMetricData@. If you
-- are performing math expressions on this set of data, this name
-- represents that data and can serve as a variable in the mathematical
-- expression. The valid characters are letters, numbers, and underscore.
-- The first character must be a lowercase letter.
metricDataQuery_id :: Lens.Lens' MetricDataQuery Prelude.Text
metricDataQuery_id :: (Text -> f Text) -> MetricDataQuery -> f MetricDataQuery
metricDataQuery_id = (MetricDataQuery -> Text)
-> (MetricDataQuery -> Text -> MetricDataQuery)
-> Lens MetricDataQuery MetricDataQuery Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\MetricDataQuery' {Text
id :: Text
$sel:id:MetricDataQuery' :: MetricDataQuery -> Text
id} -> Text
id) (\s :: MetricDataQuery
s@MetricDataQuery' {} Text
a -> MetricDataQuery
s {$sel:id:MetricDataQuery' :: Text
id = Text
a} :: MetricDataQuery)

instance Core.FromXML MetricDataQuery where
  parseXML :: [Node] -> Either String MetricDataQuery
parseXML [Node]
x =
    Maybe Bool
-> Maybe Natural
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe MetricStat
-> Text
-> MetricDataQuery
MetricDataQuery'
      (Maybe Bool
 -> Maybe Natural
 -> Maybe Text
 -> Maybe Text
 -> Maybe Text
 -> Maybe MetricStat
 -> Text
 -> MetricDataQuery)
-> Either String (Maybe Bool)
-> Either
     String
     (Maybe Natural
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe MetricStat
      -> Text
      -> MetricDataQuery)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> ([Node]
x [Node] -> Text -> Either String (Maybe Bool)
forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Core..@? Text
"ReturnData")
      Either
  String
  (Maybe Natural
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe MetricStat
   -> Text
   -> MetricDataQuery)
-> Either String (Maybe Natural)
-> Either
     String
     (Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe MetricStat
      -> Text
      -> MetricDataQuery)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x [Node] -> Text -> Either String (Maybe Natural)
forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Core..@? Text
"Period")
      Either
  String
  (Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe MetricStat
   -> Text
   -> MetricDataQuery)
-> Either String (Maybe Text)
-> Either
     String
     (Maybe Text
      -> Maybe Text -> Maybe MetricStat -> Text -> MetricDataQuery)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x [Node] -> Text -> Either String (Maybe Text)
forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Core..@? Text
"AccountId")
      Either
  String
  (Maybe Text
   -> Maybe Text -> Maybe MetricStat -> Text -> MetricDataQuery)
-> Either String (Maybe Text)
-> Either
     String (Maybe Text -> Maybe MetricStat -> Text -> MetricDataQuery)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x [Node] -> Text -> Either String (Maybe Text)
forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Core..@? Text
"Expression")
      Either
  String (Maybe Text -> Maybe MetricStat -> Text -> MetricDataQuery)
-> Either String (Maybe Text)
-> Either String (Maybe MetricStat -> Text -> MetricDataQuery)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x [Node] -> Text -> Either String (Maybe Text)
forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Core..@? Text
"Label")
      Either String (Maybe MetricStat -> Text -> MetricDataQuery)
-> Either String (Maybe MetricStat)
-> Either String (Text -> MetricDataQuery)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x [Node] -> Text -> Either String (Maybe MetricStat)
forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Core..@? Text
"MetricStat")
      Either String (Text -> MetricDataQuery)
-> Either String Text -> Either String MetricDataQuery
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x [Node] -> Text -> Either String Text
forall a. FromXML a => [Node] -> Text -> Either String a
Core..@ Text
"Id")

instance Prelude.Hashable MetricDataQuery

instance Prelude.NFData MetricDataQuery

instance Core.ToQuery MetricDataQuery where
  toQuery :: MetricDataQuery -> QueryString
toQuery MetricDataQuery' {Maybe Bool
Maybe Natural
Maybe Text
Maybe MetricStat
Text
id :: Text
metricStat :: Maybe MetricStat
label :: Maybe Text
expression :: Maybe Text
accountId :: Maybe Text
period :: Maybe Natural
returnData :: Maybe Bool
$sel:id:MetricDataQuery' :: MetricDataQuery -> Text
$sel:metricStat:MetricDataQuery' :: MetricDataQuery -> Maybe MetricStat
$sel:label:MetricDataQuery' :: MetricDataQuery -> Maybe Text
$sel:expression:MetricDataQuery' :: MetricDataQuery -> Maybe Text
$sel:accountId:MetricDataQuery' :: MetricDataQuery -> Maybe Text
$sel:period:MetricDataQuery' :: MetricDataQuery -> Maybe Natural
$sel:returnData:MetricDataQuery' :: MetricDataQuery -> Maybe Bool
..} =
    [QueryString] -> QueryString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"ReturnData" ByteString -> Maybe Bool -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Bool
returnData,
        ByteString
"Period" ByteString -> Maybe Natural -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Natural
period,
        ByteString
"AccountId" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
accountId,
        ByteString
"Expression" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
expression,
        ByteString
"Label" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
label,
        ByteString
"MetricStat" ByteString -> Maybe MetricStat -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe MetricStat
metricStat,
        ByteString
"Id" ByteString -> Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Text
id
      ]