{-# 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.IoT1ClickProjects.AssociateDeviceWithPlacement
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Associates a physical device with a placement.
module Amazonka.IoT1ClickProjects.AssociateDeviceWithPlacement
  ( -- * Creating a Request
    AssociateDeviceWithPlacement (..),
    newAssociateDeviceWithPlacement,

    -- * Request Lenses
    associateDeviceWithPlacement_projectName,
    associateDeviceWithPlacement_placementName,
    associateDeviceWithPlacement_deviceId,
    associateDeviceWithPlacement_deviceTemplateName,

    -- * Destructuring the Response
    AssociateDeviceWithPlacementResponse (..),
    newAssociateDeviceWithPlacementResponse,

    -- * Response Lenses
    associateDeviceWithPlacementResponse_httpStatus,
  )
where

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

-- | /See:/ 'newAssociateDeviceWithPlacement' smart constructor.
data AssociateDeviceWithPlacement = AssociateDeviceWithPlacement'
  { -- | The name of the project containing the placement in which to associate
    -- the device.
    AssociateDeviceWithPlacement -> Text
projectName :: Prelude.Text,
    -- | The name of the placement in which to associate the device.
    AssociateDeviceWithPlacement -> Text
placementName :: Prelude.Text,
    -- | The ID of the physical device to be associated with the given placement
    -- in the project. Note that a mandatory 4 character prefix is required for
    -- all @deviceId@ values.
    AssociateDeviceWithPlacement -> Text
deviceId :: Prelude.Text,
    -- | The device template name to associate with the device ID.
    AssociateDeviceWithPlacement -> Text
deviceTemplateName :: Prelude.Text
  }
  deriving (AssociateDeviceWithPlacement
-> AssociateDeviceWithPlacement -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AssociateDeviceWithPlacement
-> AssociateDeviceWithPlacement -> Bool
$c/= :: AssociateDeviceWithPlacement
-> AssociateDeviceWithPlacement -> Bool
== :: AssociateDeviceWithPlacement
-> AssociateDeviceWithPlacement -> Bool
$c== :: AssociateDeviceWithPlacement
-> AssociateDeviceWithPlacement -> Bool
Prelude.Eq, ReadPrec [AssociateDeviceWithPlacement]
ReadPrec AssociateDeviceWithPlacement
Int -> ReadS AssociateDeviceWithPlacement
ReadS [AssociateDeviceWithPlacement]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AssociateDeviceWithPlacement]
$creadListPrec :: ReadPrec [AssociateDeviceWithPlacement]
readPrec :: ReadPrec AssociateDeviceWithPlacement
$creadPrec :: ReadPrec AssociateDeviceWithPlacement
readList :: ReadS [AssociateDeviceWithPlacement]
$creadList :: ReadS [AssociateDeviceWithPlacement]
readsPrec :: Int -> ReadS AssociateDeviceWithPlacement
$creadsPrec :: Int -> ReadS AssociateDeviceWithPlacement
Prelude.Read, Int -> AssociateDeviceWithPlacement -> ShowS
[AssociateDeviceWithPlacement] -> ShowS
AssociateDeviceWithPlacement -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AssociateDeviceWithPlacement] -> ShowS
$cshowList :: [AssociateDeviceWithPlacement] -> ShowS
show :: AssociateDeviceWithPlacement -> String
$cshow :: AssociateDeviceWithPlacement -> String
showsPrec :: Int -> AssociateDeviceWithPlacement -> ShowS
$cshowsPrec :: Int -> AssociateDeviceWithPlacement -> ShowS
Prelude.Show, forall x.
Rep AssociateDeviceWithPlacement x -> AssociateDeviceWithPlacement
forall x.
AssociateDeviceWithPlacement -> Rep AssociateDeviceWithPlacement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep AssociateDeviceWithPlacement x -> AssociateDeviceWithPlacement
$cfrom :: forall x.
AssociateDeviceWithPlacement -> Rep AssociateDeviceWithPlacement x
Prelude.Generic)

-- |
-- Create a value of 'AssociateDeviceWithPlacement' 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:
--
-- 'projectName', 'associateDeviceWithPlacement_projectName' - The name of the project containing the placement in which to associate
-- the device.
--
-- 'placementName', 'associateDeviceWithPlacement_placementName' - The name of the placement in which to associate the device.
--
-- 'deviceId', 'associateDeviceWithPlacement_deviceId' - The ID of the physical device to be associated with the given placement
-- in the project. Note that a mandatory 4 character prefix is required for
-- all @deviceId@ values.
--
-- 'deviceTemplateName', 'associateDeviceWithPlacement_deviceTemplateName' - The device template name to associate with the device ID.
newAssociateDeviceWithPlacement ::
  -- | 'projectName'
  Prelude.Text ->
  -- | 'placementName'
  Prelude.Text ->
  -- | 'deviceId'
  Prelude.Text ->
  -- | 'deviceTemplateName'
  Prelude.Text ->
  AssociateDeviceWithPlacement
newAssociateDeviceWithPlacement :: Text -> Text -> Text -> Text -> AssociateDeviceWithPlacement
newAssociateDeviceWithPlacement
  Text
pProjectName_
  Text
pPlacementName_
  Text
pDeviceId_
  Text
pDeviceTemplateName_ =
    AssociateDeviceWithPlacement'
      { $sel:projectName:AssociateDeviceWithPlacement' :: Text
projectName =
          Text
pProjectName_,
        $sel:placementName:AssociateDeviceWithPlacement' :: Text
placementName = Text
pPlacementName_,
        $sel:deviceId:AssociateDeviceWithPlacement' :: Text
deviceId = Text
pDeviceId_,
        $sel:deviceTemplateName:AssociateDeviceWithPlacement' :: Text
deviceTemplateName = Text
pDeviceTemplateName_
      }

-- | The name of the project containing the placement in which to associate
-- the device.
associateDeviceWithPlacement_projectName :: Lens.Lens' AssociateDeviceWithPlacement Prelude.Text
associateDeviceWithPlacement_projectName :: Lens' AssociateDeviceWithPlacement Text
associateDeviceWithPlacement_projectName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AssociateDeviceWithPlacement' {Text
projectName :: Text
$sel:projectName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
projectName} -> Text
projectName) (\s :: AssociateDeviceWithPlacement
s@AssociateDeviceWithPlacement' {} Text
a -> AssociateDeviceWithPlacement
s {$sel:projectName:AssociateDeviceWithPlacement' :: Text
projectName = Text
a} :: AssociateDeviceWithPlacement)

-- | The name of the placement in which to associate the device.
associateDeviceWithPlacement_placementName :: Lens.Lens' AssociateDeviceWithPlacement Prelude.Text
associateDeviceWithPlacement_placementName :: Lens' AssociateDeviceWithPlacement Text
associateDeviceWithPlacement_placementName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AssociateDeviceWithPlacement' {Text
placementName :: Text
$sel:placementName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
placementName} -> Text
placementName) (\s :: AssociateDeviceWithPlacement
s@AssociateDeviceWithPlacement' {} Text
a -> AssociateDeviceWithPlacement
s {$sel:placementName:AssociateDeviceWithPlacement' :: Text
placementName = Text
a} :: AssociateDeviceWithPlacement)

-- | The ID of the physical device to be associated with the given placement
-- in the project. Note that a mandatory 4 character prefix is required for
-- all @deviceId@ values.
associateDeviceWithPlacement_deviceId :: Lens.Lens' AssociateDeviceWithPlacement Prelude.Text
associateDeviceWithPlacement_deviceId :: Lens' AssociateDeviceWithPlacement Text
associateDeviceWithPlacement_deviceId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AssociateDeviceWithPlacement' {Text
deviceId :: Text
$sel:deviceId:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
deviceId} -> Text
deviceId) (\s :: AssociateDeviceWithPlacement
s@AssociateDeviceWithPlacement' {} Text
a -> AssociateDeviceWithPlacement
s {$sel:deviceId:AssociateDeviceWithPlacement' :: Text
deviceId = Text
a} :: AssociateDeviceWithPlacement)

-- | The device template name to associate with the device ID.
associateDeviceWithPlacement_deviceTemplateName :: Lens.Lens' AssociateDeviceWithPlacement Prelude.Text
associateDeviceWithPlacement_deviceTemplateName :: Lens' AssociateDeviceWithPlacement Text
associateDeviceWithPlacement_deviceTemplateName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AssociateDeviceWithPlacement' {Text
deviceTemplateName :: Text
$sel:deviceTemplateName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
deviceTemplateName} -> Text
deviceTemplateName) (\s :: AssociateDeviceWithPlacement
s@AssociateDeviceWithPlacement' {} Text
a -> AssociateDeviceWithPlacement
s {$sel:deviceTemplateName:AssociateDeviceWithPlacement' :: Text
deviceTemplateName = Text
a} :: AssociateDeviceWithPlacement)

instance Core.AWSRequest AssociateDeviceWithPlacement where
  type
    AWSResponse AssociateDeviceWithPlacement =
      AssociateDeviceWithPlacementResponse
  request :: (Service -> Service)
-> AssociateDeviceWithPlacement
-> Request AssociateDeviceWithPlacement
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.putJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy AssociateDeviceWithPlacement
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse AssociateDeviceWithPlacement)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Int -> AssociateDeviceWithPlacementResponse
AssociateDeviceWithPlacementResponse'
            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))
      )

instance
  Prelude.Hashable
    AssociateDeviceWithPlacement
  where
  hashWithSalt :: Int -> AssociateDeviceWithPlacement -> Int
hashWithSalt Int
_salt AssociateDeviceWithPlacement' {Text
deviceTemplateName :: Text
deviceId :: Text
placementName :: Text
projectName :: Text
$sel:deviceTemplateName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:deviceId:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:placementName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:projectName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
projectName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
placementName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
deviceId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
deviceTemplateName

instance Prelude.NFData AssociateDeviceWithPlacement where
  rnf :: AssociateDeviceWithPlacement -> ()
rnf AssociateDeviceWithPlacement' {Text
deviceTemplateName :: Text
deviceId :: Text
placementName :: Text
projectName :: Text
$sel:deviceTemplateName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:deviceId:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:placementName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:projectName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
projectName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
placementName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
deviceId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
deviceTemplateName

instance Data.ToHeaders AssociateDeviceWithPlacement where
  toHeaders :: AssociateDeviceWithPlacement -> 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 AssociateDeviceWithPlacement where
  toJSON :: AssociateDeviceWithPlacement -> Value
toJSON AssociateDeviceWithPlacement' {Text
deviceTemplateName :: Text
deviceId :: Text
placementName :: Text
projectName :: Text
$sel:deviceTemplateName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:deviceId:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:placementName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:projectName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [forall a. a -> Maybe a
Prelude.Just (Key
"deviceId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
deviceId)]
      )

instance Data.ToPath AssociateDeviceWithPlacement where
  toPath :: AssociateDeviceWithPlacement -> ByteString
toPath AssociateDeviceWithPlacement' {Text
deviceTemplateName :: Text
deviceId :: Text
placementName :: Text
projectName :: Text
$sel:deviceTemplateName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:deviceId:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:placementName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
$sel:projectName:AssociateDeviceWithPlacement' :: AssociateDeviceWithPlacement -> Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"/projects/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
projectName,
        ByteString
"/placements/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
placementName,
        ByteString
"/devices/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
deviceTemplateName
      ]

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

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

-- |
-- Create a value of 'AssociateDeviceWithPlacementResponse' 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', 'associateDeviceWithPlacementResponse_httpStatus' - The response's http status code.
newAssociateDeviceWithPlacementResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  AssociateDeviceWithPlacementResponse
newAssociateDeviceWithPlacementResponse :: Int -> AssociateDeviceWithPlacementResponse
newAssociateDeviceWithPlacementResponse Int
pHttpStatus_ =
  AssociateDeviceWithPlacementResponse'
    { $sel:httpStatus:AssociateDeviceWithPlacementResponse' :: Int
httpStatus =
        Int
pHttpStatus_
    }

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

instance
  Prelude.NFData
    AssociateDeviceWithPlacementResponse
  where
  rnf :: AssociateDeviceWithPlacementResponse -> ()
rnf AssociateDeviceWithPlacementResponse' {Int
httpStatus :: Int
$sel:httpStatus:AssociateDeviceWithPlacementResponse' :: AssociateDeviceWithPlacementResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus