{-# 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.IoTSiteWise.DeleteAsset
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Deletes an asset. This action can\'t be undone. For more information,
-- see
-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/delete-assets-and-models.html Deleting assets and models>
-- in the /IoT SiteWise User Guide/.
--
-- You can\'t delete an asset that\'s associated to another asset. For more
-- information, see
-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DisassociateAssets.html DisassociateAssets>.
module Amazonka.IoTSiteWise.DeleteAsset
  ( -- * Creating a Request
    DeleteAsset (..),
    newDeleteAsset,

    -- * Request Lenses
    deleteAsset_clientToken,
    deleteAsset_assetId,

    -- * Destructuring the Response
    DeleteAssetResponse (..),
    newDeleteAssetResponse,

    -- * Response Lenses
    deleteAssetResponse_httpStatus,
    deleteAssetResponse_assetStatus,
  )
where

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

-- | /See:/ 'newDeleteAsset' smart constructor.
data DeleteAsset = DeleteAsset'
  { -- | A unique case-sensitive identifier that you can provide to ensure the
    -- idempotency of the request. Don\'t reuse this client token if a new
    -- idempotent request is required.
    DeleteAsset -> Maybe Text
clientToken :: Prelude.Maybe Prelude.Text,
    -- | The ID of the asset to delete.
    DeleteAsset -> Text
assetId :: Prelude.Text
  }
  deriving (DeleteAsset -> DeleteAsset -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeleteAsset -> DeleteAsset -> Bool
$c/= :: DeleteAsset -> DeleteAsset -> Bool
== :: DeleteAsset -> DeleteAsset -> Bool
$c== :: DeleteAsset -> DeleteAsset -> Bool
Prelude.Eq, ReadPrec [DeleteAsset]
ReadPrec DeleteAsset
Int -> ReadS DeleteAsset
ReadS [DeleteAsset]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeleteAsset]
$creadListPrec :: ReadPrec [DeleteAsset]
readPrec :: ReadPrec DeleteAsset
$creadPrec :: ReadPrec DeleteAsset
readList :: ReadS [DeleteAsset]
$creadList :: ReadS [DeleteAsset]
readsPrec :: Int -> ReadS DeleteAsset
$creadsPrec :: Int -> ReadS DeleteAsset
Prelude.Read, Int -> DeleteAsset -> ShowS
[DeleteAsset] -> ShowS
DeleteAsset -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeleteAsset] -> ShowS
$cshowList :: [DeleteAsset] -> ShowS
show :: DeleteAsset -> String
$cshow :: DeleteAsset -> String
showsPrec :: Int -> DeleteAsset -> ShowS
$cshowsPrec :: Int -> DeleteAsset -> ShowS
Prelude.Show, forall x. Rep DeleteAsset x -> DeleteAsset
forall x. DeleteAsset -> Rep DeleteAsset x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DeleteAsset x -> DeleteAsset
$cfrom :: forall x. DeleteAsset -> Rep DeleteAsset x
Prelude.Generic)

-- |
-- Create a value of 'DeleteAsset' 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:
--
-- 'clientToken', 'deleteAsset_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
-- idempotency of the request. Don\'t reuse this client token if a new
-- idempotent request is required.
--
-- 'assetId', 'deleteAsset_assetId' - The ID of the asset to delete.
newDeleteAsset ::
  -- | 'assetId'
  Prelude.Text ->
  DeleteAsset
newDeleteAsset :: Text -> DeleteAsset
newDeleteAsset Text
pAssetId_ =
  DeleteAsset'
    { $sel:clientToken:DeleteAsset' :: Maybe Text
clientToken = forall a. Maybe a
Prelude.Nothing,
      $sel:assetId:DeleteAsset' :: Text
assetId = Text
pAssetId_
    }

-- | A unique case-sensitive identifier that you can provide to ensure the
-- idempotency of the request. Don\'t reuse this client token if a new
-- idempotent request is required.
deleteAsset_clientToken :: Lens.Lens' DeleteAsset (Prelude.Maybe Prelude.Text)
deleteAsset_clientToken :: Lens' DeleteAsset (Maybe Text)
deleteAsset_clientToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteAsset' {Maybe Text
clientToken :: Maybe Text
$sel:clientToken:DeleteAsset' :: DeleteAsset -> Maybe Text
clientToken} -> Maybe Text
clientToken) (\s :: DeleteAsset
s@DeleteAsset' {} Maybe Text
a -> DeleteAsset
s {$sel:clientToken:DeleteAsset' :: Maybe Text
clientToken = Maybe Text
a} :: DeleteAsset)

-- | The ID of the asset to delete.
deleteAsset_assetId :: Lens.Lens' DeleteAsset Prelude.Text
deleteAsset_assetId :: Lens' DeleteAsset Text
deleteAsset_assetId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteAsset' {Text
assetId :: Text
$sel:assetId:DeleteAsset' :: DeleteAsset -> Text
assetId} -> Text
assetId) (\s :: DeleteAsset
s@DeleteAsset' {} Text
a -> DeleteAsset
s {$sel:assetId:DeleteAsset' :: Text
assetId = Text
a} :: DeleteAsset)

instance Core.AWSRequest DeleteAsset where
  type AWSResponse DeleteAsset = DeleteAssetResponse
  request :: (Service -> Service) -> DeleteAsset -> Request DeleteAsset
request Service -> Service
overrides =
    forall a. ToRequest a => Service -> a -> Request a
Request.delete (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy DeleteAsset
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse DeleteAsset)))
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 -> AssetStatus -> DeleteAssetResponse
DeleteAssetResponse'
            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
"assetStatus")
      )

instance Prelude.Hashable DeleteAsset where
  hashWithSalt :: Int -> DeleteAsset -> Int
hashWithSalt Int
_salt DeleteAsset' {Maybe Text
Text
assetId :: Text
clientToken :: Maybe Text
$sel:assetId:DeleteAsset' :: DeleteAsset -> Text
$sel:clientToken:DeleteAsset' :: DeleteAsset -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
clientToken
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
assetId

instance Prelude.NFData DeleteAsset where
  rnf :: DeleteAsset -> ()
rnf DeleteAsset' {Maybe Text
Text
assetId :: Text
clientToken :: Maybe Text
$sel:assetId:DeleteAsset' :: DeleteAsset -> Text
$sel:clientToken:DeleteAsset' :: DeleteAsset -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
clientToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
assetId

instance Data.ToHeaders DeleteAsset where
  toHeaders :: DeleteAsset -> 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.ToPath DeleteAsset where
  toPath :: DeleteAsset -> ByteString
toPath DeleteAsset' {Maybe Text
Text
assetId :: Text
clientToken :: Maybe Text
$sel:assetId:DeleteAsset' :: DeleteAsset -> Text
$sel:clientToken:DeleteAsset' :: DeleteAsset -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat [ByteString
"/assets/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
assetId]

instance Data.ToQuery DeleteAsset where
  toQuery :: DeleteAsset -> QueryString
toQuery DeleteAsset' {Maybe Text
Text
assetId :: Text
clientToken :: Maybe Text
$sel:assetId:DeleteAsset' :: DeleteAsset -> Text
$sel:clientToken:DeleteAsset' :: DeleteAsset -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat [ByteString
"clientToken" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe Text
clientToken]

-- | /See:/ 'newDeleteAssetResponse' smart constructor.
data DeleteAssetResponse = DeleteAssetResponse'
  { -- | The response's http status code.
    DeleteAssetResponse -> Int
httpStatus :: Prelude.Int,
    -- | The status of the asset, which contains a state (@DELETING@ after
    -- successfully calling this operation) and any error message.
    DeleteAssetResponse -> AssetStatus
assetStatus :: AssetStatus
  }
  deriving (DeleteAssetResponse -> DeleteAssetResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeleteAssetResponse -> DeleteAssetResponse -> Bool
$c/= :: DeleteAssetResponse -> DeleteAssetResponse -> Bool
== :: DeleteAssetResponse -> DeleteAssetResponse -> Bool
$c== :: DeleteAssetResponse -> DeleteAssetResponse -> Bool
Prelude.Eq, ReadPrec [DeleteAssetResponse]
ReadPrec DeleteAssetResponse
Int -> ReadS DeleteAssetResponse
ReadS [DeleteAssetResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeleteAssetResponse]
$creadListPrec :: ReadPrec [DeleteAssetResponse]
readPrec :: ReadPrec DeleteAssetResponse
$creadPrec :: ReadPrec DeleteAssetResponse
readList :: ReadS [DeleteAssetResponse]
$creadList :: ReadS [DeleteAssetResponse]
readsPrec :: Int -> ReadS DeleteAssetResponse
$creadsPrec :: Int -> ReadS DeleteAssetResponse
Prelude.Read, Int -> DeleteAssetResponse -> ShowS
[DeleteAssetResponse] -> ShowS
DeleteAssetResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeleteAssetResponse] -> ShowS
$cshowList :: [DeleteAssetResponse] -> ShowS
show :: DeleteAssetResponse -> String
$cshow :: DeleteAssetResponse -> String
showsPrec :: Int -> DeleteAssetResponse -> ShowS
$cshowsPrec :: Int -> DeleteAssetResponse -> ShowS
Prelude.Show, forall x. Rep DeleteAssetResponse x -> DeleteAssetResponse
forall x. DeleteAssetResponse -> Rep DeleteAssetResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DeleteAssetResponse x -> DeleteAssetResponse
$cfrom :: forall x. DeleteAssetResponse -> Rep DeleteAssetResponse x
Prelude.Generic)

-- |
-- Create a value of 'DeleteAssetResponse' 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', 'deleteAssetResponse_httpStatus' - The response's http status code.
--
-- 'assetStatus', 'deleteAssetResponse_assetStatus' - The status of the asset, which contains a state (@DELETING@ after
-- successfully calling this operation) and any error message.
newDeleteAssetResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'assetStatus'
  AssetStatus ->
  DeleteAssetResponse
newDeleteAssetResponse :: Int -> AssetStatus -> DeleteAssetResponse
newDeleteAssetResponse Int
pHttpStatus_ AssetStatus
pAssetStatus_ =
  DeleteAssetResponse'
    { $sel:httpStatus:DeleteAssetResponse' :: Int
httpStatus = Int
pHttpStatus_,
      $sel:assetStatus:DeleteAssetResponse' :: AssetStatus
assetStatus = AssetStatus
pAssetStatus_
    }

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

-- | The status of the asset, which contains a state (@DELETING@ after
-- successfully calling this operation) and any error message.
deleteAssetResponse_assetStatus :: Lens.Lens' DeleteAssetResponse AssetStatus
deleteAssetResponse_assetStatus :: Lens' DeleteAssetResponse AssetStatus
deleteAssetResponse_assetStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteAssetResponse' {AssetStatus
assetStatus :: AssetStatus
$sel:assetStatus:DeleteAssetResponse' :: DeleteAssetResponse -> AssetStatus
assetStatus} -> AssetStatus
assetStatus) (\s :: DeleteAssetResponse
s@DeleteAssetResponse' {} AssetStatus
a -> DeleteAssetResponse
s {$sel:assetStatus:DeleteAssetResponse' :: AssetStatus
assetStatus = AssetStatus
a} :: DeleteAssetResponse)

instance Prelude.NFData DeleteAssetResponse where
  rnf :: DeleteAssetResponse -> ()
rnf DeleteAssetResponse' {Int
AssetStatus
assetStatus :: AssetStatus
httpStatus :: Int
$sel:assetStatus:DeleteAssetResponse' :: DeleteAssetResponse -> AssetStatus
$sel:httpStatus:DeleteAssetResponse' :: DeleteAssetResponse -> 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 AssetStatus
assetStatus