{-# 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.ConnectCases.CreateField
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a field in the Cases domain. This field is used to define the
-- case object model (that is, defines what data can be captured on cases)
-- in a Cases domain.
module Amazonka.ConnectCases.CreateField
  ( -- * Creating a Request
    CreateField (..),
    newCreateField,

    -- * Request Lenses
    createField_description,
    createField_domainId,
    createField_name,
    createField_type,

    -- * Destructuring the Response
    CreateFieldResponse (..),
    newCreateFieldResponse,

    -- * Response Lenses
    createFieldResponse_httpStatus,
    createFieldResponse_fieldArn,
    createFieldResponse_fieldId,
  )
where

import Amazonka.ConnectCases.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:/ 'newCreateField' smart constructor.
data CreateField = CreateField'
  { -- | The description of the field.
    CreateField -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | The unique identifier of the Cases domain.
    CreateField -> Text
domainId :: Prelude.Text,
    -- | The name of the field.
    CreateField -> Text
name :: Prelude.Text,
    -- | Defines the data type, some system constraints, and default display of
    -- the field.
    CreateField -> FieldType
type' :: FieldType
  }
  deriving (CreateField -> CreateField -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateField -> CreateField -> Bool
$c/= :: CreateField -> CreateField -> Bool
== :: CreateField -> CreateField -> Bool
$c== :: CreateField -> CreateField -> Bool
Prelude.Eq, ReadPrec [CreateField]
ReadPrec CreateField
Int -> ReadS CreateField
ReadS [CreateField]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateField]
$creadListPrec :: ReadPrec [CreateField]
readPrec :: ReadPrec CreateField
$creadPrec :: ReadPrec CreateField
readList :: ReadS [CreateField]
$creadList :: ReadS [CreateField]
readsPrec :: Int -> ReadS CreateField
$creadsPrec :: Int -> ReadS CreateField
Prelude.Read, Int -> CreateField -> ShowS
[CreateField] -> ShowS
CreateField -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateField] -> ShowS
$cshowList :: [CreateField] -> ShowS
show :: CreateField -> String
$cshow :: CreateField -> String
showsPrec :: Int -> CreateField -> ShowS
$cshowsPrec :: Int -> CreateField -> ShowS
Prelude.Show, forall x. Rep CreateField x -> CreateField
forall x. CreateField -> Rep CreateField x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateField x -> CreateField
$cfrom :: forall x. CreateField -> Rep CreateField x
Prelude.Generic)

-- |
-- Create a value of 'CreateField' 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:
--
-- 'description', 'createField_description' - The description of the field.
--
-- 'domainId', 'createField_domainId' - The unique identifier of the Cases domain.
--
-- 'name', 'createField_name' - The name of the field.
--
-- 'type'', 'createField_type' - Defines the data type, some system constraints, and default display of
-- the field.
newCreateField ::
  -- | 'domainId'
  Prelude.Text ->
  -- | 'name'
  Prelude.Text ->
  -- | 'type''
  FieldType ->
  CreateField
newCreateField :: Text -> Text -> FieldType -> CreateField
newCreateField Text
pDomainId_ Text
pName_ FieldType
pType_ =
  CreateField'
    { $sel:description:CreateField' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
      $sel:domainId:CreateField' :: Text
domainId = Text
pDomainId_,
      $sel:name:CreateField' :: Text
name = Text
pName_,
      $sel:type':CreateField' :: FieldType
type' = FieldType
pType_
    }

-- | The description of the field.
createField_description :: Lens.Lens' CreateField (Prelude.Maybe Prelude.Text)
createField_description :: Lens' CreateField (Maybe Text)
createField_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateField' {Maybe Text
description :: Maybe Text
$sel:description:CreateField' :: CreateField -> Maybe Text
description} -> Maybe Text
description) (\s :: CreateField
s@CreateField' {} Maybe Text
a -> CreateField
s {$sel:description:CreateField' :: Maybe Text
description = Maybe Text
a} :: CreateField)

-- | The unique identifier of the Cases domain.
createField_domainId :: Lens.Lens' CreateField Prelude.Text
createField_domainId :: Lens' CreateField Text
createField_domainId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateField' {Text
domainId :: Text
$sel:domainId:CreateField' :: CreateField -> Text
domainId} -> Text
domainId) (\s :: CreateField
s@CreateField' {} Text
a -> CreateField
s {$sel:domainId:CreateField' :: Text
domainId = Text
a} :: CreateField)

-- | The name of the field.
createField_name :: Lens.Lens' CreateField Prelude.Text
createField_name :: Lens' CreateField Text
createField_name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateField' {Text
name :: Text
$sel:name:CreateField' :: CreateField -> Text
name} -> Text
name) (\s :: CreateField
s@CreateField' {} Text
a -> CreateField
s {$sel:name:CreateField' :: Text
name = Text
a} :: CreateField)

-- | Defines the data type, some system constraints, and default display of
-- the field.
createField_type :: Lens.Lens' CreateField FieldType
createField_type :: Lens' CreateField FieldType
createField_type = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateField' {FieldType
type' :: FieldType
$sel:type':CreateField' :: CreateField -> FieldType
type'} -> FieldType
type') (\s :: CreateField
s@CreateField' {} FieldType
a -> CreateField
s {$sel:type':CreateField' :: FieldType
type' = FieldType
a} :: CreateField)

instance Core.AWSRequest CreateField where
  type AWSResponse CreateField = CreateFieldResponse
  request :: (Service -> Service) -> CreateField -> Request CreateField
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 CreateField
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateField)))
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 -> Text -> CreateFieldResponse
CreateFieldResponse'
            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
"fieldArn")
            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
"fieldId")
      )

instance Prelude.Hashable CreateField where
  hashWithSalt :: Int -> CreateField -> Int
hashWithSalt Int
_salt CreateField' {Maybe Text
Text
FieldType
type' :: FieldType
name :: Text
domainId :: Text
description :: Maybe Text
$sel:type':CreateField' :: CreateField -> FieldType
$sel:name:CreateField' :: CreateField -> Text
$sel:domainId:CreateField' :: CreateField -> Text
$sel:description:CreateField' :: CreateField -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
domainId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` FieldType
type'

instance Prelude.NFData CreateField where
  rnf :: CreateField -> ()
rnf CreateField' {Maybe Text
Text
FieldType
type' :: FieldType
name :: Text
domainId :: Text
description :: Maybe Text
$sel:type':CreateField' :: CreateField -> FieldType
$sel:name:CreateField' :: CreateField -> Text
$sel:domainId:CreateField' :: CreateField -> Text
$sel:description:CreateField' :: CreateField -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
domainId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
name
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf FieldType
type'

instance Data.ToHeaders CreateField where
  toHeaders :: CreateField -> 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 CreateField where
  toJSON :: CreateField -> Value
toJSON CreateField' {Maybe Text
Text
FieldType
type' :: FieldType
name :: Text
domainId :: Text
description :: Maybe Text
$sel:type':CreateField' :: CreateField -> FieldType
$sel:name:CreateField' :: CreateField -> Text
$sel:domainId:CreateField' :: CreateField -> Text
$sel:description:CreateField' :: CreateField -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"description" 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
description,
            forall a. a -> Maybe a
Prelude.Just (Key
"name" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
name),
            forall a. a -> Maybe a
Prelude.Just (Key
"type" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= FieldType
type')
          ]
      )

instance Data.ToPath CreateField where
  toPath :: CreateField -> ByteString
toPath CreateField' {Maybe Text
Text
FieldType
type' :: FieldType
name :: Text
domainId :: Text
description :: Maybe Text
$sel:type':CreateField' :: CreateField -> FieldType
$sel:name:CreateField' :: CreateField -> Text
$sel:domainId:CreateField' :: CreateField -> Text
$sel:description:CreateField' :: CreateField -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/domains/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
domainId, ByteString
"/fields"]

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

-- | /See:/ 'newCreateFieldResponse' smart constructor.
data CreateFieldResponse = CreateFieldResponse'
  { -- | The response's http status code.
    CreateFieldResponse -> Int
httpStatus :: Prelude.Int,
    -- | The Amazon Resource Name (ARN) of the field.
    CreateFieldResponse -> Text
fieldArn :: Prelude.Text,
    -- | The unique identifier of a field.
    CreateFieldResponse -> Text
fieldId :: Prelude.Text
  }
  deriving (CreateFieldResponse -> CreateFieldResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateFieldResponse -> CreateFieldResponse -> Bool
$c/= :: CreateFieldResponse -> CreateFieldResponse -> Bool
== :: CreateFieldResponse -> CreateFieldResponse -> Bool
$c== :: CreateFieldResponse -> CreateFieldResponse -> Bool
Prelude.Eq, ReadPrec [CreateFieldResponse]
ReadPrec CreateFieldResponse
Int -> ReadS CreateFieldResponse
ReadS [CreateFieldResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateFieldResponse]
$creadListPrec :: ReadPrec [CreateFieldResponse]
readPrec :: ReadPrec CreateFieldResponse
$creadPrec :: ReadPrec CreateFieldResponse
readList :: ReadS [CreateFieldResponse]
$creadList :: ReadS [CreateFieldResponse]
readsPrec :: Int -> ReadS CreateFieldResponse
$creadsPrec :: Int -> ReadS CreateFieldResponse
Prelude.Read, Int -> CreateFieldResponse -> ShowS
[CreateFieldResponse] -> ShowS
CreateFieldResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateFieldResponse] -> ShowS
$cshowList :: [CreateFieldResponse] -> ShowS
show :: CreateFieldResponse -> String
$cshow :: CreateFieldResponse -> String
showsPrec :: Int -> CreateFieldResponse -> ShowS
$cshowsPrec :: Int -> CreateFieldResponse -> ShowS
Prelude.Show, forall x. Rep CreateFieldResponse x -> CreateFieldResponse
forall x. CreateFieldResponse -> Rep CreateFieldResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateFieldResponse x -> CreateFieldResponse
$cfrom :: forall x. CreateFieldResponse -> Rep CreateFieldResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateFieldResponse' 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', 'createFieldResponse_httpStatus' - The response's http status code.
--
-- 'fieldArn', 'createFieldResponse_fieldArn' - The Amazon Resource Name (ARN) of the field.
--
-- 'fieldId', 'createFieldResponse_fieldId' - The unique identifier of a field.
newCreateFieldResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'fieldArn'
  Prelude.Text ->
  -- | 'fieldId'
  Prelude.Text ->
  CreateFieldResponse
newCreateFieldResponse :: Int -> Text -> Text -> CreateFieldResponse
newCreateFieldResponse
  Int
pHttpStatus_
  Text
pFieldArn_
  Text
pFieldId_ =
    CreateFieldResponse'
      { $sel:httpStatus:CreateFieldResponse' :: Int
httpStatus = Int
pHttpStatus_,
        $sel:fieldArn:CreateFieldResponse' :: Text
fieldArn = Text
pFieldArn_,
        $sel:fieldId:CreateFieldResponse' :: Text
fieldId = Text
pFieldId_
      }

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

-- | The Amazon Resource Name (ARN) of the field.
createFieldResponse_fieldArn :: Lens.Lens' CreateFieldResponse Prelude.Text
createFieldResponse_fieldArn :: Lens' CreateFieldResponse Text
createFieldResponse_fieldArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFieldResponse' {Text
fieldArn :: Text
$sel:fieldArn:CreateFieldResponse' :: CreateFieldResponse -> Text
fieldArn} -> Text
fieldArn) (\s :: CreateFieldResponse
s@CreateFieldResponse' {} Text
a -> CreateFieldResponse
s {$sel:fieldArn:CreateFieldResponse' :: Text
fieldArn = Text
a} :: CreateFieldResponse)

-- | The unique identifier of a field.
createFieldResponse_fieldId :: Lens.Lens' CreateFieldResponse Prelude.Text
createFieldResponse_fieldId :: Lens' CreateFieldResponse Text
createFieldResponse_fieldId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFieldResponse' {Text
fieldId :: Text
$sel:fieldId:CreateFieldResponse' :: CreateFieldResponse -> Text
fieldId} -> Text
fieldId) (\s :: CreateFieldResponse
s@CreateFieldResponse' {} Text
a -> CreateFieldResponse
s {$sel:fieldId:CreateFieldResponse' :: Text
fieldId = Text
a} :: CreateFieldResponse)

instance Prelude.NFData CreateFieldResponse where
  rnf :: CreateFieldResponse -> ()
rnf CreateFieldResponse' {Int
Text
fieldId :: Text
fieldArn :: Text
httpStatus :: Int
$sel:fieldId:CreateFieldResponse' :: CreateFieldResponse -> Text
$sel:fieldArn:CreateFieldResponse' :: CreateFieldResponse -> Text
$sel:httpStatus:CreateFieldResponse' :: CreateFieldResponse -> 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
fieldArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
fieldId