{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CostExplorer.GetSavingsPlansCoverage
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Retrieves the Savings Plans covered for your account. This enables you
-- to see how much of your cost is covered by a Savings Plan. An
-- organization’s management account can see the coverage of the associated
-- member accounts. This supports dimensions, Cost Categories, and nested
-- expressions. For any time period, you can filter data for Savings Plans
-- usage with the following dimensions:
--
-- -   @LINKED_ACCOUNT@
--
-- -   @REGION@
--
-- -   @SERVICE@
--
-- -   @INSTANCE_FAMILY@
--
-- To determine valid values for a dimension, use the @GetDimensionValues@
-- operation.
module Amazonka.CostExplorer.GetSavingsPlansCoverage
  ( -- * Creating a Request
    GetSavingsPlansCoverage (..),
    newGetSavingsPlansCoverage,

    -- * Request Lenses
    getSavingsPlansCoverage_filter,
    getSavingsPlansCoverage_granularity,
    getSavingsPlansCoverage_groupBy,
    getSavingsPlansCoverage_maxResults,
    getSavingsPlansCoverage_metrics,
    getSavingsPlansCoverage_nextToken,
    getSavingsPlansCoverage_sortBy,
    getSavingsPlansCoverage_timePeriod,

    -- * Destructuring the Response
    GetSavingsPlansCoverageResponse (..),
    newGetSavingsPlansCoverageResponse,

    -- * Response Lenses
    getSavingsPlansCoverageResponse_nextToken,
    getSavingsPlansCoverageResponse_httpStatus,
    getSavingsPlansCoverageResponse_savingsPlansCoverages,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import Amazonka.CostExplorer.Types
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newGetSavingsPlansCoverage' smart constructor.
data GetSavingsPlansCoverage = GetSavingsPlansCoverage'
  { -- | Filters Savings Plans coverage data by dimensions. You can filter data
    -- for Savings Plans usage with the following dimensions:
    --
    -- -   @LINKED_ACCOUNT@
    --
    -- -   @REGION@
    --
    -- -   @SERVICE@
    --
    -- -   @INSTANCE_FAMILY@
    --
    -- @GetSavingsPlansCoverage@ uses the same
    -- <https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html Expression>
    -- object as the other operations, but only @AND@ is supported among each
    -- dimension. If there are multiple values for a dimension, they are OR\'d
    -- together.
    --
    -- Cost category is also supported.
    GetSavingsPlansCoverage -> Maybe Expression
filter' :: Prelude.Maybe Expression,
    -- | The granularity of the Amazon Web Services cost data for your Savings
    -- Plans. @Granularity@ can\'t be set if @GroupBy@ is set.
    --
    -- The @GetSavingsPlansCoverage@ operation supports only @DAILY@ and
    -- @MONTHLY@ granularities.
    GetSavingsPlansCoverage -> Maybe Granularity
granularity :: Prelude.Maybe Granularity,
    -- | You can group the data using the attributes @INSTANCE_FAMILY@, @REGION@,
    -- or @SERVICE@.
    GetSavingsPlansCoverage -> Maybe [GroupDefinition]
groupBy :: Prelude.Maybe [GroupDefinition],
    -- | The number of items to be returned in a response. The default is @20@,
    -- with a minimum value of @1@.
    GetSavingsPlansCoverage -> Maybe Natural
maxResults :: Prelude.Maybe Prelude.Natural,
    -- | The measurement that you want your Savings Plans coverage reported in.
    -- The only valid value is @SpendCoveredBySavingsPlans@.
    GetSavingsPlansCoverage -> Maybe [Text]
metrics :: Prelude.Maybe [Prelude.Text],
    -- | The token to retrieve the next set of results. Amazon Web Services
    -- provides the token when the response from a previous call has more
    -- results than the maximum page size.
    GetSavingsPlansCoverage -> Maybe Text
nextToken :: Prelude.Maybe Prelude.Text,
    -- | The value that you want to sort the data by.
    --
    -- The following values are supported for @Key@:
    --
    -- -   @SpendCoveredBySavingsPlan@
    --
    -- -   @OnDemandCost@
    --
    -- -   @CoveragePercentage@
    --
    -- -   @TotalCost@
    --
    -- -   @InstanceFamily@
    --
    -- -   @Region@
    --
    -- -   @Service@
    --
    -- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
    GetSavingsPlansCoverage -> Maybe SortDefinition
sortBy :: Prelude.Maybe SortDefinition,
    -- | The time period that you want the usage and costs for. The @Start@ date
    -- must be within 13 months. The @End@ date must be after the @Start@ date,
    -- and before the current date. Future dates can\'t be used as an @End@
    -- date.
    GetSavingsPlansCoverage -> DateInterval
timePeriod :: DateInterval
  }
  deriving (GetSavingsPlansCoverage -> GetSavingsPlansCoverage -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetSavingsPlansCoverage -> GetSavingsPlansCoverage -> Bool
$c/= :: GetSavingsPlansCoverage -> GetSavingsPlansCoverage -> Bool
== :: GetSavingsPlansCoverage -> GetSavingsPlansCoverage -> Bool
$c== :: GetSavingsPlansCoverage -> GetSavingsPlansCoverage -> Bool
Prelude.Eq, ReadPrec [GetSavingsPlansCoverage]
ReadPrec GetSavingsPlansCoverage
Int -> ReadS GetSavingsPlansCoverage
ReadS [GetSavingsPlansCoverage]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetSavingsPlansCoverage]
$creadListPrec :: ReadPrec [GetSavingsPlansCoverage]
readPrec :: ReadPrec GetSavingsPlansCoverage
$creadPrec :: ReadPrec GetSavingsPlansCoverage
readList :: ReadS [GetSavingsPlansCoverage]
$creadList :: ReadS [GetSavingsPlansCoverage]
readsPrec :: Int -> ReadS GetSavingsPlansCoverage
$creadsPrec :: Int -> ReadS GetSavingsPlansCoverage
Prelude.Read, Int -> GetSavingsPlansCoverage -> ShowS
[GetSavingsPlansCoverage] -> ShowS
GetSavingsPlansCoverage -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetSavingsPlansCoverage] -> ShowS
$cshowList :: [GetSavingsPlansCoverage] -> ShowS
show :: GetSavingsPlansCoverage -> String
$cshow :: GetSavingsPlansCoverage -> String
showsPrec :: Int -> GetSavingsPlansCoverage -> ShowS
$cshowsPrec :: Int -> GetSavingsPlansCoverage -> ShowS
Prelude.Show, forall x. Rep GetSavingsPlansCoverage x -> GetSavingsPlansCoverage
forall x. GetSavingsPlansCoverage -> Rep GetSavingsPlansCoverage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetSavingsPlansCoverage x -> GetSavingsPlansCoverage
$cfrom :: forall x. GetSavingsPlansCoverage -> Rep GetSavingsPlansCoverage x
Prelude.Generic)

-- |
-- Create a value of 'GetSavingsPlansCoverage' 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'', 'getSavingsPlansCoverage_filter' - Filters Savings Plans coverage data by dimensions. You can filter data
-- for Savings Plans usage with the following dimensions:
--
-- -   @LINKED_ACCOUNT@
--
-- -   @REGION@
--
-- -   @SERVICE@
--
-- -   @INSTANCE_FAMILY@
--
-- @GetSavingsPlansCoverage@ uses the same
-- <https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html Expression>
-- object as the other operations, but only @AND@ is supported among each
-- dimension. If there are multiple values for a dimension, they are OR\'d
-- together.
--
-- Cost category is also supported.
--
-- 'granularity', 'getSavingsPlansCoverage_granularity' - The granularity of the Amazon Web Services cost data for your Savings
-- Plans. @Granularity@ can\'t be set if @GroupBy@ is set.
--
-- The @GetSavingsPlansCoverage@ operation supports only @DAILY@ and
-- @MONTHLY@ granularities.
--
-- 'groupBy', 'getSavingsPlansCoverage_groupBy' - You can group the data using the attributes @INSTANCE_FAMILY@, @REGION@,
-- or @SERVICE@.
--
-- 'maxResults', 'getSavingsPlansCoverage_maxResults' - The number of items to be returned in a response. The default is @20@,
-- with a minimum value of @1@.
--
-- 'metrics', 'getSavingsPlansCoverage_metrics' - The measurement that you want your Savings Plans coverage reported in.
-- The only valid value is @SpendCoveredBySavingsPlans@.
--
-- 'nextToken', 'getSavingsPlansCoverage_nextToken' - The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
--
-- 'sortBy', 'getSavingsPlansCoverage_sortBy' - The value that you want to sort the data by.
--
-- The following values are supported for @Key@:
--
-- -   @SpendCoveredBySavingsPlan@
--
-- -   @OnDemandCost@
--
-- -   @CoveragePercentage@
--
-- -   @TotalCost@
--
-- -   @InstanceFamily@
--
-- -   @Region@
--
-- -   @Service@
--
-- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
--
-- 'timePeriod', 'getSavingsPlansCoverage_timePeriod' - The time period that you want the usage and costs for. The @Start@ date
-- must be within 13 months. The @End@ date must be after the @Start@ date,
-- and before the current date. Future dates can\'t be used as an @End@
-- date.
newGetSavingsPlansCoverage ::
  -- | 'timePeriod'
  DateInterval ->
  GetSavingsPlansCoverage
newGetSavingsPlansCoverage :: DateInterval -> GetSavingsPlansCoverage
newGetSavingsPlansCoverage DateInterval
pTimePeriod_ =
  GetSavingsPlansCoverage'
    { $sel:filter':GetSavingsPlansCoverage' :: Maybe Expression
filter' = forall a. Maybe a
Prelude.Nothing,
      $sel:granularity:GetSavingsPlansCoverage' :: Maybe Granularity
granularity = forall a. Maybe a
Prelude.Nothing,
      $sel:groupBy:GetSavingsPlansCoverage' :: Maybe [GroupDefinition]
groupBy = forall a. Maybe a
Prelude.Nothing,
      $sel:maxResults:GetSavingsPlansCoverage' :: Maybe Natural
maxResults = forall a. Maybe a
Prelude.Nothing,
      $sel:metrics:GetSavingsPlansCoverage' :: Maybe [Text]
metrics = forall a. Maybe a
Prelude.Nothing,
      $sel:nextToken:GetSavingsPlansCoverage' :: Maybe Text
nextToken = forall a. Maybe a
Prelude.Nothing,
      $sel:sortBy:GetSavingsPlansCoverage' :: Maybe SortDefinition
sortBy = forall a. Maybe a
Prelude.Nothing,
      $sel:timePeriod:GetSavingsPlansCoverage' :: DateInterval
timePeriod = DateInterval
pTimePeriod_
    }

-- | Filters Savings Plans coverage data by dimensions. You can filter data
-- for Savings Plans usage with the following dimensions:
--
-- -   @LINKED_ACCOUNT@
--
-- -   @REGION@
--
-- -   @SERVICE@
--
-- -   @INSTANCE_FAMILY@
--
-- @GetSavingsPlansCoverage@ uses the same
-- <https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html Expression>
-- object as the other operations, but only @AND@ is supported among each
-- dimension. If there are multiple values for a dimension, they are OR\'d
-- together.
--
-- Cost category is also supported.
getSavingsPlansCoverage_filter :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe Expression)
getSavingsPlansCoverage_filter :: Lens' GetSavingsPlansCoverage (Maybe Expression)
getSavingsPlansCoverage_filter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe Expression
filter' :: Maybe Expression
$sel:filter':GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Expression
filter'} -> Maybe Expression
filter') (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe Expression
a -> GetSavingsPlansCoverage
s {$sel:filter':GetSavingsPlansCoverage' :: Maybe Expression
filter' = Maybe Expression
a} :: GetSavingsPlansCoverage)

-- | The granularity of the Amazon Web Services cost data for your Savings
-- Plans. @Granularity@ can\'t be set if @GroupBy@ is set.
--
-- The @GetSavingsPlansCoverage@ operation supports only @DAILY@ and
-- @MONTHLY@ granularities.
getSavingsPlansCoverage_granularity :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe Granularity)
getSavingsPlansCoverage_granularity :: Lens' GetSavingsPlansCoverage (Maybe Granularity)
getSavingsPlansCoverage_granularity = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe Granularity
granularity :: Maybe Granularity
$sel:granularity:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Granularity
granularity} -> Maybe Granularity
granularity) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe Granularity
a -> GetSavingsPlansCoverage
s {$sel:granularity:GetSavingsPlansCoverage' :: Maybe Granularity
granularity = Maybe Granularity
a} :: GetSavingsPlansCoverage)

-- | You can group the data using the attributes @INSTANCE_FAMILY@, @REGION@,
-- or @SERVICE@.
getSavingsPlansCoverage_groupBy :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe [GroupDefinition])
getSavingsPlansCoverage_groupBy :: Lens' GetSavingsPlansCoverage (Maybe [GroupDefinition])
getSavingsPlansCoverage_groupBy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe [GroupDefinition]
groupBy :: Maybe [GroupDefinition]
$sel:groupBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [GroupDefinition]
groupBy} -> Maybe [GroupDefinition]
groupBy) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe [GroupDefinition]
a -> GetSavingsPlansCoverage
s {$sel:groupBy:GetSavingsPlansCoverage' :: Maybe [GroupDefinition]
groupBy = Maybe [GroupDefinition]
a} :: GetSavingsPlansCoverage) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The number of items to be returned in a response. The default is @20@,
-- with a minimum value of @1@.
getSavingsPlansCoverage_maxResults :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe Prelude.Natural)
getSavingsPlansCoverage_maxResults :: Lens' GetSavingsPlansCoverage (Maybe Natural)
getSavingsPlansCoverage_maxResults = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe Natural
maxResults :: Maybe Natural
$sel:maxResults:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Natural
maxResults} -> Maybe Natural
maxResults) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe Natural
a -> GetSavingsPlansCoverage
s {$sel:maxResults:GetSavingsPlansCoverage' :: Maybe Natural
maxResults = Maybe Natural
a} :: GetSavingsPlansCoverage)

-- | The measurement that you want your Savings Plans coverage reported in.
-- The only valid value is @SpendCoveredBySavingsPlans@.
getSavingsPlansCoverage_metrics :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe [Prelude.Text])
getSavingsPlansCoverage_metrics :: Lens' GetSavingsPlansCoverage (Maybe [Text])
getSavingsPlansCoverage_metrics = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe [Text]
metrics :: Maybe [Text]
$sel:metrics:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [Text]
metrics} -> Maybe [Text]
metrics) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe [Text]
a -> GetSavingsPlansCoverage
s {$sel:metrics:GetSavingsPlansCoverage' :: Maybe [Text]
metrics = Maybe [Text]
a} :: GetSavingsPlansCoverage) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
getSavingsPlansCoverage_nextToken :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe Prelude.Text)
getSavingsPlansCoverage_nextToken :: Lens' GetSavingsPlansCoverage (Maybe Text)
getSavingsPlansCoverage_nextToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe Text
nextToken :: Maybe Text
$sel:nextToken:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Text
nextToken} -> Maybe Text
nextToken) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe Text
a -> GetSavingsPlansCoverage
s {$sel:nextToken:GetSavingsPlansCoverage' :: Maybe Text
nextToken = Maybe Text
a} :: GetSavingsPlansCoverage)

-- | The value that you want to sort the data by.
--
-- The following values are supported for @Key@:
--
-- -   @SpendCoveredBySavingsPlan@
--
-- -   @OnDemandCost@
--
-- -   @CoveragePercentage@
--
-- -   @TotalCost@
--
-- -   @InstanceFamily@
--
-- -   @Region@
--
-- -   @Service@
--
-- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
getSavingsPlansCoverage_sortBy :: Lens.Lens' GetSavingsPlansCoverage (Prelude.Maybe SortDefinition)
getSavingsPlansCoverage_sortBy :: Lens' GetSavingsPlansCoverage (Maybe SortDefinition)
getSavingsPlansCoverage_sortBy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {Maybe SortDefinition
sortBy :: Maybe SortDefinition
$sel:sortBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe SortDefinition
sortBy} -> Maybe SortDefinition
sortBy) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} Maybe SortDefinition
a -> GetSavingsPlansCoverage
s {$sel:sortBy:GetSavingsPlansCoverage' :: Maybe SortDefinition
sortBy = Maybe SortDefinition
a} :: GetSavingsPlansCoverage)

-- | The time period that you want the usage and costs for. The @Start@ date
-- must be within 13 months. The @End@ date must be after the @Start@ date,
-- and before the current date. Future dates can\'t be used as an @End@
-- date.
getSavingsPlansCoverage_timePeriod :: Lens.Lens' GetSavingsPlansCoverage DateInterval
getSavingsPlansCoverage_timePeriod :: Lens' GetSavingsPlansCoverage DateInterval
getSavingsPlansCoverage_timePeriod = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverage' {DateInterval
timePeriod :: DateInterval
$sel:timePeriod:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> DateInterval
timePeriod} -> DateInterval
timePeriod) (\s :: GetSavingsPlansCoverage
s@GetSavingsPlansCoverage' {} DateInterval
a -> GetSavingsPlansCoverage
s {$sel:timePeriod:GetSavingsPlansCoverage' :: DateInterval
timePeriod = DateInterval
a} :: GetSavingsPlansCoverage)

instance Core.AWSRequest GetSavingsPlansCoverage where
  type
    AWSResponse GetSavingsPlansCoverage =
      GetSavingsPlansCoverageResponse
  request :: (Service -> Service)
-> GetSavingsPlansCoverage -> Request GetSavingsPlansCoverage
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy GetSavingsPlansCoverage
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse GetSavingsPlansCoverage)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe Text
-> Int -> [SavingsPlansCoverage] -> GetSavingsPlansCoverageResponse
GetSavingsPlansCoverageResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"NextToken")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ( Object
x
                            forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"SavingsPlansCoverages"
                            forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                        )
      )

instance Prelude.Hashable GetSavingsPlansCoverage where
  hashWithSalt :: Int -> GetSavingsPlansCoverage -> Int
hashWithSalt Int
_salt GetSavingsPlansCoverage' {Maybe Natural
Maybe [Text]
Maybe [GroupDefinition]
Maybe Text
Maybe Granularity
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextToken :: Maybe Text
metrics :: Maybe [Text]
maxResults :: Maybe Natural
groupBy :: Maybe [GroupDefinition]
granularity :: Maybe Granularity
filter' :: Maybe Expression
$sel:timePeriod:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> DateInterval
$sel:sortBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe SortDefinition
$sel:nextToken:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Text
$sel:metrics:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [Text]
$sel:maxResults:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Natural
$sel:groupBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [GroupDefinition]
$sel:granularity:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Granularity
$sel:filter':GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Expression
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Expression
filter'
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Granularity
granularity
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [GroupDefinition]
groupBy
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Natural
maxResults
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Text]
metrics
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
nextToken
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SortDefinition
sortBy
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` DateInterval
timePeriod

instance Prelude.NFData GetSavingsPlansCoverage where
  rnf :: GetSavingsPlansCoverage -> ()
rnf GetSavingsPlansCoverage' {Maybe Natural
Maybe [Text]
Maybe [GroupDefinition]
Maybe Text
Maybe Granularity
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextToken :: Maybe Text
metrics :: Maybe [Text]
maxResults :: Maybe Natural
groupBy :: Maybe [GroupDefinition]
granularity :: Maybe Granularity
filter' :: Maybe Expression
$sel:timePeriod:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> DateInterval
$sel:sortBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe SortDefinition
$sel:nextToken:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Text
$sel:metrics:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [Text]
$sel:maxResults:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Natural
$sel:groupBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [GroupDefinition]
$sel:granularity:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Granularity
$sel:filter':GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Expression
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Expression
filter'
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Granularity
granularity
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [GroupDefinition]
groupBy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Natural
maxResults
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [Text]
metrics
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
nextToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SortDefinition
sortBy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf DateInterval
timePeriod

instance Data.ToHeaders GetSavingsPlansCoverage where
  toHeaders :: GetSavingsPlansCoverage -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"AWSInsightsIndexService.GetSavingsPlansCoverage" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON GetSavingsPlansCoverage where
  toJSON :: GetSavingsPlansCoverage -> Value
toJSON GetSavingsPlansCoverage' {Maybe Natural
Maybe [Text]
Maybe [GroupDefinition]
Maybe Text
Maybe Granularity
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextToken :: Maybe Text
metrics :: Maybe [Text]
maxResults :: Maybe Natural
groupBy :: Maybe [GroupDefinition]
granularity :: Maybe Granularity
filter' :: Maybe Expression
$sel:timePeriod:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> DateInterval
$sel:sortBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe SortDefinition
$sel:nextToken:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Text
$sel:metrics:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [Text]
$sel:maxResults:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Natural
$sel:groupBy:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe [GroupDefinition]
$sel:granularity:GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Granularity
$sel:filter':GetSavingsPlansCoverage' :: GetSavingsPlansCoverage -> Maybe Expression
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Filter" 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 Expression
filter',
            (Key
"Granularity" 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 Granularity
granularity,
            (Key
"GroupBy" 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 [GroupDefinition]
groupBy,
            (Key
"MaxResults" 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 Natural
maxResults,
            (Key
"Metrics" 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 [Text]
metrics,
            (Key
"NextToken" 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 Text
nextToken,
            (Key
"SortBy" 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 SortDefinition
sortBy,
            forall a. a -> Maybe a
Prelude.Just (Key
"TimePeriod" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= DateInterval
timePeriod)
          ]
      )

instance Data.ToPath GetSavingsPlansCoverage where
  toPath :: GetSavingsPlansCoverage -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery GetSavingsPlansCoverage where
  toQuery :: GetSavingsPlansCoverage -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newGetSavingsPlansCoverageResponse' smart constructor.
data GetSavingsPlansCoverageResponse = GetSavingsPlansCoverageResponse'
  { -- | The token to retrieve the next set of results. Amazon Web Services
    -- provides the token when the response from a previous call has more
    -- results than the maximum page size.
    GetSavingsPlansCoverageResponse -> Maybe Text
nextToken :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    GetSavingsPlansCoverageResponse -> Int
httpStatus :: Prelude.Int,
    -- | The amount of spend that your Savings Plans covered.
    GetSavingsPlansCoverageResponse -> [SavingsPlansCoverage]
savingsPlansCoverages :: [SavingsPlansCoverage]
  }
  deriving (GetSavingsPlansCoverageResponse
-> GetSavingsPlansCoverageResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetSavingsPlansCoverageResponse
-> GetSavingsPlansCoverageResponse -> Bool
$c/= :: GetSavingsPlansCoverageResponse
-> GetSavingsPlansCoverageResponse -> Bool
== :: GetSavingsPlansCoverageResponse
-> GetSavingsPlansCoverageResponse -> Bool
$c== :: GetSavingsPlansCoverageResponse
-> GetSavingsPlansCoverageResponse -> Bool
Prelude.Eq, ReadPrec [GetSavingsPlansCoverageResponse]
ReadPrec GetSavingsPlansCoverageResponse
Int -> ReadS GetSavingsPlansCoverageResponse
ReadS [GetSavingsPlansCoverageResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetSavingsPlansCoverageResponse]
$creadListPrec :: ReadPrec [GetSavingsPlansCoverageResponse]
readPrec :: ReadPrec GetSavingsPlansCoverageResponse
$creadPrec :: ReadPrec GetSavingsPlansCoverageResponse
readList :: ReadS [GetSavingsPlansCoverageResponse]
$creadList :: ReadS [GetSavingsPlansCoverageResponse]
readsPrec :: Int -> ReadS GetSavingsPlansCoverageResponse
$creadsPrec :: Int -> ReadS GetSavingsPlansCoverageResponse
Prelude.Read, Int -> GetSavingsPlansCoverageResponse -> ShowS
[GetSavingsPlansCoverageResponse] -> ShowS
GetSavingsPlansCoverageResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetSavingsPlansCoverageResponse] -> ShowS
$cshowList :: [GetSavingsPlansCoverageResponse] -> ShowS
show :: GetSavingsPlansCoverageResponse -> String
$cshow :: GetSavingsPlansCoverageResponse -> String
showsPrec :: Int -> GetSavingsPlansCoverageResponse -> ShowS
$cshowsPrec :: Int -> GetSavingsPlansCoverageResponse -> ShowS
Prelude.Show, forall x.
Rep GetSavingsPlansCoverageResponse x
-> GetSavingsPlansCoverageResponse
forall x.
GetSavingsPlansCoverageResponse
-> Rep GetSavingsPlansCoverageResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetSavingsPlansCoverageResponse x
-> GetSavingsPlansCoverageResponse
$cfrom :: forall x.
GetSavingsPlansCoverageResponse
-> Rep GetSavingsPlansCoverageResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetSavingsPlansCoverageResponse' 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:
--
-- 'nextToken', 'getSavingsPlansCoverageResponse_nextToken' - The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
--
-- 'httpStatus', 'getSavingsPlansCoverageResponse_httpStatus' - The response's http status code.
--
-- 'savingsPlansCoverages', 'getSavingsPlansCoverageResponse_savingsPlansCoverages' - The amount of spend that your Savings Plans covered.
newGetSavingsPlansCoverageResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GetSavingsPlansCoverageResponse
newGetSavingsPlansCoverageResponse :: Int -> GetSavingsPlansCoverageResponse
newGetSavingsPlansCoverageResponse Int
pHttpStatus_ =
  GetSavingsPlansCoverageResponse'
    { $sel:nextToken:GetSavingsPlansCoverageResponse' :: Maybe Text
nextToken =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GetSavingsPlansCoverageResponse' :: Int
httpStatus = Int
pHttpStatus_,
      $sel:savingsPlansCoverages:GetSavingsPlansCoverageResponse' :: [SavingsPlansCoverage]
savingsPlansCoverages = forall a. Monoid a => a
Prelude.mempty
    }

-- | The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
getSavingsPlansCoverageResponse_nextToken :: Lens.Lens' GetSavingsPlansCoverageResponse (Prelude.Maybe Prelude.Text)
getSavingsPlansCoverageResponse_nextToken :: Lens' GetSavingsPlansCoverageResponse (Maybe Text)
getSavingsPlansCoverageResponse_nextToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverageResponse' {Maybe Text
nextToken :: Maybe Text
$sel:nextToken:GetSavingsPlansCoverageResponse' :: GetSavingsPlansCoverageResponse -> Maybe Text
nextToken} -> Maybe Text
nextToken) (\s :: GetSavingsPlansCoverageResponse
s@GetSavingsPlansCoverageResponse' {} Maybe Text
a -> GetSavingsPlansCoverageResponse
s {$sel:nextToken:GetSavingsPlansCoverageResponse' :: Maybe Text
nextToken = Maybe Text
a} :: GetSavingsPlansCoverageResponse)

-- | The response's http status code.
getSavingsPlansCoverageResponse_httpStatus :: Lens.Lens' GetSavingsPlansCoverageResponse Prelude.Int
getSavingsPlansCoverageResponse_httpStatus :: Lens' GetSavingsPlansCoverageResponse Int
getSavingsPlansCoverageResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverageResponse' {Int
httpStatus :: Int
$sel:httpStatus:GetSavingsPlansCoverageResponse' :: GetSavingsPlansCoverageResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: GetSavingsPlansCoverageResponse
s@GetSavingsPlansCoverageResponse' {} Int
a -> GetSavingsPlansCoverageResponse
s {$sel:httpStatus:GetSavingsPlansCoverageResponse' :: Int
httpStatus = Int
a} :: GetSavingsPlansCoverageResponse)

-- | The amount of spend that your Savings Plans covered.
getSavingsPlansCoverageResponse_savingsPlansCoverages :: Lens.Lens' GetSavingsPlansCoverageResponse [SavingsPlansCoverage]
getSavingsPlansCoverageResponse_savingsPlansCoverages :: Lens' GetSavingsPlansCoverageResponse [SavingsPlansCoverage]
getSavingsPlansCoverageResponse_savingsPlansCoverages = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansCoverageResponse' {[SavingsPlansCoverage]
savingsPlansCoverages :: [SavingsPlansCoverage]
$sel:savingsPlansCoverages:GetSavingsPlansCoverageResponse' :: GetSavingsPlansCoverageResponse -> [SavingsPlansCoverage]
savingsPlansCoverages} -> [SavingsPlansCoverage]
savingsPlansCoverages) (\s :: GetSavingsPlansCoverageResponse
s@GetSavingsPlansCoverageResponse' {} [SavingsPlansCoverage]
a -> GetSavingsPlansCoverageResponse
s {$sel:savingsPlansCoverages:GetSavingsPlansCoverageResponse' :: [SavingsPlansCoverage]
savingsPlansCoverages = [SavingsPlansCoverage]
a} :: GetSavingsPlansCoverageResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

instance
  Prelude.NFData
    GetSavingsPlansCoverageResponse
  where
  rnf :: GetSavingsPlansCoverageResponse -> ()
rnf GetSavingsPlansCoverageResponse' {Int
[SavingsPlansCoverage]
Maybe Text
savingsPlansCoverages :: [SavingsPlansCoverage]
httpStatus :: Int
nextToken :: Maybe Text
$sel:savingsPlansCoverages:GetSavingsPlansCoverageResponse' :: GetSavingsPlansCoverageResponse -> [SavingsPlansCoverage]
$sel:httpStatus:GetSavingsPlansCoverageResponse' :: GetSavingsPlansCoverageResponse -> Int
$sel:nextToken:GetSavingsPlansCoverageResponse' :: GetSavingsPlansCoverageResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
nextToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf [SavingsPlansCoverage]
savingsPlansCoverages