{-# 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.ApplicationCostProfiler.ImportApplicationUsage
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Ingests application usage data from Amazon Simple Storage Service
-- (Amazon S3).
--
-- The data must already exist in the S3 location. As part of the action,
-- AWS Application Cost Profiler copies the object from your S3 bucket to
-- an S3 bucket owned by Amazon for processing asynchronously.
module Amazonka.ApplicationCostProfiler.ImportApplicationUsage
  ( -- * Creating a Request
    ImportApplicationUsage (..),
    newImportApplicationUsage,

    -- * Request Lenses
    importApplicationUsage_sourceS3Location,

    -- * Destructuring the Response
    ImportApplicationUsageResponse (..),
    newImportApplicationUsageResponse,

    -- * Response Lenses
    importApplicationUsageResponse_httpStatus,
    importApplicationUsageResponse_importId,
  )
where

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

-- | /See:/ 'newImportApplicationUsage' smart constructor.
data ImportApplicationUsage = ImportApplicationUsage'
  { -- | Amazon S3 location to import application usage data from.
    ImportApplicationUsage -> SourceS3Location
sourceS3Location :: SourceS3Location
  }
  deriving (ImportApplicationUsage -> ImportApplicationUsage -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ImportApplicationUsage -> ImportApplicationUsage -> Bool
$c/= :: ImportApplicationUsage -> ImportApplicationUsage -> Bool
== :: ImportApplicationUsage -> ImportApplicationUsage -> Bool
$c== :: ImportApplicationUsage -> ImportApplicationUsage -> Bool
Prelude.Eq, ReadPrec [ImportApplicationUsage]
ReadPrec ImportApplicationUsage
Int -> ReadS ImportApplicationUsage
ReadS [ImportApplicationUsage]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ImportApplicationUsage]
$creadListPrec :: ReadPrec [ImportApplicationUsage]
readPrec :: ReadPrec ImportApplicationUsage
$creadPrec :: ReadPrec ImportApplicationUsage
readList :: ReadS [ImportApplicationUsage]
$creadList :: ReadS [ImportApplicationUsage]
readsPrec :: Int -> ReadS ImportApplicationUsage
$creadsPrec :: Int -> ReadS ImportApplicationUsage
Prelude.Read, Int -> ImportApplicationUsage -> ShowS
[ImportApplicationUsage] -> ShowS
ImportApplicationUsage -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ImportApplicationUsage] -> ShowS
$cshowList :: [ImportApplicationUsage] -> ShowS
show :: ImportApplicationUsage -> String
$cshow :: ImportApplicationUsage -> String
showsPrec :: Int -> ImportApplicationUsage -> ShowS
$cshowsPrec :: Int -> ImportApplicationUsage -> ShowS
Prelude.Show, forall x. Rep ImportApplicationUsage x -> ImportApplicationUsage
forall x. ImportApplicationUsage -> Rep ImportApplicationUsage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ImportApplicationUsage x -> ImportApplicationUsage
$cfrom :: forall x. ImportApplicationUsage -> Rep ImportApplicationUsage x
Prelude.Generic)

-- |
-- Create a value of 'ImportApplicationUsage' 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:
--
-- 'sourceS3Location', 'importApplicationUsage_sourceS3Location' - Amazon S3 location to import application usage data from.
newImportApplicationUsage ::
  -- | 'sourceS3Location'
  SourceS3Location ->
  ImportApplicationUsage
newImportApplicationUsage :: SourceS3Location -> ImportApplicationUsage
newImportApplicationUsage SourceS3Location
pSourceS3Location_ =
  ImportApplicationUsage'
    { $sel:sourceS3Location:ImportApplicationUsage' :: SourceS3Location
sourceS3Location =
        SourceS3Location
pSourceS3Location_
    }

-- | Amazon S3 location to import application usage data from.
importApplicationUsage_sourceS3Location :: Lens.Lens' ImportApplicationUsage SourceS3Location
importApplicationUsage_sourceS3Location :: Lens' ImportApplicationUsage SourceS3Location
importApplicationUsage_sourceS3Location = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ImportApplicationUsage' {SourceS3Location
sourceS3Location :: SourceS3Location
$sel:sourceS3Location:ImportApplicationUsage' :: ImportApplicationUsage -> SourceS3Location
sourceS3Location} -> SourceS3Location
sourceS3Location) (\s :: ImportApplicationUsage
s@ImportApplicationUsage' {} SourceS3Location
a -> ImportApplicationUsage
s {$sel:sourceS3Location:ImportApplicationUsage' :: SourceS3Location
sourceS3Location = SourceS3Location
a} :: ImportApplicationUsage)

instance Core.AWSRequest ImportApplicationUsage where
  type
    AWSResponse ImportApplicationUsage =
      ImportApplicationUsageResponse
  request :: (Service -> Service)
-> ImportApplicationUsage -> Request ImportApplicationUsage
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 ImportApplicationUsage
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse ImportApplicationUsage)))
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 ->
          Int -> Text -> ImportApplicationUsageResponse
ImportApplicationUsageResponse'
            forall (f :: * -> *) a b. Functor 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 a
Data..:> Key
"importId")
      )

instance Prelude.Hashable ImportApplicationUsage where
  hashWithSalt :: Int -> ImportApplicationUsage -> Int
hashWithSalt Int
_salt ImportApplicationUsage' {SourceS3Location
sourceS3Location :: SourceS3Location
$sel:sourceS3Location:ImportApplicationUsage' :: ImportApplicationUsage -> SourceS3Location
..} =
    Int
_salt forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` SourceS3Location
sourceS3Location

instance Prelude.NFData ImportApplicationUsage where
  rnf :: ImportApplicationUsage -> ()
rnf ImportApplicationUsage' {SourceS3Location
sourceS3Location :: SourceS3Location
$sel:sourceS3Location:ImportApplicationUsage' :: ImportApplicationUsage -> SourceS3Location
..} =
    forall a. NFData a => a -> ()
Prelude.rnf SourceS3Location
sourceS3Location

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

instance Data.ToJSON ImportApplicationUsage where
  toJSON :: ImportApplicationUsage -> Value
toJSON ImportApplicationUsage' {SourceS3Location
sourceS3Location :: SourceS3Location
$sel:sourceS3Location:ImportApplicationUsage' :: ImportApplicationUsage -> SourceS3Location
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just
              (Key
"sourceS3Location" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= SourceS3Location
sourceS3Location)
          ]
      )

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

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

-- | /See:/ 'newImportApplicationUsageResponse' smart constructor.
data ImportApplicationUsageResponse = ImportApplicationUsageResponse'
  { -- | The response's http status code.
    ImportApplicationUsageResponse -> Int
httpStatus :: Prelude.Int,
    -- | ID of the import request.
    ImportApplicationUsageResponse -> Text
importId :: Prelude.Text
  }
  deriving (ImportApplicationUsageResponse
-> ImportApplicationUsageResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ImportApplicationUsageResponse
-> ImportApplicationUsageResponse -> Bool
$c/= :: ImportApplicationUsageResponse
-> ImportApplicationUsageResponse -> Bool
== :: ImportApplicationUsageResponse
-> ImportApplicationUsageResponse -> Bool
$c== :: ImportApplicationUsageResponse
-> ImportApplicationUsageResponse -> Bool
Prelude.Eq, ReadPrec [ImportApplicationUsageResponse]
ReadPrec ImportApplicationUsageResponse
Int -> ReadS ImportApplicationUsageResponse
ReadS [ImportApplicationUsageResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ImportApplicationUsageResponse]
$creadListPrec :: ReadPrec [ImportApplicationUsageResponse]
readPrec :: ReadPrec ImportApplicationUsageResponse
$creadPrec :: ReadPrec ImportApplicationUsageResponse
readList :: ReadS [ImportApplicationUsageResponse]
$creadList :: ReadS [ImportApplicationUsageResponse]
readsPrec :: Int -> ReadS ImportApplicationUsageResponse
$creadsPrec :: Int -> ReadS ImportApplicationUsageResponse
Prelude.Read, Int -> ImportApplicationUsageResponse -> ShowS
[ImportApplicationUsageResponse] -> ShowS
ImportApplicationUsageResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ImportApplicationUsageResponse] -> ShowS
$cshowList :: [ImportApplicationUsageResponse] -> ShowS
show :: ImportApplicationUsageResponse -> String
$cshow :: ImportApplicationUsageResponse -> String
showsPrec :: Int -> ImportApplicationUsageResponse -> ShowS
$cshowsPrec :: Int -> ImportApplicationUsageResponse -> ShowS
Prelude.Show, forall x.
Rep ImportApplicationUsageResponse x
-> ImportApplicationUsageResponse
forall x.
ImportApplicationUsageResponse
-> Rep ImportApplicationUsageResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep ImportApplicationUsageResponse x
-> ImportApplicationUsageResponse
$cfrom :: forall x.
ImportApplicationUsageResponse
-> Rep ImportApplicationUsageResponse x
Prelude.Generic)

-- |
-- Create a value of 'ImportApplicationUsageResponse' 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:
--
-- 'httpStatus', 'importApplicationUsageResponse_httpStatus' - The response's http status code.
--
-- 'importId', 'importApplicationUsageResponse_importId' - ID of the import request.
newImportApplicationUsageResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'importId'
  Prelude.Text ->
  ImportApplicationUsageResponse
newImportApplicationUsageResponse :: Int -> Text -> ImportApplicationUsageResponse
newImportApplicationUsageResponse
  Int
pHttpStatus_
  Text
pImportId_ =
    ImportApplicationUsageResponse'
      { $sel:httpStatus:ImportApplicationUsageResponse' :: Int
httpStatus =
          Int
pHttpStatus_,
        $sel:importId:ImportApplicationUsageResponse' :: Text
importId = Text
pImportId_
      }

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

-- | ID of the import request.
importApplicationUsageResponse_importId :: Lens.Lens' ImportApplicationUsageResponse Prelude.Text
importApplicationUsageResponse_importId :: Lens' ImportApplicationUsageResponse Text
importApplicationUsageResponse_importId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ImportApplicationUsageResponse' {Text
importId :: Text
$sel:importId:ImportApplicationUsageResponse' :: ImportApplicationUsageResponse -> Text
importId} -> Text
importId) (\s :: ImportApplicationUsageResponse
s@ImportApplicationUsageResponse' {} Text
a -> ImportApplicationUsageResponse
s {$sel:importId:ImportApplicationUsageResponse' :: Text
importId = Text
a} :: ImportApplicationUsageResponse)

instance
  Prelude.NFData
    ImportApplicationUsageResponse
  where
  rnf :: ImportApplicationUsageResponse -> ()
rnf ImportApplicationUsageResponse' {Int
Text
importId :: Text
httpStatus :: Int
$sel:importId:ImportApplicationUsageResponse' :: ImportApplicationUsageResponse -> Text
$sel:httpStatus:ImportApplicationUsageResponse' :: ImportApplicationUsageResponse -> Int
..} =
    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 Text
importId