{-# 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.EMR.Types.InstanceStatus
-- 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.EMR.Types.InstanceStatus where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.EMR.Types.InstanceState
import Amazonka.EMR.Types.InstanceStateChangeReason
import Amazonka.EMR.Types.InstanceTimeline
import qualified Amazonka.Prelude as Prelude

-- | The instance status details.
--
-- /See:/ 'newInstanceStatus' smart constructor.
data InstanceStatus = InstanceStatus'
  { -- | The current state of the instance.
    InstanceStatus -> Maybe InstanceState
state :: Prelude.Maybe InstanceState,
    -- | The details of the status change reason for the instance.
    InstanceStatus -> Maybe InstanceStateChangeReason
stateChangeReason :: Prelude.Maybe InstanceStateChangeReason,
    -- | The timeline of the instance status over time.
    InstanceStatus -> Maybe InstanceTimeline
timeline :: Prelude.Maybe InstanceTimeline
  }
  deriving (InstanceStatus -> InstanceStatus -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InstanceStatus -> InstanceStatus -> Bool
$c/= :: InstanceStatus -> InstanceStatus -> Bool
== :: InstanceStatus -> InstanceStatus -> Bool
$c== :: InstanceStatus -> InstanceStatus -> Bool
Prelude.Eq, ReadPrec [InstanceStatus]
ReadPrec InstanceStatus
Int -> ReadS InstanceStatus
ReadS [InstanceStatus]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [InstanceStatus]
$creadListPrec :: ReadPrec [InstanceStatus]
readPrec :: ReadPrec InstanceStatus
$creadPrec :: ReadPrec InstanceStatus
readList :: ReadS [InstanceStatus]
$creadList :: ReadS [InstanceStatus]
readsPrec :: Int -> ReadS InstanceStatus
$creadsPrec :: Int -> ReadS InstanceStatus
Prelude.Read, Int -> InstanceStatus -> ShowS
[InstanceStatus] -> ShowS
InstanceStatus -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InstanceStatus] -> ShowS
$cshowList :: [InstanceStatus] -> ShowS
show :: InstanceStatus -> String
$cshow :: InstanceStatus -> String
showsPrec :: Int -> InstanceStatus -> ShowS
$cshowsPrec :: Int -> InstanceStatus -> ShowS
Prelude.Show, forall x. Rep InstanceStatus x -> InstanceStatus
forall x. InstanceStatus -> Rep InstanceStatus x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InstanceStatus x -> InstanceStatus
$cfrom :: forall x. InstanceStatus -> Rep InstanceStatus x
Prelude.Generic)

-- |
-- Create a value of 'InstanceStatus' 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:
--
-- 'state', 'instanceStatus_state' - The current state of the instance.
--
-- 'stateChangeReason', 'instanceStatus_stateChangeReason' - The details of the status change reason for the instance.
--
-- 'timeline', 'instanceStatus_timeline' - The timeline of the instance status over time.
newInstanceStatus ::
  InstanceStatus
newInstanceStatus :: InstanceStatus
newInstanceStatus =
  InstanceStatus'
    { $sel:state:InstanceStatus' :: Maybe InstanceState
state = forall a. Maybe a
Prelude.Nothing,
      $sel:stateChangeReason:InstanceStatus' :: Maybe InstanceStateChangeReason
stateChangeReason = forall a. Maybe a
Prelude.Nothing,
      $sel:timeline:InstanceStatus' :: Maybe InstanceTimeline
timeline = forall a. Maybe a
Prelude.Nothing
    }

-- | The current state of the instance.
instanceStatus_state :: Lens.Lens' InstanceStatus (Prelude.Maybe InstanceState)
instanceStatus_state :: Lens' InstanceStatus (Maybe InstanceState)
instanceStatus_state = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceStatus' {Maybe InstanceState
state :: Maybe InstanceState
$sel:state:InstanceStatus' :: InstanceStatus -> Maybe InstanceState
state} -> Maybe InstanceState
state) (\s :: InstanceStatus
s@InstanceStatus' {} Maybe InstanceState
a -> InstanceStatus
s {$sel:state:InstanceStatus' :: Maybe InstanceState
state = Maybe InstanceState
a} :: InstanceStatus)

-- | The details of the status change reason for the instance.
instanceStatus_stateChangeReason :: Lens.Lens' InstanceStatus (Prelude.Maybe InstanceStateChangeReason)
instanceStatus_stateChangeReason :: Lens' InstanceStatus (Maybe InstanceStateChangeReason)
instanceStatus_stateChangeReason = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceStatus' {Maybe InstanceStateChangeReason
stateChangeReason :: Maybe InstanceStateChangeReason
$sel:stateChangeReason:InstanceStatus' :: InstanceStatus -> Maybe InstanceStateChangeReason
stateChangeReason} -> Maybe InstanceStateChangeReason
stateChangeReason) (\s :: InstanceStatus
s@InstanceStatus' {} Maybe InstanceStateChangeReason
a -> InstanceStatus
s {$sel:stateChangeReason:InstanceStatus' :: Maybe InstanceStateChangeReason
stateChangeReason = Maybe InstanceStateChangeReason
a} :: InstanceStatus)

-- | The timeline of the instance status over time.
instanceStatus_timeline :: Lens.Lens' InstanceStatus (Prelude.Maybe InstanceTimeline)
instanceStatus_timeline :: Lens' InstanceStatus (Maybe InstanceTimeline)
instanceStatus_timeline = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InstanceStatus' {Maybe InstanceTimeline
timeline :: Maybe InstanceTimeline
$sel:timeline:InstanceStatus' :: InstanceStatus -> Maybe InstanceTimeline
timeline} -> Maybe InstanceTimeline
timeline) (\s :: InstanceStatus
s@InstanceStatus' {} Maybe InstanceTimeline
a -> InstanceStatus
s {$sel:timeline:InstanceStatus' :: Maybe InstanceTimeline
timeline = Maybe InstanceTimeline
a} :: InstanceStatus)

instance Data.FromJSON InstanceStatus where
  parseJSON :: Value -> Parser InstanceStatus
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"InstanceStatus"
      ( \Object
x ->
          Maybe InstanceState
-> Maybe InstanceStateChangeReason
-> Maybe InstanceTimeline
-> InstanceStatus
InstanceStatus'
            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
"State")
            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
"StateChangeReason")
            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
"Timeline")
      )

instance Prelude.Hashable InstanceStatus where
  hashWithSalt :: Int -> InstanceStatus -> Int
hashWithSalt Int
_salt InstanceStatus' {Maybe InstanceState
Maybe InstanceStateChangeReason
Maybe InstanceTimeline
timeline :: Maybe InstanceTimeline
stateChangeReason :: Maybe InstanceStateChangeReason
state :: Maybe InstanceState
$sel:timeline:InstanceStatus' :: InstanceStatus -> Maybe InstanceTimeline
$sel:stateChangeReason:InstanceStatus' :: InstanceStatus -> Maybe InstanceStateChangeReason
$sel:state:InstanceStatus' :: InstanceStatus -> Maybe InstanceState
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe InstanceState
state
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe InstanceStateChangeReason
stateChangeReason
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe InstanceTimeline
timeline

instance Prelude.NFData InstanceStatus where
  rnf :: InstanceStatus -> ()
rnf InstanceStatus' {Maybe InstanceState
Maybe InstanceStateChangeReason
Maybe InstanceTimeline
timeline :: Maybe InstanceTimeline
stateChangeReason :: Maybe InstanceStateChangeReason
state :: Maybe InstanceState
$sel:timeline:InstanceStatus' :: InstanceStatus -> Maybe InstanceTimeline
$sel:stateChangeReason:InstanceStatus' :: InstanceStatus -> Maybe InstanceStateChangeReason
$sel:state:InstanceStatus' :: InstanceStatus -> Maybe InstanceState
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe InstanceState
state
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe InstanceStateChangeReason
stateChangeReason
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe InstanceTimeline
timeline