{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.LexV2Models.Types.Message
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.LexV2Models.Types.Message where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.LexV2Models.Types.CustomPayload
import Amazonka.LexV2Models.Types.ImageResponseCard
import Amazonka.LexV2Models.Types.PlainTextMessage
import Amazonka.LexV2Models.Types.SSMLMessage
import qualified Amazonka.Prelude as Prelude

-- | The object that provides message text and it\'s type.
--
-- /See:/ 'newMessage' smart constructor.
data Message = Message'
  { -- | A message in a custom format defined by the client application.
    Message -> Maybe CustomPayload
customPayload :: Prelude.Maybe CustomPayload,
    -- | A message that defines a response card that the client application can
    -- show to the user.
    Message -> Maybe ImageResponseCard
imageResponseCard :: Prelude.Maybe ImageResponseCard,
    -- | A message in plain text format.
    Message -> Maybe PlainTextMessage
plainTextMessage :: Prelude.Maybe PlainTextMessage,
    -- | A message in Speech Synthesis Markup Language (SSML).
    Message -> Maybe SSMLMessage
ssmlMessage :: Prelude.Maybe SSMLMessage
  }
  deriving (Message -> Message -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c== :: Message -> Message -> Bool
Prelude.Eq, ReadPrec [Message]
ReadPrec Message
Int -> ReadS Message
ReadS [Message]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Message]
$creadListPrec :: ReadPrec [Message]
readPrec :: ReadPrec Message
$creadPrec :: ReadPrec Message
readList :: ReadS [Message]
$creadList :: ReadS [Message]
readsPrec :: Int -> ReadS Message
$creadsPrec :: Int -> ReadS Message
Prelude.Read, Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Message] -> ShowS
$cshowList :: [Message] -> ShowS
show :: Message -> String
$cshow :: Message -> String
showsPrec :: Int -> Message -> ShowS
$cshowsPrec :: Int -> Message -> ShowS
Prelude.Show, forall x. Rep Message x -> Message
forall x. Message -> Rep Message x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Message x -> Message
$cfrom :: forall x. Message -> Rep Message x
Prelude.Generic)

-- |
-- Create a value of 'Message' 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:
--
-- 'customPayload', 'message_customPayload' - A message in a custom format defined by the client application.
--
-- 'imageResponseCard', 'message_imageResponseCard' - A message that defines a response card that the client application can
-- show to the user.
--
-- 'plainTextMessage', 'message_plainTextMessage' - A message in plain text format.
--
-- 'ssmlMessage', 'message_ssmlMessage' - A message in Speech Synthesis Markup Language (SSML).
newMessage ::
  Message
newMessage :: Message
newMessage =
  Message'
    { $sel:customPayload:Message' :: Maybe CustomPayload
customPayload = forall a. Maybe a
Prelude.Nothing,
      $sel:imageResponseCard:Message' :: Maybe ImageResponseCard
imageResponseCard = forall a. Maybe a
Prelude.Nothing,
      $sel:plainTextMessage:Message' :: Maybe PlainTextMessage
plainTextMessage = forall a. Maybe a
Prelude.Nothing,
      $sel:ssmlMessage:Message' :: Maybe SSMLMessage
ssmlMessage = forall a. Maybe a
Prelude.Nothing
    }

-- | A message in a custom format defined by the client application.
message_customPayload :: Lens.Lens' Message (Prelude.Maybe CustomPayload)
message_customPayload :: Lens' Message (Maybe CustomPayload)
message_customPayload = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Message' {Maybe CustomPayload
customPayload :: Maybe CustomPayload
$sel:customPayload:Message' :: Message -> Maybe CustomPayload
customPayload} -> Maybe CustomPayload
customPayload) (\s :: Message
s@Message' {} Maybe CustomPayload
a -> Message
s {$sel:customPayload:Message' :: Maybe CustomPayload
customPayload = Maybe CustomPayload
a} :: Message)

-- | A message that defines a response card that the client application can
-- show to the user.
message_imageResponseCard :: Lens.Lens' Message (Prelude.Maybe ImageResponseCard)
message_imageResponseCard :: Lens' Message (Maybe ImageResponseCard)
message_imageResponseCard = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Message' {Maybe ImageResponseCard
imageResponseCard :: Maybe ImageResponseCard
$sel:imageResponseCard:Message' :: Message -> Maybe ImageResponseCard
imageResponseCard} -> Maybe ImageResponseCard
imageResponseCard) (\s :: Message
s@Message' {} Maybe ImageResponseCard
a -> Message
s {$sel:imageResponseCard:Message' :: Maybe ImageResponseCard
imageResponseCard = Maybe ImageResponseCard
a} :: Message)

-- | A message in plain text format.
message_plainTextMessage :: Lens.Lens' Message (Prelude.Maybe PlainTextMessage)
message_plainTextMessage :: Lens' Message (Maybe PlainTextMessage)
message_plainTextMessage = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Message' {Maybe PlainTextMessage
plainTextMessage :: Maybe PlainTextMessage
$sel:plainTextMessage:Message' :: Message -> Maybe PlainTextMessage
plainTextMessage} -> Maybe PlainTextMessage
plainTextMessage) (\s :: Message
s@Message' {} Maybe PlainTextMessage
a -> Message
s {$sel:plainTextMessage:Message' :: Maybe PlainTextMessage
plainTextMessage = Maybe PlainTextMessage
a} :: Message)

-- | A message in Speech Synthesis Markup Language (SSML).
message_ssmlMessage :: Lens.Lens' Message (Prelude.Maybe SSMLMessage)
message_ssmlMessage :: Lens' Message (Maybe SSMLMessage)
message_ssmlMessage = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Message' {Maybe SSMLMessage
ssmlMessage :: Maybe SSMLMessage
$sel:ssmlMessage:Message' :: Message -> Maybe SSMLMessage
ssmlMessage} -> Maybe SSMLMessage
ssmlMessage) (\s :: Message
s@Message' {} Maybe SSMLMessage
a -> Message
s {$sel:ssmlMessage:Message' :: Maybe SSMLMessage
ssmlMessage = Maybe SSMLMessage
a} :: Message)

instance Data.FromJSON Message where
  parseJSON :: Value -> Parser Message
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Message"
      ( \Object
x ->
          Maybe CustomPayload
-> Maybe ImageResponseCard
-> Maybe PlainTextMessage
-> Maybe SSMLMessage
-> Message
Message'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"customPayload")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"imageResponseCard")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"plainTextMessage")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"ssmlMessage")
      )

instance Prelude.Hashable Message where
  hashWithSalt :: Int -> Message -> Int
hashWithSalt Int
_salt Message' {Maybe CustomPayload
Maybe ImageResponseCard
Maybe PlainTextMessage
Maybe SSMLMessage
ssmlMessage :: Maybe SSMLMessage
plainTextMessage :: Maybe PlainTextMessage
imageResponseCard :: Maybe ImageResponseCard
customPayload :: Maybe CustomPayload
$sel:ssmlMessage:Message' :: Message -> Maybe SSMLMessage
$sel:plainTextMessage:Message' :: Message -> Maybe PlainTextMessage
$sel:imageResponseCard:Message' :: Message -> Maybe ImageResponseCard
$sel:customPayload:Message' :: Message -> Maybe CustomPayload
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CustomPayload
customPayload
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ImageResponseCard
imageResponseCard
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe PlainTextMessage
plainTextMessage
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SSMLMessage
ssmlMessage

instance Prelude.NFData Message where
  rnf :: Message -> ()
rnf Message' {Maybe CustomPayload
Maybe ImageResponseCard
Maybe PlainTextMessage
Maybe SSMLMessage
ssmlMessage :: Maybe SSMLMessage
plainTextMessage :: Maybe PlainTextMessage
imageResponseCard :: Maybe ImageResponseCard
customPayload :: Maybe CustomPayload
$sel:ssmlMessage:Message' :: Message -> Maybe SSMLMessage
$sel:plainTextMessage:Message' :: Message -> Maybe PlainTextMessage
$sel:imageResponseCard:Message' :: Message -> Maybe ImageResponseCard
$sel:customPayload:Message' :: Message -> Maybe CustomPayload
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe CustomPayload
customPayload
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ImageResponseCard
imageResponseCard
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe PlainTextMessage
plainTextMessage
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SSMLMessage
ssmlMessage

instance Data.ToJSON Message where
  toJSON :: Message -> Value
toJSON Message' {Maybe CustomPayload
Maybe ImageResponseCard
Maybe PlainTextMessage
Maybe SSMLMessage
ssmlMessage :: Maybe SSMLMessage
plainTextMessage :: Maybe PlainTextMessage
imageResponseCard :: Maybe ImageResponseCard
customPayload :: Maybe CustomPayload
$sel:ssmlMessage:Message' :: Message -> Maybe SSMLMessage
$sel:plainTextMessage:Message' :: Message -> Maybe PlainTextMessage
$sel:imageResponseCard:Message' :: Message -> Maybe ImageResponseCard
$sel:customPayload:Message' :: Message -> Maybe CustomPayload
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"customPayload" 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 CustomPayload
customPayload,
            (Key
"imageResponseCard" 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 ImageResponseCard
imageResponseCard,
            (Key
"plainTextMessage" 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 PlainTextMessage
plainTextMessage,
            (Key
"ssmlMessage" 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 SSMLMessage
ssmlMessage
          ]
      )