{-# 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.ManagedBlockChain.CreateAccessor
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- The token based access feature is in preview release for Ethereum on
-- Amazon Managed Blockchain and is subject to change. We recommend that
-- you use this feature only with test scenarios, and not in production
-- environments.
--
-- Creates a new accessor for use with Managed Blockchain Ethereum nodes.
-- An accessor object is a container that has the information required for
-- token based access to your Ethereum nodes.
module Amazonka.ManagedBlockChain.CreateAccessor
  ( -- * Creating a Request
    CreateAccessor (..),
    newCreateAccessor,

    -- * Request Lenses
    createAccessor_clientRequestToken,
    createAccessor_accessorType,

    -- * Destructuring the Response
    CreateAccessorResponse (..),
    newCreateAccessorResponse,

    -- * Response Lenses
    createAccessorResponse_accessorId,
    createAccessorResponse_billingToken,
    createAccessorResponse_httpStatus,
  )
where

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

-- | /See:/ 'newCreateAccessor' smart constructor.
data CreateAccessor = CreateAccessor'
  { -- | This is a unique, case-sensitive identifier that you provide to ensure
    -- the idempotency of the operation. An idempotent operation completes no
    -- more than once. This identifier is required only if you make a service
    -- request directly using an HTTP client. It is generated automatically if
    -- you use an Amazon Web Services SDK or the Amazon Web Services CLI.
    CreateAccessor -> Text
clientRequestToken :: Prelude.Text,
    -- | The type of accessor.
    --
    -- Currently accessor type is restricted to @BILLING_TOKEN@.
    CreateAccessor -> AccessorType
accessorType :: AccessorType
  }
  deriving (CreateAccessor -> CreateAccessor -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateAccessor -> CreateAccessor -> Bool
$c/= :: CreateAccessor -> CreateAccessor -> Bool
== :: CreateAccessor -> CreateAccessor -> Bool
$c== :: CreateAccessor -> CreateAccessor -> Bool
Prelude.Eq, ReadPrec [CreateAccessor]
ReadPrec CreateAccessor
Int -> ReadS CreateAccessor
ReadS [CreateAccessor]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateAccessor]
$creadListPrec :: ReadPrec [CreateAccessor]
readPrec :: ReadPrec CreateAccessor
$creadPrec :: ReadPrec CreateAccessor
readList :: ReadS [CreateAccessor]
$creadList :: ReadS [CreateAccessor]
readsPrec :: Int -> ReadS CreateAccessor
$creadsPrec :: Int -> ReadS CreateAccessor
Prelude.Read, Int -> CreateAccessor -> ShowS
[CreateAccessor] -> ShowS
CreateAccessor -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateAccessor] -> ShowS
$cshowList :: [CreateAccessor] -> ShowS
show :: CreateAccessor -> String
$cshow :: CreateAccessor -> String
showsPrec :: Int -> CreateAccessor -> ShowS
$cshowsPrec :: Int -> CreateAccessor -> ShowS
Prelude.Show, forall x. Rep CreateAccessor x -> CreateAccessor
forall x. CreateAccessor -> Rep CreateAccessor x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateAccessor x -> CreateAccessor
$cfrom :: forall x. CreateAccessor -> Rep CreateAccessor x
Prelude.Generic)

-- |
-- Create a value of 'CreateAccessor' 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:
--
-- 'clientRequestToken', 'createAccessor_clientRequestToken' - This is a unique, case-sensitive identifier that you provide to ensure
-- the idempotency of the operation. An idempotent operation completes no
-- more than once. This identifier is required only if you make a service
-- request directly using an HTTP client. It is generated automatically if
-- you use an Amazon Web Services SDK or the Amazon Web Services CLI.
--
-- 'accessorType', 'createAccessor_accessorType' - The type of accessor.
--
-- Currently accessor type is restricted to @BILLING_TOKEN@.
newCreateAccessor ::
  -- | 'clientRequestToken'
  Prelude.Text ->
  -- | 'accessorType'
  AccessorType ->
  CreateAccessor
newCreateAccessor :: Text -> AccessorType -> CreateAccessor
newCreateAccessor Text
pClientRequestToken_ AccessorType
pAccessorType_ =
  CreateAccessor'
    { $sel:clientRequestToken:CreateAccessor' :: Text
clientRequestToken =
        Text
pClientRequestToken_,
      $sel:accessorType:CreateAccessor' :: AccessorType
accessorType = AccessorType
pAccessorType_
    }

-- | This is a unique, case-sensitive identifier that you provide to ensure
-- the idempotency of the operation. An idempotent operation completes no
-- more than once. This identifier is required only if you make a service
-- request directly using an HTTP client. It is generated automatically if
-- you use an Amazon Web Services SDK or the Amazon Web Services CLI.
createAccessor_clientRequestToken :: Lens.Lens' CreateAccessor Prelude.Text
createAccessor_clientRequestToken :: Lens' CreateAccessor Text
createAccessor_clientRequestToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAccessor' {Text
clientRequestToken :: Text
$sel:clientRequestToken:CreateAccessor' :: CreateAccessor -> Text
clientRequestToken} -> Text
clientRequestToken) (\s :: CreateAccessor
s@CreateAccessor' {} Text
a -> CreateAccessor
s {$sel:clientRequestToken:CreateAccessor' :: Text
clientRequestToken = Text
a} :: CreateAccessor)

-- | The type of accessor.
--
-- Currently accessor type is restricted to @BILLING_TOKEN@.
createAccessor_accessorType :: Lens.Lens' CreateAccessor AccessorType
createAccessor_accessorType :: Lens' CreateAccessor AccessorType
createAccessor_accessorType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAccessor' {AccessorType
accessorType :: AccessorType
$sel:accessorType:CreateAccessor' :: CreateAccessor -> AccessorType
accessorType} -> AccessorType
accessorType) (\s :: CreateAccessor
s@CreateAccessor' {} AccessorType
a -> CreateAccessor
s {$sel:accessorType:CreateAccessor' :: AccessorType
accessorType = AccessorType
a} :: CreateAccessor)

instance Core.AWSRequest CreateAccessor where
  type
    AWSResponse CreateAccessor =
      CreateAccessorResponse
  request :: (Service -> Service) -> CreateAccessor -> Request CreateAccessor
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 CreateAccessor
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateAccessor)))
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 Text -> Int -> CreateAccessorResponse
CreateAccessorResponse'
            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
"AccessorId")
            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
"BillingToken")
            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))
      )

instance Prelude.Hashable CreateAccessor where
  hashWithSalt :: Int -> CreateAccessor -> Int
hashWithSalt Int
_salt CreateAccessor' {Text
AccessorType
accessorType :: AccessorType
clientRequestToken :: Text
$sel:accessorType:CreateAccessor' :: CreateAccessor -> AccessorType
$sel:clientRequestToken:CreateAccessor' :: CreateAccessor -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
clientRequestToken
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` AccessorType
accessorType

instance Prelude.NFData CreateAccessor where
  rnf :: CreateAccessor -> ()
rnf CreateAccessor' {Text
AccessorType
accessorType :: AccessorType
clientRequestToken :: Text
$sel:accessorType:CreateAccessor' :: CreateAccessor -> AccessorType
$sel:clientRequestToken:CreateAccessor' :: CreateAccessor -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
clientRequestToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf AccessorType
accessorType

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

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

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

-- | /See:/ 'newCreateAccessorResponse' smart constructor.
data CreateAccessorResponse = CreateAccessorResponse'
  { -- | The unique identifier of the accessor.
    CreateAccessorResponse -> Maybe Text
accessorId :: Prelude.Maybe Prelude.Text,
    -- | The billing token is a property of the Accessor. Use this token to make
    -- Ethereum API calls to your Ethereum node. The billing token is used to
    -- track your accessor object for billing Ethereum API requests made to
    -- your Ethereum nodes.
    CreateAccessorResponse -> Maybe Text
billingToken :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    CreateAccessorResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateAccessorResponse -> CreateAccessorResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateAccessorResponse -> CreateAccessorResponse -> Bool
$c/= :: CreateAccessorResponse -> CreateAccessorResponse -> Bool
== :: CreateAccessorResponse -> CreateAccessorResponse -> Bool
$c== :: CreateAccessorResponse -> CreateAccessorResponse -> Bool
Prelude.Eq, ReadPrec [CreateAccessorResponse]
ReadPrec CreateAccessorResponse
Int -> ReadS CreateAccessorResponse
ReadS [CreateAccessorResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateAccessorResponse]
$creadListPrec :: ReadPrec [CreateAccessorResponse]
readPrec :: ReadPrec CreateAccessorResponse
$creadPrec :: ReadPrec CreateAccessorResponse
readList :: ReadS [CreateAccessorResponse]
$creadList :: ReadS [CreateAccessorResponse]
readsPrec :: Int -> ReadS CreateAccessorResponse
$creadsPrec :: Int -> ReadS CreateAccessorResponse
Prelude.Read, Int -> CreateAccessorResponse -> ShowS
[CreateAccessorResponse] -> ShowS
CreateAccessorResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateAccessorResponse] -> ShowS
$cshowList :: [CreateAccessorResponse] -> ShowS
show :: CreateAccessorResponse -> String
$cshow :: CreateAccessorResponse -> String
showsPrec :: Int -> CreateAccessorResponse -> ShowS
$cshowsPrec :: Int -> CreateAccessorResponse -> ShowS
Prelude.Show, forall x. Rep CreateAccessorResponse x -> CreateAccessorResponse
forall x. CreateAccessorResponse -> Rep CreateAccessorResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateAccessorResponse x -> CreateAccessorResponse
$cfrom :: forall x. CreateAccessorResponse -> Rep CreateAccessorResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateAccessorResponse' 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:
--
-- 'accessorId', 'createAccessorResponse_accessorId' - The unique identifier of the accessor.
--
-- 'billingToken', 'createAccessorResponse_billingToken' - The billing token is a property of the Accessor. Use this token to make
-- Ethereum API calls to your Ethereum node. The billing token is used to
-- track your accessor object for billing Ethereum API requests made to
-- your Ethereum nodes.
--
-- 'httpStatus', 'createAccessorResponse_httpStatus' - The response's http status code.
newCreateAccessorResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateAccessorResponse
newCreateAccessorResponse :: Int -> CreateAccessorResponse
newCreateAccessorResponse Int
pHttpStatus_ =
  CreateAccessorResponse'
    { $sel:accessorId:CreateAccessorResponse' :: Maybe Text
accessorId =
        forall a. Maybe a
Prelude.Nothing,
      $sel:billingToken:CreateAccessorResponse' :: Maybe Text
billingToken = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateAccessorResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The unique identifier of the accessor.
createAccessorResponse_accessorId :: Lens.Lens' CreateAccessorResponse (Prelude.Maybe Prelude.Text)
createAccessorResponse_accessorId :: Lens' CreateAccessorResponse (Maybe Text)
createAccessorResponse_accessorId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAccessorResponse' {Maybe Text
accessorId :: Maybe Text
$sel:accessorId:CreateAccessorResponse' :: CreateAccessorResponse -> Maybe Text
accessorId} -> Maybe Text
accessorId) (\s :: CreateAccessorResponse
s@CreateAccessorResponse' {} Maybe Text
a -> CreateAccessorResponse
s {$sel:accessorId:CreateAccessorResponse' :: Maybe Text
accessorId = Maybe Text
a} :: CreateAccessorResponse)

-- | The billing token is a property of the Accessor. Use this token to make
-- Ethereum API calls to your Ethereum node. The billing token is used to
-- track your accessor object for billing Ethereum API requests made to
-- your Ethereum nodes.
createAccessorResponse_billingToken :: Lens.Lens' CreateAccessorResponse (Prelude.Maybe Prelude.Text)
createAccessorResponse_billingToken :: Lens' CreateAccessorResponse (Maybe Text)
createAccessorResponse_billingToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAccessorResponse' {Maybe Text
billingToken :: Maybe Text
$sel:billingToken:CreateAccessorResponse' :: CreateAccessorResponse -> Maybe Text
billingToken} -> Maybe Text
billingToken) (\s :: CreateAccessorResponse
s@CreateAccessorResponse' {} Maybe Text
a -> CreateAccessorResponse
s {$sel:billingToken:CreateAccessorResponse' :: Maybe Text
billingToken = Maybe Text
a} :: CreateAccessorResponse)

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

instance Prelude.NFData CreateAccessorResponse where
  rnf :: CreateAccessorResponse -> ()
rnf CreateAccessorResponse' {Int
Maybe Text
httpStatus :: Int
billingToken :: Maybe Text
accessorId :: Maybe Text
$sel:httpStatus:CreateAccessorResponse' :: CreateAccessorResponse -> Int
$sel:billingToken:CreateAccessorResponse' :: CreateAccessorResponse -> Maybe Text
$sel:accessorId:CreateAccessorResponse' :: CreateAccessorResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
accessorId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
billingToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus