{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Network.AWS.Glacier.Types.Product
-- Copyright   : (c) 2013-2017 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
module Network.AWS.Glacier.Types.Product where

import Network.AWS.Glacier.Types.Sum
import Network.AWS.Lens
import Network.AWS.Prelude

-- | Contains the Amazon Glacier response to your request.
--
--
-- For information about the underlying REST API, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-post.html Upload Archive> . For conceptual information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html Working with Archives in Amazon Glacier> .
--
--
-- /See:/ 'archiveCreationOutput' smart constructor.
data ArchiveCreationOutput = ArchiveCreationOutput'
  { _acoArchiveId :: !(Maybe Text)
  , _acoChecksum  :: !(Maybe Text)
  , _acoLocation  :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'ArchiveCreationOutput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'acoArchiveId' - The ID of the archive. This value is also included as part of the location.
--
-- * 'acoChecksum' - The checksum of the archive computed by Amazon Glacier.
--
-- * 'acoLocation' - The relative URI path of the newly added archive resource.
archiveCreationOutput
    :: ArchiveCreationOutput
archiveCreationOutput =
  ArchiveCreationOutput'
  {_acoArchiveId = Nothing, _acoChecksum = Nothing, _acoLocation = Nothing}


-- | The ID of the archive. This value is also included as part of the location.
acoArchiveId :: Lens' ArchiveCreationOutput (Maybe Text)
acoArchiveId = lens _acoArchiveId (\ s a -> s{_acoArchiveId = a});

-- | The checksum of the archive computed by Amazon Glacier.
acoChecksum :: Lens' ArchiveCreationOutput (Maybe Text)
acoChecksum = lens _acoChecksum (\ s a -> s{_acoChecksum = a});

-- | The relative URI path of the newly added archive resource.
acoLocation :: Lens' ArchiveCreationOutput (Maybe Text)
acoLocation = lens _acoLocation (\ s a -> s{_acoLocation = a});

instance FromJSON ArchiveCreationOutput where
        parseJSON
          = withObject "ArchiveCreationOutput"
              (\ x ->
                 ArchiveCreationOutput' <$>
                   (x .:? "x-amz-archive-id") <*>
                     (x .:? "x-amz-sha256-tree-hash")
                     <*> (x .:? "Location"))

instance Hashable ArchiveCreationOutput where

instance NFData ArchiveCreationOutput where

-- | Data retrieval policy.
--
--
--
-- /See:/ 'dataRetrievalPolicy' smart constructor.
newtype DataRetrievalPolicy = DataRetrievalPolicy'
  { _drpRules :: Maybe [DataRetrievalRule]
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'DataRetrievalPolicy' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'drpRules' - The policy rule. Although this is a list type, currently there must be only one rule, which contains a Strategy field and optionally a BytesPerHour field.
dataRetrievalPolicy
    :: DataRetrievalPolicy
dataRetrievalPolicy = DataRetrievalPolicy' {_drpRules = Nothing}


-- | The policy rule. Although this is a list type, currently there must be only one rule, which contains a Strategy field and optionally a BytesPerHour field.
drpRules :: Lens' DataRetrievalPolicy [DataRetrievalRule]
drpRules = lens _drpRules (\ s a -> s{_drpRules = a}) . _Default . _Coerce;

instance FromJSON DataRetrievalPolicy where
        parseJSON
          = withObject "DataRetrievalPolicy"
              (\ x ->
                 DataRetrievalPolicy' <$> (x .:? "Rules" .!= mempty))

instance Hashable DataRetrievalPolicy where

instance NFData DataRetrievalPolicy where

instance ToJSON DataRetrievalPolicy where
        toJSON DataRetrievalPolicy'{..}
          = object (catMaybes [("Rules" .=) <$> _drpRules])

-- | Data retrieval policy rule.
--
--
--
-- /See:/ 'dataRetrievalRule' smart constructor.
data DataRetrievalRule = DataRetrievalRule'
  { _drrStrategy     :: !(Maybe Text)
  , _drrBytesPerHour :: !(Maybe Integer)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'DataRetrievalRule' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'drrStrategy' - The type of data retrieval policy to set. Valid values: BytesPerHour|FreeTier|None
--
-- * 'drrBytesPerHour' - The maximum number of bytes that can be retrieved in an hour. This field is required only if the value of the Strategy field is @BytesPerHour@ . Your PUT operation will be rejected if the Strategy field is not set to @BytesPerHour@ and you set this field.
dataRetrievalRule
    :: DataRetrievalRule
dataRetrievalRule =
  DataRetrievalRule' {_drrStrategy = Nothing, _drrBytesPerHour = Nothing}


-- | The type of data retrieval policy to set. Valid values: BytesPerHour|FreeTier|None
drrStrategy :: Lens' DataRetrievalRule (Maybe Text)
drrStrategy = lens _drrStrategy (\ s a -> s{_drrStrategy = a});

-- | The maximum number of bytes that can be retrieved in an hour. This field is required only if the value of the Strategy field is @BytesPerHour@ . Your PUT operation will be rejected if the Strategy field is not set to @BytesPerHour@ and you set this field.
drrBytesPerHour :: Lens' DataRetrievalRule (Maybe Integer)
drrBytesPerHour = lens _drrBytesPerHour (\ s a -> s{_drrBytesPerHour = a});

instance FromJSON DataRetrievalRule where
        parseJSON
          = withObject "DataRetrievalRule"
              (\ x ->
                 DataRetrievalRule' <$>
                   (x .:? "Strategy") <*> (x .:? "BytesPerHour"))

instance Hashable DataRetrievalRule where

instance NFData DataRetrievalRule where

instance ToJSON DataRetrievalRule where
        toJSON DataRetrievalRule'{..}
          = object
              (catMaybes
                 [("Strategy" .=) <$> _drrStrategy,
                  ("BytesPerHour" .=) <$> _drrBytesPerHour])

-- | Contains the Amazon Glacier response to your request.
--
--
--
-- /See:/ 'describeVaultOutput' smart constructor.
data DescribeVaultOutput = DescribeVaultOutput'
  { _dvoVaultName         :: !(Maybe Text)
  , _dvoSizeInBytes       :: !(Maybe Integer)
  , _dvoLastInventoryDate :: !(Maybe Text)
  , _dvoVaultARN          :: !(Maybe Text)
  , _dvoCreationDate      :: !(Maybe Text)
  , _dvoNumberOfArchives  :: !(Maybe Integer)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'DescribeVaultOutput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dvoVaultName' - The name of the vault.
--
-- * 'dvoSizeInBytes' - Total size, in bytes, of the archives in the vault as of the last inventory date. This field will return null if an inventory has not yet run on the vault, for example if you just created the vault.
--
-- * 'dvoLastInventoryDate' - The Universal Coordinated Time (UTC) date when Amazon Glacier completed the last vault inventory. This value should be a string in the ISO 8601 date format, for example @2012-03-20T17:03:43.221Z@ .
--
-- * 'dvoVaultARN' - The Amazon Resource Name (ARN) of the vault.
--
-- * 'dvoCreationDate' - The Universal Coordinated Time (UTC) date when the vault was created. This value should be a string in the ISO 8601 date format, for example @2012-03-20T17:03:43.221Z@ .
--
-- * 'dvoNumberOfArchives' - The number of archives in the vault as of the last inventory date. This field will return @null@ if an inventory has not yet run on the vault, for example if you just created the vault.
describeVaultOutput
    :: DescribeVaultOutput
describeVaultOutput =
  DescribeVaultOutput'
  { _dvoVaultName = Nothing
  , _dvoSizeInBytes = Nothing
  , _dvoLastInventoryDate = Nothing
  , _dvoVaultARN = Nothing
  , _dvoCreationDate = Nothing
  , _dvoNumberOfArchives = Nothing
  }


-- | The name of the vault.
dvoVaultName :: Lens' DescribeVaultOutput (Maybe Text)
dvoVaultName = lens _dvoVaultName (\ s a -> s{_dvoVaultName = a});

-- | Total size, in bytes, of the archives in the vault as of the last inventory date. This field will return null if an inventory has not yet run on the vault, for example if you just created the vault.
dvoSizeInBytes :: Lens' DescribeVaultOutput (Maybe Integer)
dvoSizeInBytes = lens _dvoSizeInBytes (\ s a -> s{_dvoSizeInBytes = a});

-- | The Universal Coordinated Time (UTC) date when Amazon Glacier completed the last vault inventory. This value should be a string in the ISO 8601 date format, for example @2012-03-20T17:03:43.221Z@ .
dvoLastInventoryDate :: Lens' DescribeVaultOutput (Maybe Text)
dvoLastInventoryDate = lens _dvoLastInventoryDate (\ s a -> s{_dvoLastInventoryDate = a});

-- | The Amazon Resource Name (ARN) of the vault.
dvoVaultARN :: Lens' DescribeVaultOutput (Maybe Text)
dvoVaultARN = lens _dvoVaultARN (\ s a -> s{_dvoVaultARN = a});

-- | The Universal Coordinated Time (UTC) date when the vault was created. This value should be a string in the ISO 8601 date format, for example @2012-03-20T17:03:43.221Z@ .
dvoCreationDate :: Lens' DescribeVaultOutput (Maybe Text)
dvoCreationDate = lens _dvoCreationDate (\ s a -> s{_dvoCreationDate = a});

-- | The number of archives in the vault as of the last inventory date. This field will return @null@ if an inventory has not yet run on the vault, for example if you just created the vault.
dvoNumberOfArchives :: Lens' DescribeVaultOutput (Maybe Integer)
dvoNumberOfArchives = lens _dvoNumberOfArchives (\ s a -> s{_dvoNumberOfArchives = a});

instance FromJSON DescribeVaultOutput where
        parseJSON
          = withObject "DescribeVaultOutput"
              (\ x ->
                 DescribeVaultOutput' <$>
                   (x .:? "VaultName") <*> (x .:? "SizeInBytes") <*>
                     (x .:? "LastInventoryDate")
                     <*> (x .:? "VaultARN")
                     <*> (x .:? "CreationDate")
                     <*> (x .:? "NumberOfArchives"))

instance Hashable DescribeVaultOutput where

instance NFData DescribeVaultOutput where

-- | Describes an Amazon Glacier job.
--
--
--
-- /See:/ 'glacierJobDescription' smart constructor.
data GlacierJobDescription = GlacierJobDescription'
  { _gjdSHA256TreeHash :: !(Maybe Text)
  , _gjdArchiveId :: !(Maybe Text)
  , _gjdJobId :: !(Maybe Text)
  , _gjdRetrievalByteRange :: !(Maybe Text)
  , _gjdInventoryRetrievalParameters :: !(Maybe InventoryRetrievalJobDescription)
  , _gjdAction :: !(Maybe ActionCode)
  , _gjdJobDescription :: !(Maybe Text)
  , _gjdSNSTopic :: !(Maybe Text)
  , _gjdStatusMessage :: !(Maybe Text)
  , _gjdVaultARN :: !(Maybe Text)
  , _gjdTier :: !(Maybe Text)
  , _gjdArchiveSHA256TreeHash :: !(Maybe Text)
  , _gjdCreationDate :: !(Maybe Text)
  , _gjdCompleted :: !(Maybe Bool)
  , _gjdCompletionDate :: !(Maybe Text)
  , _gjdInventorySizeInBytes :: !(Maybe Integer)
  , _gjdArchiveSizeInBytes :: !(Maybe Integer)
  , _gjdStatusCode :: !(Maybe StatusCode)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'GlacierJobDescription' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gjdSHA256TreeHash' - For an ArchiveRetrieval job, it is the checksum of the archive. Otherwise, the value is null. The SHA256 tree hash value for the requested range of an archive. If the Initiate a Job request for an archive specified a tree-hash aligned range, then this field returns a value. For the specific case when the whole archive is retrieved, this value is the same as the ArchiveSHA256TreeHash value. This field is null in the following situations:     * Archive retrieval jobs that specify a range that is not tree-hash aligned.     * Archival jobs that specify a range that is equal to the whole archive and the job status is InProgress.     * Inventory jobs.
--
-- * 'gjdArchiveId' - For an ArchiveRetrieval job, this is the archive ID requested for download. Otherwise, this field is null.
--
-- * 'gjdJobId' - An opaque string that identifies an Amazon Glacier job.
--
-- * 'gjdRetrievalByteRange' - The retrieved byte range for archive retrieval jobs in the form "/StartByteValue/ -/EndByteValue/ " If no range was specified in the archive retrieval, then the whole archive is retrieved and /StartByteValue/ equals 0 and /EndByteValue/ equals the size of the archive minus 1. For inventory retrieval jobs this field is null.
--
-- * 'gjdInventoryRetrievalParameters' - Parameters used for range inventory retrieval.
--
-- * 'gjdAction' - The job type. It is either ArchiveRetrieval or InventoryRetrieval.
--
-- * 'gjdJobDescription' - The job description you provided when you initiated the job.
--
-- * 'gjdSNSTopic' - An Amazon Simple Notification Service (Amazon SNS) topic that receives notification.
--
-- * 'gjdStatusMessage' - A friendly message that describes the job status.
--
-- * 'gjdVaultARN' - The Amazon Resource Name (ARN) of the vault from which the archive retrieval was requested.
--
-- * 'gjdTier' - The retrieval option to use for the archive retrieval. Valid values are @Expedited@ , @Standard@ , or @Bulk@ . @Standard@ is the default.
--
-- * 'gjdArchiveSHA256TreeHash' - The SHA256 tree hash of the entire archive for an archive retrieval. For inventory retrieval jobs, this field is null.
--
-- * 'gjdCreationDate' - The UTC date when the job was created. A string representation of ISO 8601 date format, for example, "2012-03-20T17:03:43.221Z".
--
-- * 'gjdCompleted' - The job status. When a job is completed, you get the job's output.
--
-- * 'gjdCompletionDate' - The UTC time that the archive retrieval request completed. While the job is in progress, the value will be null.
--
-- * 'gjdInventorySizeInBytes' - For an InventoryRetrieval job, this is the size in bytes of the inventory requested for download. For the ArchiveRetrieval job, the value is null.
--
-- * 'gjdArchiveSizeInBytes' - For an ArchiveRetrieval job, this is the size in bytes of the archive being requested for download. For the InventoryRetrieval job, the value is null.
--
-- * 'gjdStatusCode' - The status code can be InProgress, Succeeded, or Failed, and indicates the status of the job.
glacierJobDescription
    :: GlacierJobDescription
glacierJobDescription =
  GlacierJobDescription'
  { _gjdSHA256TreeHash = Nothing
  , _gjdArchiveId = Nothing
  , _gjdJobId = Nothing
  , _gjdRetrievalByteRange = Nothing
  , _gjdInventoryRetrievalParameters = Nothing
  , _gjdAction = Nothing
  , _gjdJobDescription = Nothing
  , _gjdSNSTopic = Nothing
  , _gjdStatusMessage = Nothing
  , _gjdVaultARN = Nothing
  , _gjdTier = Nothing
  , _gjdArchiveSHA256TreeHash = Nothing
  , _gjdCreationDate = Nothing
  , _gjdCompleted = Nothing
  , _gjdCompletionDate = Nothing
  , _gjdInventorySizeInBytes = Nothing
  , _gjdArchiveSizeInBytes = Nothing
  , _gjdStatusCode = Nothing
  }


-- | For an ArchiveRetrieval job, it is the checksum of the archive. Otherwise, the value is null. The SHA256 tree hash value for the requested range of an archive. If the Initiate a Job request for an archive specified a tree-hash aligned range, then this field returns a value. For the specific case when the whole archive is retrieved, this value is the same as the ArchiveSHA256TreeHash value. This field is null in the following situations:     * Archive retrieval jobs that specify a range that is not tree-hash aligned.     * Archival jobs that specify a range that is equal to the whole archive and the job status is InProgress.     * Inventory jobs.
gjdSHA256TreeHash :: Lens' GlacierJobDescription (Maybe Text)
gjdSHA256TreeHash = lens _gjdSHA256TreeHash (\ s a -> s{_gjdSHA256TreeHash = a});

-- | For an ArchiveRetrieval job, this is the archive ID requested for download. Otherwise, this field is null.
gjdArchiveId :: Lens' GlacierJobDescription (Maybe Text)
gjdArchiveId = lens _gjdArchiveId (\ s a -> s{_gjdArchiveId = a});

-- | An opaque string that identifies an Amazon Glacier job.
gjdJobId :: Lens' GlacierJobDescription (Maybe Text)
gjdJobId = lens _gjdJobId (\ s a -> s{_gjdJobId = a});

-- | The retrieved byte range for archive retrieval jobs in the form "/StartByteValue/ -/EndByteValue/ " If no range was specified in the archive retrieval, then the whole archive is retrieved and /StartByteValue/ equals 0 and /EndByteValue/ equals the size of the archive minus 1. For inventory retrieval jobs this field is null.
gjdRetrievalByteRange :: Lens' GlacierJobDescription (Maybe Text)
gjdRetrievalByteRange = lens _gjdRetrievalByteRange (\ s a -> s{_gjdRetrievalByteRange = a});

-- | Parameters used for range inventory retrieval.
gjdInventoryRetrievalParameters :: Lens' GlacierJobDescription (Maybe InventoryRetrievalJobDescription)
gjdInventoryRetrievalParameters = lens _gjdInventoryRetrievalParameters (\ s a -> s{_gjdInventoryRetrievalParameters = a});

-- | The job type. It is either ArchiveRetrieval or InventoryRetrieval.
gjdAction :: Lens' GlacierJobDescription (Maybe ActionCode)
gjdAction = lens _gjdAction (\ s a -> s{_gjdAction = a});

-- | The job description you provided when you initiated the job.
gjdJobDescription :: Lens' GlacierJobDescription (Maybe Text)
gjdJobDescription = lens _gjdJobDescription (\ s a -> s{_gjdJobDescription = a});

-- | An Amazon Simple Notification Service (Amazon SNS) topic that receives notification.
gjdSNSTopic :: Lens' GlacierJobDescription (Maybe Text)
gjdSNSTopic = lens _gjdSNSTopic (\ s a -> s{_gjdSNSTopic = a});

-- | A friendly message that describes the job status.
gjdStatusMessage :: Lens' GlacierJobDescription (Maybe Text)
gjdStatusMessage = lens _gjdStatusMessage (\ s a -> s{_gjdStatusMessage = a});

-- | The Amazon Resource Name (ARN) of the vault from which the archive retrieval was requested.
gjdVaultARN :: Lens' GlacierJobDescription (Maybe Text)
gjdVaultARN = lens _gjdVaultARN (\ s a -> s{_gjdVaultARN = a});

-- | The retrieval option to use for the archive retrieval. Valid values are @Expedited@ , @Standard@ , or @Bulk@ . @Standard@ is the default.
gjdTier :: Lens' GlacierJobDescription (Maybe Text)
gjdTier = lens _gjdTier (\ s a -> s{_gjdTier = a});

-- | The SHA256 tree hash of the entire archive for an archive retrieval. For inventory retrieval jobs, this field is null.
gjdArchiveSHA256TreeHash :: Lens' GlacierJobDescription (Maybe Text)
gjdArchiveSHA256TreeHash = lens _gjdArchiveSHA256TreeHash (\ s a -> s{_gjdArchiveSHA256TreeHash = a});

-- | The UTC date when the job was created. A string representation of ISO 8601 date format, for example, "2012-03-20T17:03:43.221Z".
gjdCreationDate :: Lens' GlacierJobDescription (Maybe Text)
gjdCreationDate = lens _gjdCreationDate (\ s a -> s{_gjdCreationDate = a});

-- | The job status. When a job is completed, you get the job's output.
gjdCompleted :: Lens' GlacierJobDescription (Maybe Bool)
gjdCompleted = lens _gjdCompleted (\ s a -> s{_gjdCompleted = a});

-- | The UTC time that the archive retrieval request completed. While the job is in progress, the value will be null.
gjdCompletionDate :: Lens' GlacierJobDescription (Maybe Text)
gjdCompletionDate = lens _gjdCompletionDate (\ s a -> s{_gjdCompletionDate = a});

-- | For an InventoryRetrieval job, this is the size in bytes of the inventory requested for download. For the ArchiveRetrieval job, the value is null.
gjdInventorySizeInBytes :: Lens' GlacierJobDescription (Maybe Integer)
gjdInventorySizeInBytes = lens _gjdInventorySizeInBytes (\ s a -> s{_gjdInventorySizeInBytes = a});

-- | For an ArchiveRetrieval job, this is the size in bytes of the archive being requested for download. For the InventoryRetrieval job, the value is null.
gjdArchiveSizeInBytes :: Lens' GlacierJobDescription (Maybe Integer)
gjdArchiveSizeInBytes = lens _gjdArchiveSizeInBytes (\ s a -> s{_gjdArchiveSizeInBytes = a});

-- | The status code can be InProgress, Succeeded, or Failed, and indicates the status of the job.
gjdStatusCode :: Lens' GlacierJobDescription (Maybe StatusCode)
gjdStatusCode = lens _gjdStatusCode (\ s a -> s{_gjdStatusCode = a});

instance FromJSON GlacierJobDescription where
        parseJSON
          = withObject "GlacierJobDescription"
              (\ x ->
                 GlacierJobDescription' <$>
                   (x .:? "SHA256TreeHash") <*> (x .:? "ArchiveId") <*>
                     (x .:? "JobId")
                     <*> (x .:? "RetrievalByteRange")
                     <*> (x .:? "InventoryRetrievalParameters")
                     <*> (x .:? "Action")
                     <*> (x .:? "JobDescription")
                     <*> (x .:? "SNSTopic")
                     <*> (x .:? "StatusMessage")
                     <*> (x .:? "VaultARN")
                     <*> (x .:? "Tier")
                     <*> (x .:? "ArchiveSHA256TreeHash")
                     <*> (x .:? "CreationDate")
                     <*> (x .:? "Completed")
                     <*> (x .:? "CompletionDate")
                     <*> (x .:? "InventorySizeInBytes")
                     <*> (x .:? "ArchiveSizeInBytes")
                     <*> (x .:? "StatusCode"))

instance Hashable GlacierJobDescription where

instance NFData GlacierJobDescription where

-- | Describes the options for a range inventory retrieval job.
--
--
--
-- /See:/ 'inventoryRetrievalJobDescription' smart constructor.
data InventoryRetrievalJobDescription = InventoryRetrievalJobDescription'
  { _irjdFormat    :: !(Maybe Text)
  , _irjdEndDate   :: !(Maybe Text)
  , _irjdStartDate :: !(Maybe Text)
  , _irjdMarker    :: !(Maybe Text)
  , _irjdLimit     :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'InventoryRetrievalJobDescription' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'irjdFormat' - The output format for the vault inventory list, which is set by the __InitiateJob__ request when initiating a job to retrieve a vault inventory. Valid values are @CSV@ and @JSON@ .
--
-- * 'irjdEndDate' - The end of the date range in UTC for vault inventory retrieval that includes archives created before this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
--
-- * 'irjdStartDate' - The start of the date range in Universal Coordinated Time (UTC) for vault inventory retrieval that includes archives created on or after this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
--
-- * 'irjdMarker' - An opaque string that represents where to continue pagination of the vault inventory retrieval results. You use the marker in a new __InitiateJob__ request to obtain additional inventory items. If there are no more inventory items, this value is @null@ . For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html#api-initiate-job-post-vault-inventory-list-filtering Range Inventory Retrieval> .
--
-- * 'irjdLimit' - The maximum number of inventory items returned per vault inventory retrieval request. This limit is set when initiating the job with the a __InitiateJob__ request.
inventoryRetrievalJobDescription
    :: InventoryRetrievalJobDescription
inventoryRetrievalJobDescription =
  InventoryRetrievalJobDescription'
  { _irjdFormat = Nothing
  , _irjdEndDate = Nothing
  , _irjdStartDate = Nothing
  , _irjdMarker = Nothing
  , _irjdLimit = Nothing
  }


-- | The output format for the vault inventory list, which is set by the __InitiateJob__ request when initiating a job to retrieve a vault inventory. Valid values are @CSV@ and @JSON@ .
irjdFormat :: Lens' InventoryRetrievalJobDescription (Maybe Text)
irjdFormat = lens _irjdFormat (\ s a -> s{_irjdFormat = a});

-- | The end of the date range in UTC for vault inventory retrieval that includes archives created before this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
irjdEndDate :: Lens' InventoryRetrievalJobDescription (Maybe Text)
irjdEndDate = lens _irjdEndDate (\ s a -> s{_irjdEndDate = a});

-- | The start of the date range in Universal Coordinated Time (UTC) for vault inventory retrieval that includes archives created on or after this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
irjdStartDate :: Lens' InventoryRetrievalJobDescription (Maybe Text)
irjdStartDate = lens _irjdStartDate (\ s a -> s{_irjdStartDate = a});

-- | An opaque string that represents where to continue pagination of the vault inventory retrieval results. You use the marker in a new __InitiateJob__ request to obtain additional inventory items. If there are no more inventory items, this value is @null@ . For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html#api-initiate-job-post-vault-inventory-list-filtering Range Inventory Retrieval> .
irjdMarker :: Lens' InventoryRetrievalJobDescription (Maybe Text)
irjdMarker = lens _irjdMarker (\ s a -> s{_irjdMarker = a});

-- | The maximum number of inventory items returned per vault inventory retrieval request. This limit is set when initiating the job with the a __InitiateJob__ request.
irjdLimit :: Lens' InventoryRetrievalJobDescription (Maybe Text)
irjdLimit = lens _irjdLimit (\ s a -> s{_irjdLimit = a});

instance FromJSON InventoryRetrievalJobDescription
         where
        parseJSON
          = withObject "InventoryRetrievalJobDescription"
              (\ x ->
                 InventoryRetrievalJobDescription' <$>
                   (x .:? "Format") <*> (x .:? "EndDate") <*>
                     (x .:? "StartDate")
                     <*> (x .:? "Marker")
                     <*> (x .:? "Limit"))

instance Hashable InventoryRetrievalJobDescription
         where

instance NFData InventoryRetrievalJobDescription
         where

-- | Provides options for specifying a range inventory retrieval job.
--
--
--
-- /See:/ 'inventoryRetrievalJobInput' smart constructor.
data InventoryRetrievalJobInput = InventoryRetrievalJobInput'
  { _irjiEndDate   :: !(Maybe Text)
  , _irjiStartDate :: !(Maybe Text)
  , _irjiMarker    :: !(Maybe Text)
  , _irjiLimit     :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'InventoryRetrievalJobInput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'irjiEndDate' - The end of the date range in UTC for vault inventory retrieval that includes archives created before this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
--
-- * 'irjiStartDate' - The start of the date range in UTC for vault inventory retrieval that includes archives created on or after this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
--
-- * 'irjiMarker' - An opaque string that represents where to continue pagination of the vault inventory retrieval results. You use the marker in a new __InitiateJob__ request to obtain additional inventory items. If there are no more inventory items, this value is @null@ .
--
-- * 'irjiLimit' - Specifies the maximum number of inventory items returned per vault inventory retrieval request. Valid values are greater than or equal to 1.
inventoryRetrievalJobInput
    :: InventoryRetrievalJobInput
inventoryRetrievalJobInput =
  InventoryRetrievalJobInput'
  { _irjiEndDate = Nothing
  , _irjiStartDate = Nothing
  , _irjiMarker = Nothing
  , _irjiLimit = Nothing
  }


-- | The end of the date range in UTC for vault inventory retrieval that includes archives created before this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
irjiEndDate :: Lens' InventoryRetrievalJobInput (Maybe Text)
irjiEndDate = lens _irjiEndDate (\ s a -> s{_irjiEndDate = a});

-- | The start of the date range in UTC for vault inventory retrieval that includes archives created on or after this date. This value should be a string in the ISO 8601 date format, for example @2013-03-20T17:03:43Z@ .
irjiStartDate :: Lens' InventoryRetrievalJobInput (Maybe Text)
irjiStartDate = lens _irjiStartDate (\ s a -> s{_irjiStartDate = a});

-- | An opaque string that represents where to continue pagination of the vault inventory retrieval results. You use the marker in a new __InitiateJob__ request to obtain additional inventory items. If there are no more inventory items, this value is @null@ .
irjiMarker :: Lens' InventoryRetrievalJobInput (Maybe Text)
irjiMarker = lens _irjiMarker (\ s a -> s{_irjiMarker = a});

-- | Specifies the maximum number of inventory items returned per vault inventory retrieval request. Valid values are greater than or equal to 1.
irjiLimit :: Lens' InventoryRetrievalJobInput (Maybe Text)
irjiLimit = lens _irjiLimit (\ s a -> s{_irjiLimit = a});

instance Hashable InventoryRetrievalJobInput where

instance NFData InventoryRetrievalJobInput where

instance ToJSON InventoryRetrievalJobInput where
        toJSON InventoryRetrievalJobInput'{..}
          = object
              (catMaybes
                 [("EndDate" .=) <$> _irjiEndDate,
                  ("StartDate" .=) <$> _irjiStartDate,
                  ("Marker" .=) <$> _irjiMarker,
                  ("Limit" .=) <$> _irjiLimit])

-- | Provides options for defining a job.
--
--
--
-- /See:/ 'jobParameters' smart constructor.
data JobParameters = JobParameters'
  { _jpArchiveId                    :: !(Maybe Text)
  , _jpFormat                       :: !(Maybe Text)
  , _jpRetrievalByteRange           :: !(Maybe Text)
  , _jpInventoryRetrievalParameters :: !(Maybe InventoryRetrievalJobInput)
  , _jpSNSTopic                     :: !(Maybe Text)
  , _jpTier                         :: !(Maybe Text)
  , _jpType                         :: !(Maybe Text)
  , _jpDescription                  :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'JobParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jpArchiveId' - The ID of the archive that you want to retrieve. This field is required only if @Type@ is set to archive-retrieval. An error occurs if you specify this request parameter for an inventory retrieval job request.
--
-- * 'jpFormat' - When initiating a job to retrieve a vault inventory, you can optionally add this parameter to your request to specify the output format. If you are initiating an inventory job and do not specify a Format field, JSON is the default format. Valid values are "CSV" and "JSON".
--
-- * 'jpRetrievalByteRange' - The byte range to retrieve for an archive retrieval. in the form "/StartByteValue/ -/EndByteValue/ " If not specified, the whole archive is retrieved. If specified, the byte range must be megabyte (1024*1024) aligned which means that /StartByteValue/ must be divisible by 1 MB and /EndByteValue/ plus 1 must be divisible by 1 MB or be the end of the archive specified as the archive byte size value minus 1. If RetrievalByteRange is not megabyte aligned, this operation returns a 400 response.  An error occurs if you specify this field for an inventory retrieval job request.
--
-- * 'jpInventoryRetrievalParameters' - Input parameters used for range inventory retrieval.
--
-- * 'jpSNSTopic' - The Amazon SNS topic ARN to which Amazon Glacier sends a notification when the job is completed and the output is ready for you to download. The specified topic publishes the notification to its subscribers. The SNS topic must exist.
--
-- * 'jpTier' - The retrieval option to use for the archive retrieval. Valid values are @Expedited@ , @Standard@ , or @Bulk@ . @Standard@ is the default.
--
-- * 'jpType' - The job type. You can initiate a job to retrieve an archive or get an inventory of a vault. Valid values are "archive-retrieval" and "inventory-retrieval".
--
-- * 'jpDescription' - The optional description for the job. The description must be less than or equal to 1,024 bytes. The allowable characters are 7-bit ASCII without control codes-specifically, ASCII values 32-126 decimal or 0x20-0x7E hexadecimal.
jobParameters
    :: JobParameters
jobParameters =
  JobParameters'
  { _jpArchiveId = Nothing
  , _jpFormat = Nothing
  , _jpRetrievalByteRange = Nothing
  , _jpInventoryRetrievalParameters = Nothing
  , _jpSNSTopic = Nothing
  , _jpTier = Nothing
  , _jpType = Nothing
  , _jpDescription = Nothing
  }


-- | The ID of the archive that you want to retrieve. This field is required only if @Type@ is set to archive-retrieval. An error occurs if you specify this request parameter for an inventory retrieval job request.
jpArchiveId :: Lens' JobParameters (Maybe Text)
jpArchiveId = lens _jpArchiveId (\ s a -> s{_jpArchiveId = a});

-- | When initiating a job to retrieve a vault inventory, you can optionally add this parameter to your request to specify the output format. If you are initiating an inventory job and do not specify a Format field, JSON is the default format. Valid values are "CSV" and "JSON".
jpFormat :: Lens' JobParameters (Maybe Text)
jpFormat = lens _jpFormat (\ s a -> s{_jpFormat = a});

-- | The byte range to retrieve for an archive retrieval. in the form "/StartByteValue/ -/EndByteValue/ " If not specified, the whole archive is retrieved. If specified, the byte range must be megabyte (1024*1024) aligned which means that /StartByteValue/ must be divisible by 1 MB and /EndByteValue/ plus 1 must be divisible by 1 MB or be the end of the archive specified as the archive byte size value minus 1. If RetrievalByteRange is not megabyte aligned, this operation returns a 400 response.  An error occurs if you specify this field for an inventory retrieval job request.
jpRetrievalByteRange :: Lens' JobParameters (Maybe Text)
jpRetrievalByteRange = lens _jpRetrievalByteRange (\ s a -> s{_jpRetrievalByteRange = a});

-- | Input parameters used for range inventory retrieval.
jpInventoryRetrievalParameters :: Lens' JobParameters (Maybe InventoryRetrievalJobInput)
jpInventoryRetrievalParameters = lens _jpInventoryRetrievalParameters (\ s a -> s{_jpInventoryRetrievalParameters = a});

-- | The Amazon SNS topic ARN to which Amazon Glacier sends a notification when the job is completed and the output is ready for you to download. The specified topic publishes the notification to its subscribers. The SNS topic must exist.
jpSNSTopic :: Lens' JobParameters (Maybe Text)
jpSNSTopic = lens _jpSNSTopic (\ s a -> s{_jpSNSTopic = a});

-- | The retrieval option to use for the archive retrieval. Valid values are @Expedited@ , @Standard@ , or @Bulk@ . @Standard@ is the default.
jpTier :: Lens' JobParameters (Maybe Text)
jpTier = lens _jpTier (\ s a -> s{_jpTier = a});

-- | The job type. You can initiate a job to retrieve an archive or get an inventory of a vault. Valid values are "archive-retrieval" and "inventory-retrieval".
jpType :: Lens' JobParameters (Maybe Text)
jpType = lens _jpType (\ s a -> s{_jpType = a});

-- | The optional description for the job. The description must be less than or equal to 1,024 bytes. The allowable characters are 7-bit ASCII without control codes-specifically, ASCII values 32-126 decimal or 0x20-0x7E hexadecimal.
jpDescription :: Lens' JobParameters (Maybe Text)
jpDescription = lens _jpDescription (\ s a -> s{_jpDescription = a});

instance Hashable JobParameters where

instance NFData JobParameters where

instance ToJSON JobParameters where
        toJSON JobParameters'{..}
          = object
              (catMaybes
                 [("ArchiveId" .=) <$> _jpArchiveId,
                  ("Format" .=) <$> _jpFormat,
                  ("RetrievalByteRange" .=) <$> _jpRetrievalByteRange,
                  ("InventoryRetrievalParameters" .=) <$>
                    _jpInventoryRetrievalParameters,
                  ("SNSTopic" .=) <$> _jpSNSTopic,
                  ("Tier" .=) <$> _jpTier, ("Type" .=) <$> _jpType,
                  ("Description" .=) <$> _jpDescription])

-- | A list of the part sizes of the multipart upload.
--
--
--
-- /See:/ 'partListElement' smart constructor.
data PartListElement = PartListElement'
  { _pleSHA256TreeHash :: !(Maybe Text)
  , _pleRangeInBytes   :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'PartListElement' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pleSHA256TreeHash' - The SHA256 tree hash value that Amazon Glacier calculated for the part. This field is never @null@ .
--
-- * 'pleRangeInBytes' - The byte range of a part, inclusive of the upper value of the range.
partListElement
    :: PartListElement
partListElement =
  PartListElement' {_pleSHA256TreeHash = Nothing, _pleRangeInBytes = Nothing}


-- | The SHA256 tree hash value that Amazon Glacier calculated for the part. This field is never @null@ .
pleSHA256TreeHash :: Lens' PartListElement (Maybe Text)
pleSHA256TreeHash = lens _pleSHA256TreeHash (\ s a -> s{_pleSHA256TreeHash = a});

-- | The byte range of a part, inclusive of the upper value of the range.
pleRangeInBytes :: Lens' PartListElement (Maybe Text)
pleRangeInBytes = lens _pleRangeInBytes (\ s a -> s{_pleRangeInBytes = a});

instance FromJSON PartListElement where
        parseJSON
          = withObject "PartListElement"
              (\ x ->
                 PartListElement' <$>
                   (x .:? "SHA256TreeHash") <*> (x .:? "RangeInBytes"))

instance Hashable PartListElement where

instance NFData PartListElement where

-- | The definition for a provisioned capacity unit.
--
--
--
-- /See:/ 'provisionedCapacityDescription' smart constructor.
data ProvisionedCapacityDescription = ProvisionedCapacityDescription'
  { _pcdCapacityId     :: !(Maybe Text)
  , _pcdStartDate      :: !(Maybe Text)
  , _pcdExpirationDate :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProvisionedCapacityDescription' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pcdCapacityId' - The ID that identifies the provisioned capacity unit.
--
-- * 'pcdStartDate' - The date that the provisioned capacity unit was purchased, in Universal Coordinated Time (UTC).
--
-- * 'pcdExpirationDate' - The date that the provisioned capacity unit expires, in Universal Coordinated Time (UTC).
provisionedCapacityDescription
    :: ProvisionedCapacityDescription
provisionedCapacityDescription =
  ProvisionedCapacityDescription'
  { _pcdCapacityId = Nothing
  , _pcdStartDate = Nothing
  , _pcdExpirationDate = Nothing
  }


-- | The ID that identifies the provisioned capacity unit.
pcdCapacityId :: Lens' ProvisionedCapacityDescription (Maybe Text)
pcdCapacityId = lens _pcdCapacityId (\ s a -> s{_pcdCapacityId = a});

-- | The date that the provisioned capacity unit was purchased, in Universal Coordinated Time (UTC).
pcdStartDate :: Lens' ProvisionedCapacityDescription (Maybe Text)
pcdStartDate = lens _pcdStartDate (\ s a -> s{_pcdStartDate = a});

-- | The date that the provisioned capacity unit expires, in Universal Coordinated Time (UTC).
pcdExpirationDate :: Lens' ProvisionedCapacityDescription (Maybe Text)
pcdExpirationDate = lens _pcdExpirationDate (\ s a -> s{_pcdExpirationDate = a});

instance FromJSON ProvisionedCapacityDescription
         where
        parseJSON
          = withObject "ProvisionedCapacityDescription"
              (\ x ->
                 ProvisionedCapacityDescription' <$>
                   (x .:? "CapacityId") <*> (x .:? "StartDate") <*>
                     (x .:? "ExpirationDate"))

instance Hashable ProvisionedCapacityDescription
         where

instance NFData ProvisionedCapacityDescription where

-- | A list of in-progress multipart uploads for a vault.
--
--
--
-- /See:/ 'uploadListElement' smart constructor.
data UploadListElement = UploadListElement'
  { _uleMultipartUploadId  :: !(Maybe Text)
  , _ulePartSizeInBytes    :: !(Maybe Integer)
  , _uleArchiveDescription :: !(Maybe Text)
  , _uleVaultARN           :: !(Maybe Text)
  , _uleCreationDate       :: !(Maybe Text)
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'UploadListElement' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uleMultipartUploadId' - The ID of a multipart upload.
--
-- * 'ulePartSizeInBytes' - The part size, in bytes, specified in the Initiate Multipart Upload request. This is the size of all the parts in the upload except the last part, which may be smaller than this size.
--
-- * 'uleArchiveDescription' - The description of the archive that was specified in the Initiate Multipart Upload request.
--
-- * 'uleVaultARN' - The Amazon Resource Name (ARN) of the vault that contains the archive.
--
-- * 'uleCreationDate' - The UTC time at which the multipart upload was initiated.
uploadListElement
    :: UploadListElement
uploadListElement =
  UploadListElement'
  { _uleMultipartUploadId = Nothing
  , _ulePartSizeInBytes = Nothing
  , _uleArchiveDescription = Nothing
  , _uleVaultARN = Nothing
  , _uleCreationDate = Nothing
  }


-- | The ID of a multipart upload.
uleMultipartUploadId :: Lens' UploadListElement (Maybe Text)
uleMultipartUploadId = lens _uleMultipartUploadId (\ s a -> s{_uleMultipartUploadId = a});

-- | The part size, in bytes, specified in the Initiate Multipart Upload request. This is the size of all the parts in the upload except the last part, which may be smaller than this size.
ulePartSizeInBytes :: Lens' UploadListElement (Maybe Integer)
ulePartSizeInBytes = lens _ulePartSizeInBytes (\ s a -> s{_ulePartSizeInBytes = a});

-- | The description of the archive that was specified in the Initiate Multipart Upload request.
uleArchiveDescription :: Lens' UploadListElement (Maybe Text)
uleArchiveDescription = lens _uleArchiveDescription (\ s a -> s{_uleArchiveDescription = a});

-- | The Amazon Resource Name (ARN) of the vault that contains the archive.
uleVaultARN :: Lens' UploadListElement (Maybe Text)
uleVaultARN = lens _uleVaultARN (\ s a -> s{_uleVaultARN = a});

-- | The UTC time at which the multipart upload was initiated.
uleCreationDate :: Lens' UploadListElement (Maybe Text)
uleCreationDate = lens _uleCreationDate (\ s a -> s{_uleCreationDate = a});

instance FromJSON UploadListElement where
        parseJSON
          = withObject "UploadListElement"
              (\ x ->
                 UploadListElement' <$>
                   (x .:? "MultipartUploadId") <*>
                     (x .:? "PartSizeInBytes")
                     <*> (x .:? "ArchiveDescription")
                     <*> (x .:? "VaultARN")
                     <*> (x .:? "CreationDate"))

instance Hashable UploadListElement where

instance NFData UploadListElement where

-- | Contains the vault access policy.
--
--
--
-- /See:/ 'vaultAccessPolicy' smart constructor.
newtype VaultAccessPolicy = VaultAccessPolicy'
  { _vapPolicy :: Maybe Text
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'VaultAccessPolicy' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vapPolicy' - The vault access policy.
vaultAccessPolicy
    :: VaultAccessPolicy
vaultAccessPolicy = VaultAccessPolicy' {_vapPolicy = Nothing}


-- | The vault access policy.
vapPolicy :: Lens' VaultAccessPolicy (Maybe Text)
vapPolicy = lens _vapPolicy (\ s a -> s{_vapPolicy = a});

instance FromJSON VaultAccessPolicy where
        parseJSON
          = withObject "VaultAccessPolicy"
              (\ x -> VaultAccessPolicy' <$> (x .:? "Policy"))

instance Hashable VaultAccessPolicy where

instance NFData VaultAccessPolicy where

instance ToJSON VaultAccessPolicy where
        toJSON VaultAccessPolicy'{..}
          = object (catMaybes [("Policy" .=) <$> _vapPolicy])

-- | Contains the vault lock policy.
--
--
--
-- /See:/ 'vaultLockPolicy' smart constructor.
newtype VaultLockPolicy = VaultLockPolicy'
  { _vlpPolicy :: Maybe Text
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'VaultLockPolicy' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vlpPolicy' - The vault lock policy.
vaultLockPolicy
    :: VaultLockPolicy
vaultLockPolicy = VaultLockPolicy' {_vlpPolicy = Nothing}


-- | The vault lock policy.
vlpPolicy :: Lens' VaultLockPolicy (Maybe Text)
vlpPolicy = lens _vlpPolicy (\ s a -> s{_vlpPolicy = a});

instance Hashable VaultLockPolicy where

instance NFData VaultLockPolicy where

instance ToJSON VaultLockPolicy where
        toJSON VaultLockPolicy'{..}
          = object (catMaybes [("Policy" .=) <$> _vlpPolicy])

-- | Represents a vault's notification configuration.
--
--
--
-- /See:/ 'vaultNotificationConfig' smart constructor.
data VaultNotificationConfig = VaultNotificationConfig'
  { _vncSNSTopic :: !(Maybe Text)
  , _vncEvents   :: !(Maybe [Text])
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'VaultNotificationConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vncSNSTopic' - The Amazon Simple Notification Service (Amazon SNS) topic Amazon Resource Name (ARN).
--
-- * 'vncEvents' - A list of one or more events for which Amazon Glacier will send a notification to the specified Amazon SNS topic.
vaultNotificationConfig
    :: VaultNotificationConfig
vaultNotificationConfig =
  VaultNotificationConfig' {_vncSNSTopic = Nothing, _vncEvents = Nothing}


-- | The Amazon Simple Notification Service (Amazon SNS) topic Amazon Resource Name (ARN).
vncSNSTopic :: Lens' VaultNotificationConfig (Maybe Text)
vncSNSTopic = lens _vncSNSTopic (\ s a -> s{_vncSNSTopic = a});

-- | A list of one or more events for which Amazon Glacier will send a notification to the specified Amazon SNS topic.
vncEvents :: Lens' VaultNotificationConfig [Text]
vncEvents = lens _vncEvents (\ s a -> s{_vncEvents = a}) . _Default . _Coerce;

instance FromJSON VaultNotificationConfig where
        parseJSON
          = withObject "VaultNotificationConfig"
              (\ x ->
                 VaultNotificationConfig' <$>
                   (x .:? "SNSTopic") <*> (x .:? "Events" .!= mempty))

instance Hashable VaultNotificationConfig where

instance NFData VaultNotificationConfig where

instance ToJSON VaultNotificationConfig where
        toJSON VaultNotificationConfig'{..}
          = object
              (catMaybes
                 [("SNSTopic" .=) <$> _vncSNSTopic,
                  ("Events" .=) <$> _vncEvents])