{-# 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.S3.Types.ObjectVersion
-- 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.S3.Types.ObjectVersion where

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
import Amazonka.S3.Internal
import Amazonka.S3.Types.ChecksumAlgorithm
import Amazonka.S3.Types.ObjectVersionStorageClass
import Amazonka.S3.Types.Owner

-- | The version of an object.
--
-- /See:/ 'newObjectVersion' smart constructor.
data ObjectVersion = ObjectVersion'
  { -- | The algorithm that was used to create a checksum of the object.
    ObjectVersion -> Maybe [ChecksumAlgorithm]
checksumAlgorithm :: Prelude.Maybe [ChecksumAlgorithm],
    -- | The entity tag is an MD5 hash of that version of the object.
    ObjectVersion -> Maybe ETag
eTag :: Prelude.Maybe ETag,
    -- | Specifies whether the object is (true) or is not (false) the latest
    -- version of an object.
    ObjectVersion -> Maybe Bool
isLatest :: Prelude.Maybe Prelude.Bool,
    -- | The object key.
    ObjectVersion -> Maybe ObjectKey
key :: Prelude.Maybe ObjectKey,
    -- | Date and time the object was last modified.
    ObjectVersion -> Maybe RFC822
lastModified :: Prelude.Maybe Data.RFC822,
    -- | Specifies the owner of the object.
    ObjectVersion -> Maybe Owner
owner :: Prelude.Maybe Owner,
    -- | Size in bytes of the object.
    ObjectVersion -> Maybe Integer
size :: Prelude.Maybe Prelude.Integer,
    -- | The class of storage used to store the object.
    ObjectVersion -> Maybe ObjectVersionStorageClass
storageClass :: Prelude.Maybe ObjectVersionStorageClass,
    -- | Version ID of an object.
    ObjectVersion -> Maybe ObjectVersionId
versionId :: Prelude.Maybe ObjectVersionId
  }
  deriving (ObjectVersion -> ObjectVersion -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ObjectVersion -> ObjectVersion -> Bool
$c/= :: ObjectVersion -> ObjectVersion -> Bool
== :: ObjectVersion -> ObjectVersion -> Bool
$c== :: ObjectVersion -> ObjectVersion -> Bool
Prelude.Eq, ReadPrec [ObjectVersion]
ReadPrec ObjectVersion
Int -> ReadS ObjectVersion
ReadS [ObjectVersion]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ObjectVersion]
$creadListPrec :: ReadPrec [ObjectVersion]
readPrec :: ReadPrec ObjectVersion
$creadPrec :: ReadPrec ObjectVersion
readList :: ReadS [ObjectVersion]
$creadList :: ReadS [ObjectVersion]
readsPrec :: Int -> ReadS ObjectVersion
$creadsPrec :: Int -> ReadS ObjectVersion
Prelude.Read, Int -> ObjectVersion -> ShowS
[ObjectVersion] -> ShowS
ObjectVersion -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ObjectVersion] -> ShowS
$cshowList :: [ObjectVersion] -> ShowS
show :: ObjectVersion -> String
$cshow :: ObjectVersion -> String
showsPrec :: Int -> ObjectVersion -> ShowS
$cshowsPrec :: Int -> ObjectVersion -> ShowS
Prelude.Show, forall x. Rep ObjectVersion x -> ObjectVersion
forall x. ObjectVersion -> Rep ObjectVersion x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ObjectVersion x -> ObjectVersion
$cfrom :: forall x. ObjectVersion -> Rep ObjectVersion x
Prelude.Generic)

-- |
-- Create a value of 'ObjectVersion' 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:
--
-- 'checksumAlgorithm', 'objectVersion_checksumAlgorithm' - The algorithm that was used to create a checksum of the object.
--
-- 'eTag', 'objectVersion_eTag' - The entity tag is an MD5 hash of that version of the object.
--
-- 'isLatest', 'objectVersion_isLatest' - Specifies whether the object is (true) or is not (false) the latest
-- version of an object.
--
-- 'key', 'objectVersion_key' - The object key.
--
-- 'lastModified', 'objectVersion_lastModified' - Date and time the object was last modified.
--
-- 'owner', 'objectVersion_owner' - Specifies the owner of the object.
--
-- 'size', 'objectVersion_size' - Size in bytes of the object.
--
-- 'storageClass', 'objectVersion_storageClass' - The class of storage used to store the object.
--
-- 'versionId', 'objectVersion_versionId' - Version ID of an object.
newObjectVersion ::
  ObjectVersion
newObjectVersion :: ObjectVersion
newObjectVersion =
  ObjectVersion'
    { $sel:checksumAlgorithm:ObjectVersion' :: Maybe [ChecksumAlgorithm]
checksumAlgorithm = forall a. Maybe a
Prelude.Nothing,
      $sel:eTag:ObjectVersion' :: Maybe ETag
eTag = forall a. Maybe a
Prelude.Nothing,
      $sel:isLatest:ObjectVersion' :: Maybe Bool
isLatest = forall a. Maybe a
Prelude.Nothing,
      $sel:key:ObjectVersion' :: Maybe ObjectKey
key = forall a. Maybe a
Prelude.Nothing,
      $sel:lastModified:ObjectVersion' :: Maybe RFC822
lastModified = forall a. Maybe a
Prelude.Nothing,
      $sel:owner:ObjectVersion' :: Maybe Owner
owner = forall a. Maybe a
Prelude.Nothing,
      $sel:size:ObjectVersion' :: Maybe Integer
size = forall a. Maybe a
Prelude.Nothing,
      $sel:storageClass:ObjectVersion' :: Maybe ObjectVersionStorageClass
storageClass = forall a. Maybe a
Prelude.Nothing,
      $sel:versionId:ObjectVersion' :: Maybe ObjectVersionId
versionId = forall a. Maybe a
Prelude.Nothing
    }

-- | The algorithm that was used to create a checksum of the object.
objectVersion_checksumAlgorithm :: Lens.Lens' ObjectVersion (Prelude.Maybe [ChecksumAlgorithm])
objectVersion_checksumAlgorithm :: Lens' ObjectVersion (Maybe [ChecksumAlgorithm])
objectVersion_checksumAlgorithm = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe [ChecksumAlgorithm]
checksumAlgorithm :: Maybe [ChecksumAlgorithm]
$sel:checksumAlgorithm:ObjectVersion' :: ObjectVersion -> Maybe [ChecksumAlgorithm]
checksumAlgorithm} -> Maybe [ChecksumAlgorithm]
checksumAlgorithm) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe [ChecksumAlgorithm]
a -> ObjectVersion
s {$sel:checksumAlgorithm:ObjectVersion' :: Maybe [ChecksumAlgorithm]
checksumAlgorithm = Maybe [ChecksumAlgorithm]
a} :: ObjectVersion) 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 entity tag is an MD5 hash of that version of the object.
objectVersion_eTag :: Lens.Lens' ObjectVersion (Prelude.Maybe ETag)
objectVersion_eTag :: Lens' ObjectVersion (Maybe ETag)
objectVersion_eTag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe ETag
eTag :: Maybe ETag
$sel:eTag:ObjectVersion' :: ObjectVersion -> Maybe ETag
eTag} -> Maybe ETag
eTag) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe ETag
a -> ObjectVersion
s {$sel:eTag:ObjectVersion' :: Maybe ETag
eTag = Maybe ETag
a} :: ObjectVersion)

-- | Specifies whether the object is (true) or is not (false) the latest
-- version of an object.
objectVersion_isLatest :: Lens.Lens' ObjectVersion (Prelude.Maybe Prelude.Bool)
objectVersion_isLatest :: Lens' ObjectVersion (Maybe Bool)
objectVersion_isLatest = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe Bool
isLatest :: Maybe Bool
$sel:isLatest:ObjectVersion' :: ObjectVersion -> Maybe Bool
isLatest} -> Maybe Bool
isLatest) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe Bool
a -> ObjectVersion
s {$sel:isLatest:ObjectVersion' :: Maybe Bool
isLatest = Maybe Bool
a} :: ObjectVersion)

-- | The object key.
objectVersion_key :: Lens.Lens' ObjectVersion (Prelude.Maybe ObjectKey)
objectVersion_key :: Lens' ObjectVersion (Maybe ObjectKey)
objectVersion_key = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe ObjectKey
key :: Maybe ObjectKey
$sel:key:ObjectVersion' :: ObjectVersion -> Maybe ObjectKey
key} -> Maybe ObjectKey
key) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe ObjectKey
a -> ObjectVersion
s {$sel:key:ObjectVersion' :: Maybe ObjectKey
key = Maybe ObjectKey
a} :: ObjectVersion)

-- | Date and time the object was last modified.
objectVersion_lastModified :: Lens.Lens' ObjectVersion (Prelude.Maybe Prelude.UTCTime)
objectVersion_lastModified :: Lens' ObjectVersion (Maybe UTCTime)
objectVersion_lastModified = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe RFC822
lastModified :: Maybe RFC822
$sel:lastModified:ObjectVersion' :: ObjectVersion -> Maybe RFC822
lastModified} -> Maybe RFC822
lastModified) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe RFC822
a -> ObjectVersion
s {$sel:lastModified:ObjectVersion' :: Maybe RFC822
lastModified = Maybe RFC822
a} :: ObjectVersion) 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 (a :: Format). Iso' (Time a) UTCTime
Data._Time

-- | Specifies the owner of the object.
objectVersion_owner :: Lens.Lens' ObjectVersion (Prelude.Maybe Owner)
objectVersion_owner :: Lens' ObjectVersion (Maybe Owner)
objectVersion_owner = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe Owner
owner :: Maybe Owner
$sel:owner:ObjectVersion' :: ObjectVersion -> Maybe Owner
owner} -> Maybe Owner
owner) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe Owner
a -> ObjectVersion
s {$sel:owner:ObjectVersion' :: Maybe Owner
owner = Maybe Owner
a} :: ObjectVersion)

-- | Size in bytes of the object.
objectVersion_size :: Lens.Lens' ObjectVersion (Prelude.Maybe Prelude.Integer)
objectVersion_size :: Lens' ObjectVersion (Maybe Integer)
objectVersion_size = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe Integer
size :: Maybe Integer
$sel:size:ObjectVersion' :: ObjectVersion -> Maybe Integer
size} -> Maybe Integer
size) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe Integer
a -> ObjectVersion
s {$sel:size:ObjectVersion' :: Maybe Integer
size = Maybe Integer
a} :: ObjectVersion)

-- | The class of storage used to store the object.
objectVersion_storageClass :: Lens.Lens' ObjectVersion (Prelude.Maybe ObjectVersionStorageClass)
objectVersion_storageClass :: Lens' ObjectVersion (Maybe ObjectVersionStorageClass)
objectVersion_storageClass = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe ObjectVersionStorageClass
storageClass :: Maybe ObjectVersionStorageClass
$sel:storageClass:ObjectVersion' :: ObjectVersion -> Maybe ObjectVersionStorageClass
storageClass} -> Maybe ObjectVersionStorageClass
storageClass) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe ObjectVersionStorageClass
a -> ObjectVersion
s {$sel:storageClass:ObjectVersion' :: Maybe ObjectVersionStorageClass
storageClass = Maybe ObjectVersionStorageClass
a} :: ObjectVersion)

-- | Version ID of an object.
objectVersion_versionId :: Lens.Lens' ObjectVersion (Prelude.Maybe ObjectVersionId)
objectVersion_versionId :: Lens' ObjectVersion (Maybe ObjectVersionId)
objectVersion_versionId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ObjectVersion' {Maybe ObjectVersionId
versionId :: Maybe ObjectVersionId
$sel:versionId:ObjectVersion' :: ObjectVersion -> Maybe ObjectVersionId
versionId} -> Maybe ObjectVersionId
versionId) (\s :: ObjectVersion
s@ObjectVersion' {} Maybe ObjectVersionId
a -> ObjectVersion
s {$sel:versionId:ObjectVersion' :: Maybe ObjectVersionId
versionId = Maybe ObjectVersionId
a} :: ObjectVersion)

instance Data.FromXML ObjectVersion where
  parseXML :: [Node] -> Either String ObjectVersion
parseXML [Node]
x =
    Maybe [ChecksumAlgorithm]
-> Maybe ETag
-> Maybe Bool
-> Maybe ObjectKey
-> Maybe RFC822
-> Maybe Owner
-> Maybe Integer
-> Maybe ObjectVersionStorageClass
-> Maybe ObjectVersionId
-> ObjectVersion
ObjectVersion'
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f 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
"ChecksumAlgorithm") [Node]
x)
      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
"ETag")
      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
"IsLatest")
      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
"Key")
      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
"LastModified")
      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
"Owner")
      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
"Size")
      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
"StorageClass")
      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
"VersionId")

instance Prelude.Hashable ObjectVersion where
  hashWithSalt :: Int -> ObjectVersion -> Int
hashWithSalt Int
_salt ObjectVersion' {Maybe Bool
Maybe Integer
Maybe [ChecksumAlgorithm]
Maybe RFC822
Maybe ObjectKey
Maybe ObjectVersionId
Maybe ETag
Maybe ObjectVersionStorageClass
Maybe Owner
versionId :: Maybe ObjectVersionId
storageClass :: Maybe ObjectVersionStorageClass
size :: Maybe Integer
owner :: Maybe Owner
lastModified :: Maybe RFC822
key :: Maybe ObjectKey
isLatest :: Maybe Bool
eTag :: Maybe ETag
checksumAlgorithm :: Maybe [ChecksumAlgorithm]
$sel:versionId:ObjectVersion' :: ObjectVersion -> Maybe ObjectVersionId
$sel:storageClass:ObjectVersion' :: ObjectVersion -> Maybe ObjectVersionStorageClass
$sel:size:ObjectVersion' :: ObjectVersion -> Maybe Integer
$sel:owner:ObjectVersion' :: ObjectVersion -> Maybe Owner
$sel:lastModified:ObjectVersion' :: ObjectVersion -> Maybe RFC822
$sel:key:ObjectVersion' :: ObjectVersion -> Maybe ObjectKey
$sel:isLatest:ObjectVersion' :: ObjectVersion -> Maybe Bool
$sel:eTag:ObjectVersion' :: ObjectVersion -> Maybe ETag
$sel:checksumAlgorithm:ObjectVersion' :: ObjectVersion -> Maybe [ChecksumAlgorithm]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [ChecksumAlgorithm]
checksumAlgorithm
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ETag
eTag
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
isLatest
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ObjectKey
key
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RFC822
lastModified
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Owner
owner
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Integer
size
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ObjectVersionStorageClass
storageClass
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ObjectVersionId
versionId

instance Prelude.NFData ObjectVersion where
  rnf :: ObjectVersion -> ()
rnf ObjectVersion' {Maybe Bool
Maybe Integer
Maybe [ChecksumAlgorithm]
Maybe RFC822
Maybe ObjectKey
Maybe ObjectVersionId
Maybe ETag
Maybe ObjectVersionStorageClass
Maybe Owner
versionId :: Maybe ObjectVersionId
storageClass :: Maybe ObjectVersionStorageClass
size :: Maybe Integer
owner :: Maybe Owner
lastModified :: Maybe RFC822
key :: Maybe ObjectKey
isLatest :: Maybe Bool
eTag :: Maybe ETag
checksumAlgorithm :: Maybe [ChecksumAlgorithm]
$sel:versionId:ObjectVersion' :: ObjectVersion -> Maybe ObjectVersionId
$sel:storageClass:ObjectVersion' :: ObjectVersion -> Maybe ObjectVersionStorageClass
$sel:size:ObjectVersion' :: ObjectVersion -> Maybe Integer
$sel:owner:ObjectVersion' :: ObjectVersion -> Maybe Owner
$sel:lastModified:ObjectVersion' :: ObjectVersion -> Maybe RFC822
$sel:key:ObjectVersion' :: ObjectVersion -> Maybe ObjectKey
$sel:isLatest:ObjectVersion' :: ObjectVersion -> Maybe Bool
$sel:eTag:ObjectVersion' :: ObjectVersion -> Maybe ETag
$sel:checksumAlgorithm:ObjectVersion' :: ObjectVersion -> Maybe [ChecksumAlgorithm]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [ChecksumAlgorithm]
checksumAlgorithm
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ETag
eTag
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
isLatest
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ObjectKey
key
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RFC822
lastModified
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Owner
owner
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Integer
size
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ObjectVersionStorageClass
storageClass
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ObjectVersionId
versionId