{-# 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.GetReservationUtilization
-- 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 reservation utilization for your account. Management
-- account in an organization have access to member accounts. You can
-- filter data by dimensions in a time period. You can use
-- @GetDimensionValues@ to determine the possible dimension values.
-- Currently, you can group only by @SUBSCRIPTION_ID@.
module Amazonka.CostExplorer.GetReservationUtilization
  ( -- * Creating a Request
    GetReservationUtilization (..),
    newGetReservationUtilization,

    -- * Request Lenses
    getReservationUtilization_filter,
    getReservationUtilization_granularity,
    getReservationUtilization_groupBy,
    getReservationUtilization_maxResults,
    getReservationUtilization_nextPageToken,
    getReservationUtilization_sortBy,
    getReservationUtilization_timePeriod,

    -- * Destructuring the Response
    GetReservationUtilizationResponse (..),
    newGetReservationUtilizationResponse,

    -- * Response Lenses
    getReservationUtilizationResponse_nextPageToken,
    getReservationUtilizationResponse_total,
    getReservationUtilizationResponse_httpStatus,
    getReservationUtilizationResponse_utilizationsByTime,
  )
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:/ 'newGetReservationUtilization' smart constructor.
data GetReservationUtilization = GetReservationUtilization'
  { -- | Filters utilization data by dimensions. You can filter by the following
    -- dimensions:
    --
    -- -   AZ
    --
    -- -   CACHE_ENGINE
    --
    -- -   DEPLOYMENT_OPTION
    --
    -- -   INSTANCE_TYPE
    --
    -- -   LINKED_ACCOUNT
    --
    -- -   OPERATING_SYSTEM
    --
    -- -   PLATFORM
    --
    -- -   REGION
    --
    -- -   SERVICE
    --
    -- -   SCOPE
    --
    -- -   TENANCY
    --
    -- @GetReservationUtilization@ 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, and nesting is supported up to only one level deep. If there
    -- are multiple values for a dimension, they are OR\'d together.
    GetReservationUtilization -> Maybe Expression
filter' :: Prelude.Maybe Expression,
    -- | If @GroupBy@ is set, @Granularity@ can\'t be set. If @Granularity@
    -- isn\'t set, the response object doesn\'t include @Granularity@, either
    -- @MONTHLY@ or @DAILY@. If both @GroupBy@ and @Granularity@ aren\'t set,
    -- @GetReservationUtilization@ defaults to @DAILY@.
    --
    -- The @GetReservationUtilization@ operation supports only @DAILY@ and
    -- @MONTHLY@ granularities.
    GetReservationUtilization -> Maybe Granularity
granularity :: Prelude.Maybe Granularity,
    -- | Groups only by @SUBSCRIPTION_ID@. Metadata is included.
    GetReservationUtilization -> Maybe [GroupDefinition]
groupBy :: Prelude.Maybe [GroupDefinition],
    -- | The maximum number of objects that you returned for this request. If
    -- more objects are available, in the response, Amazon Web Services
    -- provides a NextPageToken value that you can use in a subsequent call to
    -- get the next batch of objects.
    GetReservationUtilization -> Maybe Natural
maxResults :: Prelude.Maybe Prelude.Natural,
    -- | 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.
    GetReservationUtilization -> Maybe Text
nextPageToken :: Prelude.Maybe Prelude.Text,
    -- | The value that you want to sort the data by.
    --
    -- The following values are supported for @Key@:
    --
    -- -   @UtilizationPercentage@
    --
    -- -   @UtilizationPercentageInUnits@
    --
    -- -   @PurchasedHours@
    --
    -- -   @PurchasedUnits@
    --
    -- -   @TotalActualHours@
    --
    -- -   @TotalActualUnits@
    --
    -- -   @UnusedHours@
    --
    -- -   @UnusedUnits@
    --
    -- -   @OnDemandCostOfRIHoursUsed@
    --
    -- -   @NetRISavings@
    --
    -- -   @TotalPotentialRISavings@
    --
    -- -   @AmortizedUpfrontFee@
    --
    -- -   @AmortizedRecurringFee@
    --
    -- -   @TotalAmortizedFee@
    --
    -- -   @RICostForUnusedHours@
    --
    -- -   @RealizedSavings@
    --
    -- -   @UnrealizedSavings@
    --
    -- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
    GetReservationUtilization -> Maybe SortDefinition
sortBy :: Prelude.Maybe SortDefinition,
    -- | Sets the start and end dates for retrieving Reserved Instance (RI)
    -- utilization. The start date is inclusive, but the end date is exclusive.
    -- For example, if @start@ is @2017-01-01@ and @end@ is @2017-05-01@, then
    -- the cost and usage data is retrieved from @2017-01-01@ up to and
    -- including @2017-04-30@ but not including @2017-05-01@.
    GetReservationUtilization -> DateInterval
timePeriod :: DateInterval
  }
  deriving (GetReservationUtilization -> GetReservationUtilization -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetReservationUtilization -> GetReservationUtilization -> Bool
$c/= :: GetReservationUtilization -> GetReservationUtilization -> Bool
== :: GetReservationUtilization -> GetReservationUtilization -> Bool
$c== :: GetReservationUtilization -> GetReservationUtilization -> Bool
Prelude.Eq, ReadPrec [GetReservationUtilization]
ReadPrec GetReservationUtilization
Int -> ReadS GetReservationUtilization
ReadS [GetReservationUtilization]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetReservationUtilization]
$creadListPrec :: ReadPrec [GetReservationUtilization]
readPrec :: ReadPrec GetReservationUtilization
$creadPrec :: ReadPrec GetReservationUtilization
readList :: ReadS [GetReservationUtilization]
$creadList :: ReadS [GetReservationUtilization]
readsPrec :: Int -> ReadS GetReservationUtilization
$creadsPrec :: Int -> ReadS GetReservationUtilization
Prelude.Read, Int -> GetReservationUtilization -> ShowS
[GetReservationUtilization] -> ShowS
GetReservationUtilization -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetReservationUtilization] -> ShowS
$cshowList :: [GetReservationUtilization] -> ShowS
show :: GetReservationUtilization -> String
$cshow :: GetReservationUtilization -> String
showsPrec :: Int -> GetReservationUtilization -> ShowS
$cshowsPrec :: Int -> GetReservationUtilization -> ShowS
Prelude.Show, forall x.
Rep GetReservationUtilization x -> GetReservationUtilization
forall x.
GetReservationUtilization -> Rep GetReservationUtilization x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetReservationUtilization x -> GetReservationUtilization
$cfrom :: forall x.
GetReservationUtilization -> Rep GetReservationUtilization x
Prelude.Generic)

-- |
-- Create a value of 'GetReservationUtilization' 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'', 'getReservationUtilization_filter' - Filters utilization data by dimensions. You can filter by the following
-- dimensions:
--
-- -   AZ
--
-- -   CACHE_ENGINE
--
-- -   DEPLOYMENT_OPTION
--
-- -   INSTANCE_TYPE
--
-- -   LINKED_ACCOUNT
--
-- -   OPERATING_SYSTEM
--
-- -   PLATFORM
--
-- -   REGION
--
-- -   SERVICE
--
-- -   SCOPE
--
-- -   TENANCY
--
-- @GetReservationUtilization@ 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, and nesting is supported up to only one level deep. If there
-- are multiple values for a dimension, they are OR\'d together.
--
-- 'granularity', 'getReservationUtilization_granularity' - If @GroupBy@ is set, @Granularity@ can\'t be set. If @Granularity@
-- isn\'t set, the response object doesn\'t include @Granularity@, either
-- @MONTHLY@ or @DAILY@. If both @GroupBy@ and @Granularity@ aren\'t set,
-- @GetReservationUtilization@ defaults to @DAILY@.
--
-- The @GetReservationUtilization@ operation supports only @DAILY@ and
-- @MONTHLY@ granularities.
--
-- 'groupBy', 'getReservationUtilization_groupBy' - Groups only by @SUBSCRIPTION_ID@. Metadata is included.
--
-- 'maxResults', 'getReservationUtilization_maxResults' - The maximum number of objects that you returned for this request. If
-- more objects are available, in the response, Amazon Web Services
-- provides a NextPageToken value that you can use in a subsequent call to
-- get the next batch of objects.
--
-- 'nextPageToken', 'getReservationUtilization_nextPageToken' - 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', 'getReservationUtilization_sortBy' - The value that you want to sort the data by.
--
-- The following values are supported for @Key@:
--
-- -   @UtilizationPercentage@
--
-- -   @UtilizationPercentageInUnits@
--
-- -   @PurchasedHours@
--
-- -   @PurchasedUnits@
--
-- -   @TotalActualHours@
--
-- -   @TotalActualUnits@
--
-- -   @UnusedHours@
--
-- -   @UnusedUnits@
--
-- -   @OnDemandCostOfRIHoursUsed@
--
-- -   @NetRISavings@
--
-- -   @TotalPotentialRISavings@
--
-- -   @AmortizedUpfrontFee@
--
-- -   @AmortizedRecurringFee@
--
-- -   @TotalAmortizedFee@
--
-- -   @RICostForUnusedHours@
--
-- -   @RealizedSavings@
--
-- -   @UnrealizedSavings@
--
-- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
--
-- 'timePeriod', 'getReservationUtilization_timePeriod' - Sets the start and end dates for retrieving Reserved Instance (RI)
-- utilization. The start date is inclusive, but the end date is exclusive.
-- For example, if @start@ is @2017-01-01@ and @end@ is @2017-05-01@, then
-- the cost and usage data is retrieved from @2017-01-01@ up to and
-- including @2017-04-30@ but not including @2017-05-01@.
newGetReservationUtilization ::
  -- | 'timePeriod'
  DateInterval ->
  GetReservationUtilization
newGetReservationUtilization :: DateInterval -> GetReservationUtilization
newGetReservationUtilization DateInterval
pTimePeriod_ =
  GetReservationUtilization'
    { $sel:filter':GetReservationUtilization' :: Maybe Expression
filter' =
        forall a. Maybe a
Prelude.Nothing,
      $sel:granularity:GetReservationUtilization' :: Maybe Granularity
granularity = forall a. Maybe a
Prelude.Nothing,
      $sel:groupBy:GetReservationUtilization' :: Maybe [GroupDefinition]
groupBy = forall a. Maybe a
Prelude.Nothing,
      $sel:maxResults:GetReservationUtilization' :: Maybe Natural
maxResults = forall a. Maybe a
Prelude.Nothing,
      $sel:nextPageToken:GetReservationUtilization' :: Maybe Text
nextPageToken = forall a. Maybe a
Prelude.Nothing,
      $sel:sortBy:GetReservationUtilization' :: Maybe SortDefinition
sortBy = forall a. Maybe a
Prelude.Nothing,
      $sel:timePeriod:GetReservationUtilization' :: DateInterval
timePeriod = DateInterval
pTimePeriod_
    }

-- | Filters utilization data by dimensions. You can filter by the following
-- dimensions:
--
-- -   AZ
--
-- -   CACHE_ENGINE
--
-- -   DEPLOYMENT_OPTION
--
-- -   INSTANCE_TYPE
--
-- -   LINKED_ACCOUNT
--
-- -   OPERATING_SYSTEM
--
-- -   PLATFORM
--
-- -   REGION
--
-- -   SERVICE
--
-- -   SCOPE
--
-- -   TENANCY
--
-- @GetReservationUtilization@ 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, and nesting is supported up to only one level deep. If there
-- are multiple values for a dimension, they are OR\'d together.
getReservationUtilization_filter :: Lens.Lens' GetReservationUtilization (Prelude.Maybe Expression)
getReservationUtilization_filter :: Lens' GetReservationUtilization (Maybe Expression)
getReservationUtilization_filter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {Maybe Expression
filter' :: Maybe Expression
$sel:filter':GetReservationUtilization' :: GetReservationUtilization -> Maybe Expression
filter'} -> Maybe Expression
filter') (\s :: GetReservationUtilization
s@GetReservationUtilization' {} Maybe Expression
a -> GetReservationUtilization
s {$sel:filter':GetReservationUtilization' :: Maybe Expression
filter' = Maybe Expression
a} :: GetReservationUtilization)

-- | If @GroupBy@ is set, @Granularity@ can\'t be set. If @Granularity@
-- isn\'t set, the response object doesn\'t include @Granularity@, either
-- @MONTHLY@ or @DAILY@. If both @GroupBy@ and @Granularity@ aren\'t set,
-- @GetReservationUtilization@ defaults to @DAILY@.
--
-- The @GetReservationUtilization@ operation supports only @DAILY@ and
-- @MONTHLY@ granularities.
getReservationUtilization_granularity :: Lens.Lens' GetReservationUtilization (Prelude.Maybe Granularity)
getReservationUtilization_granularity :: Lens' GetReservationUtilization (Maybe Granularity)
getReservationUtilization_granularity = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {Maybe Granularity
granularity :: Maybe Granularity
$sel:granularity:GetReservationUtilization' :: GetReservationUtilization -> Maybe Granularity
granularity} -> Maybe Granularity
granularity) (\s :: GetReservationUtilization
s@GetReservationUtilization' {} Maybe Granularity
a -> GetReservationUtilization
s {$sel:granularity:GetReservationUtilization' :: Maybe Granularity
granularity = Maybe Granularity
a} :: GetReservationUtilization)

-- | Groups only by @SUBSCRIPTION_ID@. Metadata is included.
getReservationUtilization_groupBy :: Lens.Lens' GetReservationUtilization (Prelude.Maybe [GroupDefinition])
getReservationUtilization_groupBy :: Lens' GetReservationUtilization (Maybe [GroupDefinition])
getReservationUtilization_groupBy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {Maybe [GroupDefinition]
groupBy :: Maybe [GroupDefinition]
$sel:groupBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe [GroupDefinition]
groupBy} -> Maybe [GroupDefinition]
groupBy) (\s :: GetReservationUtilization
s@GetReservationUtilization' {} Maybe [GroupDefinition]
a -> GetReservationUtilization
s {$sel:groupBy:GetReservationUtilization' :: Maybe [GroupDefinition]
groupBy = Maybe [GroupDefinition]
a} :: GetReservationUtilization) 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 maximum number of objects that you returned for this request. If
-- more objects are available, in the response, Amazon Web Services
-- provides a NextPageToken value that you can use in a subsequent call to
-- get the next batch of objects.
getReservationUtilization_maxResults :: Lens.Lens' GetReservationUtilization (Prelude.Maybe Prelude.Natural)
getReservationUtilization_maxResults :: Lens' GetReservationUtilization (Maybe Natural)
getReservationUtilization_maxResults = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {Maybe Natural
maxResults :: Maybe Natural
$sel:maxResults:GetReservationUtilization' :: GetReservationUtilization -> Maybe Natural
maxResults} -> Maybe Natural
maxResults) (\s :: GetReservationUtilization
s@GetReservationUtilization' {} Maybe Natural
a -> GetReservationUtilization
s {$sel:maxResults:GetReservationUtilization' :: Maybe Natural
maxResults = Maybe Natural
a} :: GetReservationUtilization)

-- | 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.
getReservationUtilization_nextPageToken :: Lens.Lens' GetReservationUtilization (Prelude.Maybe Prelude.Text)
getReservationUtilization_nextPageToken :: Lens' GetReservationUtilization (Maybe Text)
getReservationUtilization_nextPageToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {Maybe Text
nextPageToken :: Maybe Text
$sel:nextPageToken:GetReservationUtilization' :: GetReservationUtilization -> Maybe Text
nextPageToken} -> Maybe Text
nextPageToken) (\s :: GetReservationUtilization
s@GetReservationUtilization' {} Maybe Text
a -> GetReservationUtilization
s {$sel:nextPageToken:GetReservationUtilization' :: Maybe Text
nextPageToken = Maybe Text
a} :: GetReservationUtilization)

-- | The value that you want to sort the data by.
--
-- The following values are supported for @Key@:
--
-- -   @UtilizationPercentage@
--
-- -   @UtilizationPercentageInUnits@
--
-- -   @PurchasedHours@
--
-- -   @PurchasedUnits@
--
-- -   @TotalActualHours@
--
-- -   @TotalActualUnits@
--
-- -   @UnusedHours@
--
-- -   @UnusedUnits@
--
-- -   @OnDemandCostOfRIHoursUsed@
--
-- -   @NetRISavings@
--
-- -   @TotalPotentialRISavings@
--
-- -   @AmortizedUpfrontFee@
--
-- -   @AmortizedRecurringFee@
--
-- -   @TotalAmortizedFee@
--
-- -   @RICostForUnusedHours@
--
-- -   @RealizedSavings@
--
-- -   @UnrealizedSavings@
--
-- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
getReservationUtilization_sortBy :: Lens.Lens' GetReservationUtilization (Prelude.Maybe SortDefinition)
getReservationUtilization_sortBy :: Lens' GetReservationUtilization (Maybe SortDefinition)
getReservationUtilization_sortBy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {Maybe SortDefinition
sortBy :: Maybe SortDefinition
$sel:sortBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe SortDefinition
sortBy} -> Maybe SortDefinition
sortBy) (\s :: GetReservationUtilization
s@GetReservationUtilization' {} Maybe SortDefinition
a -> GetReservationUtilization
s {$sel:sortBy:GetReservationUtilization' :: Maybe SortDefinition
sortBy = Maybe SortDefinition
a} :: GetReservationUtilization)

-- | Sets the start and end dates for retrieving Reserved Instance (RI)
-- utilization. The start date is inclusive, but the end date is exclusive.
-- For example, if @start@ is @2017-01-01@ and @end@ is @2017-05-01@, then
-- the cost and usage data is retrieved from @2017-01-01@ up to and
-- including @2017-04-30@ but not including @2017-05-01@.
getReservationUtilization_timePeriod :: Lens.Lens' GetReservationUtilization DateInterval
getReservationUtilization_timePeriod :: Lens' GetReservationUtilization DateInterval
getReservationUtilization_timePeriod = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilization' {DateInterval
timePeriod :: DateInterval
$sel:timePeriod:GetReservationUtilization' :: GetReservationUtilization -> DateInterval
timePeriod} -> DateInterval
timePeriod) (\s :: GetReservationUtilization
s@GetReservationUtilization' {} DateInterval
a -> GetReservationUtilization
s {$sel:timePeriod:GetReservationUtilization' :: DateInterval
timePeriod = DateInterval
a} :: GetReservationUtilization)

instance Core.AWSRequest GetReservationUtilization where
  type
    AWSResponse GetReservationUtilization =
      GetReservationUtilizationResponse
  request :: (Service -> Service)
-> GetReservationUtilization -> Request GetReservationUtilization
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 GetReservationUtilization
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse GetReservationUtilization)))
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
-> Maybe ReservationAggregates
-> Int
-> [UtilizationByTime]
-> GetReservationUtilizationResponse
GetReservationUtilizationResponse'
            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
"NextPageToken")
            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
"Total")
            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
"UtilizationsByTime"
                            forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                        )
      )

instance Prelude.Hashable GetReservationUtilization where
  hashWithSalt :: Int -> GetReservationUtilization -> Int
hashWithSalt Int
_salt GetReservationUtilization' {Maybe Natural
Maybe [GroupDefinition]
Maybe Text
Maybe Granularity
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextPageToken :: Maybe Text
maxResults :: Maybe Natural
groupBy :: Maybe [GroupDefinition]
granularity :: Maybe Granularity
filter' :: Maybe Expression
$sel:timePeriod:GetReservationUtilization' :: GetReservationUtilization -> DateInterval
$sel:sortBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe SortDefinition
$sel:nextPageToken:GetReservationUtilization' :: GetReservationUtilization -> Maybe Text
$sel:maxResults:GetReservationUtilization' :: GetReservationUtilization -> Maybe Natural
$sel:groupBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe [GroupDefinition]
$sel:granularity:GetReservationUtilization' :: GetReservationUtilization -> Maybe Granularity
$sel:filter':GetReservationUtilization' :: GetReservationUtilization -> 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
nextPageToken
      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 GetReservationUtilization where
  rnf :: GetReservationUtilization -> ()
rnf GetReservationUtilization' {Maybe Natural
Maybe [GroupDefinition]
Maybe Text
Maybe Granularity
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextPageToken :: Maybe Text
maxResults :: Maybe Natural
groupBy :: Maybe [GroupDefinition]
granularity :: Maybe Granularity
filter' :: Maybe Expression
$sel:timePeriod:GetReservationUtilization' :: GetReservationUtilization -> DateInterval
$sel:sortBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe SortDefinition
$sel:nextPageToken:GetReservationUtilization' :: GetReservationUtilization -> Maybe Text
$sel:maxResults:GetReservationUtilization' :: GetReservationUtilization -> Maybe Natural
$sel:groupBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe [GroupDefinition]
$sel:granularity:GetReservationUtilization' :: GetReservationUtilization -> Maybe Granularity
$sel:filter':GetReservationUtilization' :: GetReservationUtilization -> 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
nextPageToken
      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 GetReservationUtilization where
  toHeaders :: GetReservationUtilization -> 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.GetReservationUtilization" ::
                          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 GetReservationUtilization where
  toJSON :: GetReservationUtilization -> Value
toJSON GetReservationUtilization' {Maybe Natural
Maybe [GroupDefinition]
Maybe Text
Maybe Granularity
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextPageToken :: Maybe Text
maxResults :: Maybe Natural
groupBy :: Maybe [GroupDefinition]
granularity :: Maybe Granularity
filter' :: Maybe Expression
$sel:timePeriod:GetReservationUtilization' :: GetReservationUtilization -> DateInterval
$sel:sortBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe SortDefinition
$sel:nextPageToken:GetReservationUtilization' :: GetReservationUtilization -> Maybe Text
$sel:maxResults:GetReservationUtilization' :: GetReservationUtilization -> Maybe Natural
$sel:groupBy:GetReservationUtilization' :: GetReservationUtilization -> Maybe [GroupDefinition]
$sel:granularity:GetReservationUtilization' :: GetReservationUtilization -> Maybe Granularity
$sel:filter':GetReservationUtilization' :: GetReservationUtilization -> 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
"NextPageToken" 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
nextPageToken,
            (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 GetReservationUtilization where
  toPath :: GetReservationUtilization -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

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

-- | /See:/ 'newGetReservationUtilizationResponse' smart constructor.
data GetReservationUtilizationResponse = GetReservationUtilizationResponse'
  { -- | The token for the next set of retrievable results. Amazon Web Services
    -- provides the token when the response from a previous call has more
    -- results than the maximum page size.
    GetReservationUtilizationResponse -> Maybe Text
nextPageToken :: Prelude.Maybe Prelude.Text,
    -- | The total amount of time that you used your Reserved Instances (RIs).
    GetReservationUtilizationResponse -> Maybe ReservationAggregates
total :: Prelude.Maybe ReservationAggregates,
    -- | The response's http status code.
    GetReservationUtilizationResponse -> Int
httpStatus :: Prelude.Int,
    -- | The amount of time that you used your Reserved Instances (RIs).
    GetReservationUtilizationResponse -> [UtilizationByTime]
utilizationsByTime :: [UtilizationByTime]
  }
  deriving (GetReservationUtilizationResponse
-> GetReservationUtilizationResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetReservationUtilizationResponse
-> GetReservationUtilizationResponse -> Bool
$c/= :: GetReservationUtilizationResponse
-> GetReservationUtilizationResponse -> Bool
== :: GetReservationUtilizationResponse
-> GetReservationUtilizationResponse -> Bool
$c== :: GetReservationUtilizationResponse
-> GetReservationUtilizationResponse -> Bool
Prelude.Eq, ReadPrec [GetReservationUtilizationResponse]
ReadPrec GetReservationUtilizationResponse
Int -> ReadS GetReservationUtilizationResponse
ReadS [GetReservationUtilizationResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetReservationUtilizationResponse]
$creadListPrec :: ReadPrec [GetReservationUtilizationResponse]
readPrec :: ReadPrec GetReservationUtilizationResponse
$creadPrec :: ReadPrec GetReservationUtilizationResponse
readList :: ReadS [GetReservationUtilizationResponse]
$creadList :: ReadS [GetReservationUtilizationResponse]
readsPrec :: Int -> ReadS GetReservationUtilizationResponse
$creadsPrec :: Int -> ReadS GetReservationUtilizationResponse
Prelude.Read, Int -> GetReservationUtilizationResponse -> ShowS
[GetReservationUtilizationResponse] -> ShowS
GetReservationUtilizationResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetReservationUtilizationResponse] -> ShowS
$cshowList :: [GetReservationUtilizationResponse] -> ShowS
show :: GetReservationUtilizationResponse -> String
$cshow :: GetReservationUtilizationResponse -> String
showsPrec :: Int -> GetReservationUtilizationResponse -> ShowS
$cshowsPrec :: Int -> GetReservationUtilizationResponse -> ShowS
Prelude.Show, forall x.
Rep GetReservationUtilizationResponse x
-> GetReservationUtilizationResponse
forall x.
GetReservationUtilizationResponse
-> Rep GetReservationUtilizationResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetReservationUtilizationResponse x
-> GetReservationUtilizationResponse
$cfrom :: forall x.
GetReservationUtilizationResponse
-> Rep GetReservationUtilizationResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetReservationUtilizationResponse' 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:
--
-- 'nextPageToken', 'getReservationUtilizationResponse_nextPageToken' - The token for the next set of retrievable results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
--
-- 'total', 'getReservationUtilizationResponse_total' - The total amount of time that you used your Reserved Instances (RIs).
--
-- 'httpStatus', 'getReservationUtilizationResponse_httpStatus' - The response's http status code.
--
-- 'utilizationsByTime', 'getReservationUtilizationResponse_utilizationsByTime' - The amount of time that you used your Reserved Instances (RIs).
newGetReservationUtilizationResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GetReservationUtilizationResponse
newGetReservationUtilizationResponse :: Int -> GetReservationUtilizationResponse
newGetReservationUtilizationResponse Int
pHttpStatus_ =
  GetReservationUtilizationResponse'
    { $sel:nextPageToken:GetReservationUtilizationResponse' :: Maybe Text
nextPageToken =
        forall a. Maybe a
Prelude.Nothing,
      $sel:total:GetReservationUtilizationResponse' :: Maybe ReservationAggregates
total = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GetReservationUtilizationResponse' :: Int
httpStatus = Int
pHttpStatus_,
      $sel:utilizationsByTime:GetReservationUtilizationResponse' :: [UtilizationByTime]
utilizationsByTime = forall a. Monoid a => a
Prelude.mempty
    }

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

-- | The total amount of time that you used your Reserved Instances (RIs).
getReservationUtilizationResponse_total :: Lens.Lens' GetReservationUtilizationResponse (Prelude.Maybe ReservationAggregates)
getReservationUtilizationResponse_total :: Lens'
  GetReservationUtilizationResponse (Maybe ReservationAggregates)
getReservationUtilizationResponse_total = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilizationResponse' {Maybe ReservationAggregates
total :: Maybe ReservationAggregates
$sel:total:GetReservationUtilizationResponse' :: GetReservationUtilizationResponse -> Maybe ReservationAggregates
total} -> Maybe ReservationAggregates
total) (\s :: GetReservationUtilizationResponse
s@GetReservationUtilizationResponse' {} Maybe ReservationAggregates
a -> GetReservationUtilizationResponse
s {$sel:total:GetReservationUtilizationResponse' :: Maybe ReservationAggregates
total = Maybe ReservationAggregates
a} :: GetReservationUtilizationResponse)

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

-- | The amount of time that you used your Reserved Instances (RIs).
getReservationUtilizationResponse_utilizationsByTime :: Lens.Lens' GetReservationUtilizationResponse [UtilizationByTime]
getReservationUtilizationResponse_utilizationsByTime :: Lens' GetReservationUtilizationResponse [UtilizationByTime]
getReservationUtilizationResponse_utilizationsByTime = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetReservationUtilizationResponse' {[UtilizationByTime]
utilizationsByTime :: [UtilizationByTime]
$sel:utilizationsByTime:GetReservationUtilizationResponse' :: GetReservationUtilizationResponse -> [UtilizationByTime]
utilizationsByTime} -> [UtilizationByTime]
utilizationsByTime) (\s :: GetReservationUtilizationResponse
s@GetReservationUtilizationResponse' {} [UtilizationByTime]
a -> GetReservationUtilizationResponse
s {$sel:utilizationsByTime:GetReservationUtilizationResponse' :: [UtilizationByTime]
utilizationsByTime = [UtilizationByTime]
a} :: GetReservationUtilizationResponse) 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
    GetReservationUtilizationResponse
  where
  rnf :: GetReservationUtilizationResponse -> ()
rnf GetReservationUtilizationResponse' {Int
[UtilizationByTime]
Maybe Text
Maybe ReservationAggregates
utilizationsByTime :: [UtilizationByTime]
httpStatus :: Int
total :: Maybe ReservationAggregates
nextPageToken :: Maybe Text
$sel:utilizationsByTime:GetReservationUtilizationResponse' :: GetReservationUtilizationResponse -> [UtilizationByTime]
$sel:httpStatus:GetReservationUtilizationResponse' :: GetReservationUtilizationResponse -> Int
$sel:total:GetReservationUtilizationResponse' :: GetReservationUtilizationResponse -> Maybe ReservationAggregates
$sel:nextPageToken:GetReservationUtilizationResponse' :: GetReservationUtilizationResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
nextPageToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ReservationAggregates
total
      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 [UtilizationByTime]
utilizationsByTime