{-# 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.ChimeSdkMeetings.Types.AttendeeCapabilities
-- 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.ChimeSdkMeetings.Types.AttendeeCapabilities where

import Amazonka.ChimeSdkMeetings.Types.MediaCapabilities
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

-- | The media capabilities of an attendee: audio, video, or content.
--
-- You use the capabilities with a set of values that control what the
-- capabilities can do, such as @SendReceive@ data. For more information
-- about those values, see .
--
-- When using capabilities, be aware of these corner cases:
--
-- -   You can\'t set @content@ capabilities to @SendReceive@ or @Receive@
--     unless you also set @video@ capabilities to @SendReceive@ or
--     @Receive@. If you don\'t set the @video@ capability to receive, the
--     response will contain an HTTP 400 Bad Request status code. However,
--     you can set your @video@ capability to receive and you set your
--     @content@ capability to not receive.
--
-- -   When you change an @audio@ capability from @None@ or @Receive@ to
--     @Send@ or @SendReceive@ , and if the attendee left their microphone
--     unmuted, audio will flow from the attendee to the other meeting
--     participants.
--
-- -   When you change a @video@ or @content@ capability from @None@ or
--     @Receive@ to @Send@ or @SendReceive@ , and if the attendee turned on
--     their video or content streams, remote attendess can receive those
--     streams, but only after media renegotiation between the client and
--     the Amazon Chime back-end server.
--
-- /See:/ 'newAttendeeCapabilities' smart constructor.
data AttendeeCapabilities = AttendeeCapabilities'
  { -- | The audio capability assigned to an attendee.
    AttendeeCapabilities -> MediaCapabilities
audio :: MediaCapabilities,
    -- | The video capability assigned to an attendee.
    AttendeeCapabilities -> MediaCapabilities
video :: MediaCapabilities,
    -- | The content capability assigned to an attendee.
    AttendeeCapabilities -> MediaCapabilities
content :: MediaCapabilities
  }
  deriving (AttendeeCapabilities -> AttendeeCapabilities -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AttendeeCapabilities -> AttendeeCapabilities -> Bool
$c/= :: AttendeeCapabilities -> AttendeeCapabilities -> Bool
== :: AttendeeCapabilities -> AttendeeCapabilities -> Bool
$c== :: AttendeeCapabilities -> AttendeeCapabilities -> Bool
Prelude.Eq, ReadPrec [AttendeeCapabilities]
ReadPrec AttendeeCapabilities
Int -> ReadS AttendeeCapabilities
ReadS [AttendeeCapabilities]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AttendeeCapabilities]
$creadListPrec :: ReadPrec [AttendeeCapabilities]
readPrec :: ReadPrec AttendeeCapabilities
$creadPrec :: ReadPrec AttendeeCapabilities
readList :: ReadS [AttendeeCapabilities]
$creadList :: ReadS [AttendeeCapabilities]
readsPrec :: Int -> ReadS AttendeeCapabilities
$creadsPrec :: Int -> ReadS AttendeeCapabilities
Prelude.Read, Int -> AttendeeCapabilities -> ShowS
[AttendeeCapabilities] -> ShowS
AttendeeCapabilities -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AttendeeCapabilities] -> ShowS
$cshowList :: [AttendeeCapabilities] -> ShowS
show :: AttendeeCapabilities -> String
$cshow :: AttendeeCapabilities -> String
showsPrec :: Int -> AttendeeCapabilities -> ShowS
$cshowsPrec :: Int -> AttendeeCapabilities -> ShowS
Prelude.Show, forall x. Rep AttendeeCapabilities x -> AttendeeCapabilities
forall x. AttendeeCapabilities -> Rep AttendeeCapabilities x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AttendeeCapabilities x -> AttendeeCapabilities
$cfrom :: forall x. AttendeeCapabilities -> Rep AttendeeCapabilities x
Prelude.Generic)

-- |
-- Create a value of 'AttendeeCapabilities' 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:
--
-- 'audio', 'attendeeCapabilities_audio' - The audio capability assigned to an attendee.
--
-- 'video', 'attendeeCapabilities_video' - The video capability assigned to an attendee.
--
-- 'content', 'attendeeCapabilities_content' - The content capability assigned to an attendee.
newAttendeeCapabilities ::
  -- | 'audio'
  MediaCapabilities ->
  -- | 'video'
  MediaCapabilities ->
  -- | 'content'
  MediaCapabilities ->
  AttendeeCapabilities
newAttendeeCapabilities :: MediaCapabilities
-> MediaCapabilities -> MediaCapabilities -> AttendeeCapabilities
newAttendeeCapabilities MediaCapabilities
pAudio_ MediaCapabilities
pVideo_ MediaCapabilities
pContent_ =
  AttendeeCapabilities'
    { $sel:audio:AttendeeCapabilities' :: MediaCapabilities
audio = MediaCapabilities
pAudio_,
      $sel:video:AttendeeCapabilities' :: MediaCapabilities
video = MediaCapabilities
pVideo_,
      $sel:content:AttendeeCapabilities' :: MediaCapabilities
content = MediaCapabilities
pContent_
    }

-- | The audio capability assigned to an attendee.
attendeeCapabilities_audio :: Lens.Lens' AttendeeCapabilities MediaCapabilities
attendeeCapabilities_audio :: Lens' AttendeeCapabilities MediaCapabilities
attendeeCapabilities_audio = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AttendeeCapabilities' {MediaCapabilities
audio :: MediaCapabilities
$sel:audio:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
audio} -> MediaCapabilities
audio) (\s :: AttendeeCapabilities
s@AttendeeCapabilities' {} MediaCapabilities
a -> AttendeeCapabilities
s {$sel:audio:AttendeeCapabilities' :: MediaCapabilities
audio = MediaCapabilities
a} :: AttendeeCapabilities)

-- | The video capability assigned to an attendee.
attendeeCapabilities_video :: Lens.Lens' AttendeeCapabilities MediaCapabilities
attendeeCapabilities_video :: Lens' AttendeeCapabilities MediaCapabilities
attendeeCapabilities_video = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AttendeeCapabilities' {MediaCapabilities
video :: MediaCapabilities
$sel:video:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
video} -> MediaCapabilities
video) (\s :: AttendeeCapabilities
s@AttendeeCapabilities' {} MediaCapabilities
a -> AttendeeCapabilities
s {$sel:video:AttendeeCapabilities' :: MediaCapabilities
video = MediaCapabilities
a} :: AttendeeCapabilities)

-- | The content capability assigned to an attendee.
attendeeCapabilities_content :: Lens.Lens' AttendeeCapabilities MediaCapabilities
attendeeCapabilities_content :: Lens' AttendeeCapabilities MediaCapabilities
attendeeCapabilities_content = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AttendeeCapabilities' {MediaCapabilities
content :: MediaCapabilities
$sel:content:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
content} -> MediaCapabilities
content) (\s :: AttendeeCapabilities
s@AttendeeCapabilities' {} MediaCapabilities
a -> AttendeeCapabilities
s {$sel:content:AttendeeCapabilities' :: MediaCapabilities
content = MediaCapabilities
a} :: AttendeeCapabilities)

instance Data.FromJSON AttendeeCapabilities where
  parseJSON :: Value -> Parser AttendeeCapabilities
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"AttendeeCapabilities"
      ( \Object
x ->
          MediaCapabilities
-> MediaCapabilities -> MediaCapabilities -> AttendeeCapabilities
AttendeeCapabilities'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"Audio")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"Video")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"Content")
      )

instance Prelude.Hashable AttendeeCapabilities where
  hashWithSalt :: Int -> AttendeeCapabilities -> Int
hashWithSalt Int
_salt AttendeeCapabilities' {MediaCapabilities
content :: MediaCapabilities
video :: MediaCapabilities
audio :: MediaCapabilities
$sel:content:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
$sel:video:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
$sel:audio:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` MediaCapabilities
audio
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` MediaCapabilities
video
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` MediaCapabilities
content

instance Prelude.NFData AttendeeCapabilities where
  rnf :: AttendeeCapabilities -> ()
rnf AttendeeCapabilities' {MediaCapabilities
content :: MediaCapabilities
video :: MediaCapabilities
audio :: MediaCapabilities
$sel:content:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
$sel:video:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
$sel:audio:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
..} =
    forall a. NFData a => a -> ()
Prelude.rnf MediaCapabilities
audio
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf MediaCapabilities
video
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf MediaCapabilities
content

instance Data.ToJSON AttendeeCapabilities where
  toJSON :: AttendeeCapabilities -> Value
toJSON AttendeeCapabilities' {MediaCapabilities
content :: MediaCapabilities
video :: MediaCapabilities
audio :: MediaCapabilities
$sel:content:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
$sel:video:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
$sel:audio:AttendeeCapabilities' :: AttendeeCapabilities -> MediaCapabilities
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"Audio" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= MediaCapabilities
audio),
            forall a. a -> Maybe a
Prelude.Just (Key
"Video" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= MediaCapabilities
video),
            forall a. a -> Maybe a
Prelude.Just (Key
"Content" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= MediaCapabilities
content)
          ]
      )