{-# 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.EC2.Types.VolumeStatusInfo
-- 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.EC2.Types.VolumeStatusInfo where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.EC2.Internal
import Amazonka.EC2.Types.VolumeStatusDetails
import Amazonka.EC2.Types.VolumeStatusInfoStatus
import qualified Amazonka.Prelude as Prelude

-- | Describes the status of a volume.
--
-- /See:/ 'newVolumeStatusInfo' smart constructor.
data VolumeStatusInfo = VolumeStatusInfo'
  { -- | The details of the volume status.
    VolumeStatusInfo -> Maybe [VolumeStatusDetails]
details :: Prelude.Maybe [VolumeStatusDetails],
    -- | The status of the volume.
    VolumeStatusInfo -> Maybe VolumeStatusInfoStatus
status :: Prelude.Maybe VolumeStatusInfoStatus
  }
  deriving (VolumeStatusInfo -> VolumeStatusInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: VolumeStatusInfo -> VolumeStatusInfo -> Bool
$c/= :: VolumeStatusInfo -> VolumeStatusInfo -> Bool
== :: VolumeStatusInfo -> VolumeStatusInfo -> Bool
$c== :: VolumeStatusInfo -> VolumeStatusInfo -> Bool
Prelude.Eq, ReadPrec [VolumeStatusInfo]
ReadPrec VolumeStatusInfo
Int -> ReadS VolumeStatusInfo
ReadS [VolumeStatusInfo]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [VolumeStatusInfo]
$creadListPrec :: ReadPrec [VolumeStatusInfo]
readPrec :: ReadPrec VolumeStatusInfo
$creadPrec :: ReadPrec VolumeStatusInfo
readList :: ReadS [VolumeStatusInfo]
$creadList :: ReadS [VolumeStatusInfo]
readsPrec :: Int -> ReadS VolumeStatusInfo
$creadsPrec :: Int -> ReadS VolumeStatusInfo
Prelude.Read, Int -> VolumeStatusInfo -> ShowS
[VolumeStatusInfo] -> ShowS
VolumeStatusInfo -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VolumeStatusInfo] -> ShowS
$cshowList :: [VolumeStatusInfo] -> ShowS
show :: VolumeStatusInfo -> String
$cshow :: VolumeStatusInfo -> String
showsPrec :: Int -> VolumeStatusInfo -> ShowS
$cshowsPrec :: Int -> VolumeStatusInfo -> ShowS
Prelude.Show, forall x. Rep VolumeStatusInfo x -> VolumeStatusInfo
forall x. VolumeStatusInfo -> Rep VolumeStatusInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep VolumeStatusInfo x -> VolumeStatusInfo
$cfrom :: forall x. VolumeStatusInfo -> Rep VolumeStatusInfo x
Prelude.Generic)

-- |
-- Create a value of 'VolumeStatusInfo' 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:
--
-- 'details', 'volumeStatusInfo_details' - The details of the volume status.
--
-- 'status', 'volumeStatusInfo_status' - The status of the volume.
newVolumeStatusInfo ::
  VolumeStatusInfo
newVolumeStatusInfo :: VolumeStatusInfo
newVolumeStatusInfo =
  VolumeStatusInfo'
    { $sel:details:VolumeStatusInfo' :: Maybe [VolumeStatusDetails]
details = forall a. Maybe a
Prelude.Nothing,
      $sel:status:VolumeStatusInfo' :: Maybe VolumeStatusInfoStatus
status = forall a. Maybe a
Prelude.Nothing
    }

-- | The details of the volume status.
volumeStatusInfo_details :: Lens.Lens' VolumeStatusInfo (Prelude.Maybe [VolumeStatusDetails])
volumeStatusInfo_details :: Lens' VolumeStatusInfo (Maybe [VolumeStatusDetails])
volumeStatusInfo_details = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\VolumeStatusInfo' {Maybe [VolumeStatusDetails]
details :: Maybe [VolumeStatusDetails]
$sel:details:VolumeStatusInfo' :: VolumeStatusInfo -> Maybe [VolumeStatusDetails]
details} -> Maybe [VolumeStatusDetails]
details) (\s :: VolumeStatusInfo
s@VolumeStatusInfo' {} Maybe [VolumeStatusDetails]
a -> VolumeStatusInfo
s {$sel:details:VolumeStatusInfo' :: Maybe [VolumeStatusDetails]
details = Maybe [VolumeStatusDetails]
a} :: VolumeStatusInfo) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The status of the volume.
volumeStatusInfo_status :: Lens.Lens' VolumeStatusInfo (Prelude.Maybe VolumeStatusInfoStatus)
volumeStatusInfo_status :: Lens' VolumeStatusInfo (Maybe VolumeStatusInfoStatus)
volumeStatusInfo_status = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\VolumeStatusInfo' {Maybe VolumeStatusInfoStatus
status :: Maybe VolumeStatusInfoStatus
$sel:status:VolumeStatusInfo' :: VolumeStatusInfo -> Maybe VolumeStatusInfoStatus
status} -> Maybe VolumeStatusInfoStatus
status) (\s :: VolumeStatusInfo
s@VolumeStatusInfo' {} Maybe VolumeStatusInfoStatus
a -> VolumeStatusInfo
s {$sel:status:VolumeStatusInfo' :: Maybe VolumeStatusInfoStatus
status = Maybe VolumeStatusInfoStatus
a} :: VolumeStatusInfo)

instance Data.FromXML VolumeStatusInfo where
  parseXML :: [Node] -> Either String VolumeStatusInfo
parseXML [Node]
x =
    Maybe [VolumeStatusDetails]
-> Maybe VolumeStatusInfoStatus -> VolumeStatusInfo
VolumeStatusInfo'
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> ( [Node]
x
                      forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"details"
                      forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                      forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
Prelude.>>= forall (f :: * -> *) a b.
Applicative f =>
([a] -> f b) -> [a] -> f (Maybe b)
Core.may (forall a. FromXML a => Text -> [Node] -> Either String [a]
Data.parseXMLList Text
"item")
                  )
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"status")

instance Prelude.Hashable VolumeStatusInfo where
  hashWithSalt :: Int -> VolumeStatusInfo -> Int
hashWithSalt Int
_salt VolumeStatusInfo' {Maybe [VolumeStatusDetails]
Maybe VolumeStatusInfoStatus
status :: Maybe VolumeStatusInfoStatus
details :: Maybe [VolumeStatusDetails]
$sel:status:VolumeStatusInfo' :: VolumeStatusInfo -> Maybe VolumeStatusInfoStatus
$sel:details:VolumeStatusInfo' :: VolumeStatusInfo -> Maybe [VolumeStatusDetails]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [VolumeStatusDetails]
details
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe VolumeStatusInfoStatus
status

instance Prelude.NFData VolumeStatusInfo where
  rnf :: VolumeStatusInfo -> ()
rnf VolumeStatusInfo' {Maybe [VolumeStatusDetails]
Maybe VolumeStatusInfoStatus
status :: Maybe VolumeStatusInfoStatus
details :: Maybe [VolumeStatusDetails]
$sel:status:VolumeStatusInfo' :: VolumeStatusInfo -> Maybe VolumeStatusInfoStatus
$sel:details:VolumeStatusInfo' :: VolumeStatusInfo -> Maybe [VolumeStatusDetails]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [VolumeStatusDetails]
details
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe VolumeStatusInfoStatus
status