{-# 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.DiskImage
-- 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.DiskImage 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.DiskImageDetail
import Amazonka.EC2.Types.VolumeDetail
import qualified Amazonka.Prelude as Prelude

-- | Describes a disk image.
--
-- /See:/ 'newDiskImage' smart constructor.
data DiskImage = DiskImage'
  { -- | A description of the disk image.
    DiskImage -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | Information about the disk image.
    DiskImage -> Maybe DiskImageDetail
image :: Prelude.Maybe DiskImageDetail,
    -- | Information about the volume.
    DiskImage -> Maybe VolumeDetail
volume :: Prelude.Maybe VolumeDetail
  }
  deriving (DiskImage -> DiskImage -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DiskImage -> DiskImage -> Bool
$c/= :: DiskImage -> DiskImage -> Bool
== :: DiskImage -> DiskImage -> Bool
$c== :: DiskImage -> DiskImage -> Bool
Prelude.Eq, ReadPrec [DiskImage]
ReadPrec DiskImage
Int -> ReadS DiskImage
ReadS [DiskImage]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DiskImage]
$creadListPrec :: ReadPrec [DiskImage]
readPrec :: ReadPrec DiskImage
$creadPrec :: ReadPrec DiskImage
readList :: ReadS [DiskImage]
$creadList :: ReadS [DiskImage]
readsPrec :: Int -> ReadS DiskImage
$creadsPrec :: Int -> ReadS DiskImage
Prelude.Read, Int -> DiskImage -> ShowS
[DiskImage] -> ShowS
DiskImage -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DiskImage] -> ShowS
$cshowList :: [DiskImage] -> ShowS
show :: DiskImage -> String
$cshow :: DiskImage -> String
showsPrec :: Int -> DiskImage -> ShowS
$cshowsPrec :: Int -> DiskImage -> ShowS
Prelude.Show, forall x. Rep DiskImage x -> DiskImage
forall x. DiskImage -> Rep DiskImage x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DiskImage x -> DiskImage
$cfrom :: forall x. DiskImage -> Rep DiskImage x
Prelude.Generic)

-- |
-- Create a value of 'DiskImage' 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', 'diskImage_description' - A description of the disk image.
--
-- 'image', 'diskImage_image' - Information about the disk image.
--
-- 'volume', 'diskImage_volume' - Information about the volume.
newDiskImage ::
  DiskImage
newDiskImage :: DiskImage
newDiskImage =
  DiskImage'
    { $sel:description:DiskImage' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
      $sel:image:DiskImage' :: Maybe DiskImageDetail
image = forall a. Maybe a
Prelude.Nothing,
      $sel:volume:DiskImage' :: Maybe VolumeDetail
volume = forall a. Maybe a
Prelude.Nothing
    }

-- | A description of the disk image.
diskImage_description :: Lens.Lens' DiskImage (Prelude.Maybe Prelude.Text)
diskImage_description :: Lens' DiskImage (Maybe Text)
diskImage_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DiskImage' {Maybe Text
description :: Maybe Text
$sel:description:DiskImage' :: DiskImage -> Maybe Text
description} -> Maybe Text
description) (\s :: DiskImage
s@DiskImage' {} Maybe Text
a -> DiskImage
s {$sel:description:DiskImage' :: Maybe Text
description = Maybe Text
a} :: DiskImage)

-- | Information about the disk image.
diskImage_image :: Lens.Lens' DiskImage (Prelude.Maybe DiskImageDetail)
diskImage_image :: Lens' DiskImage (Maybe DiskImageDetail)
diskImage_image = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DiskImage' {Maybe DiskImageDetail
image :: Maybe DiskImageDetail
$sel:image:DiskImage' :: DiskImage -> Maybe DiskImageDetail
image} -> Maybe DiskImageDetail
image) (\s :: DiskImage
s@DiskImage' {} Maybe DiskImageDetail
a -> DiskImage
s {$sel:image:DiskImage' :: Maybe DiskImageDetail
image = Maybe DiskImageDetail
a} :: DiskImage)

-- | Information about the volume.
diskImage_volume :: Lens.Lens' DiskImage (Prelude.Maybe VolumeDetail)
diskImage_volume :: Lens' DiskImage (Maybe VolumeDetail)
diskImage_volume = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DiskImage' {Maybe VolumeDetail
volume :: Maybe VolumeDetail
$sel:volume:DiskImage' :: DiskImage -> Maybe VolumeDetail
volume} -> Maybe VolumeDetail
volume) (\s :: DiskImage
s@DiskImage' {} Maybe VolumeDetail
a -> DiskImage
s {$sel:volume:DiskImage' :: Maybe VolumeDetail
volume = Maybe VolumeDetail
a} :: DiskImage)

instance Prelude.Hashable DiskImage where
  hashWithSalt :: Int -> DiskImage -> Int
hashWithSalt Int
_salt DiskImage' {Maybe Text
Maybe DiskImageDetail
Maybe VolumeDetail
volume :: Maybe VolumeDetail
image :: Maybe DiskImageDetail
description :: Maybe Text
$sel:volume:DiskImage' :: DiskImage -> Maybe VolumeDetail
$sel:image:DiskImage' :: DiskImage -> Maybe DiskImageDetail
$sel:description:DiskImage' :: DiskImage -> 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` Maybe DiskImageDetail
image
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe VolumeDetail
volume

instance Prelude.NFData DiskImage where
  rnf :: DiskImage -> ()
rnf DiskImage' {Maybe Text
Maybe DiskImageDetail
Maybe VolumeDetail
volume :: Maybe VolumeDetail
image :: Maybe DiskImageDetail
description :: Maybe Text
$sel:volume:DiskImage' :: DiskImage -> Maybe VolumeDetail
$sel:image:DiskImage' :: DiskImage -> Maybe DiskImageDetail
$sel:description:DiskImage' :: DiskImage -> 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 Maybe DiskImageDetail
image
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe VolumeDetail
volume

instance Data.ToQuery DiskImage where
  toQuery :: DiskImage -> QueryString
toQuery DiskImage' {Maybe Text
Maybe DiskImageDetail
Maybe VolumeDetail
volume :: Maybe VolumeDetail
image :: Maybe DiskImageDetail
description :: Maybe Text
$sel:volume:DiskImage' :: DiskImage -> Maybe VolumeDetail
$sel:image:DiskImage' :: DiskImage -> Maybe DiskImageDetail
$sel:description:DiskImage' :: DiskImage -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Description" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe Text
description,
        ByteString
"Image" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe DiskImageDetail
image,
        ByteString
"Volume" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe VolumeDetail
volume
      ]