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

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

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

-- |
-- Module      : Network.AWS.ECR.UploadLayerPart
-- Copyright   : (c) 2013-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Uploads an image layer part to Amazon ECR.
--
-- This operation is used by the Amazon ECR proxy, and it is not intended for general use by customers. Use the 'docker' CLI to pull, tag, and push images.
module Network.AWS.ECR.UploadLayerPart
    (
    -- * Creating a Request
      uploadLayerPart
    , UploadLayerPart
    -- * Request Lenses
    , ulpRegistryId
    , ulpRepositoryName
    , ulpUploadId
    , ulpPartFirstByte
    , ulpPartLastByte
    , ulpLayerPartBlob

    -- * Destructuring the Response
    , uploadLayerPartResponse
    , UploadLayerPartResponse
    -- * Response Lenses
    , ulprsRegistryId
    , ulprsLastByteReceived
    , ulprsRepositoryName
    , ulprsUploadId
    , ulprsResponseStatus
    ) where

import           Network.AWS.ECR.Types
import           Network.AWS.ECR.Types.Product
import           Network.AWS.Lens
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | /See:/ 'uploadLayerPart' smart constructor.
data UploadLayerPart = UploadLayerPart'
    { _ulpRegistryId     :: !(Maybe Text)
    , _ulpRepositoryName :: !Text
    , _ulpUploadId       :: !Text
    , _ulpPartFirstByte  :: !Nat
    , _ulpPartLastByte   :: !Nat
    , _ulpLayerPartBlob  :: !Base64
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'UploadLayerPart' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ulpRegistryId'
--
-- * 'ulpRepositoryName'
--
-- * 'ulpUploadId'
--
-- * 'ulpPartFirstByte'
--
-- * 'ulpPartLastByte'
--
-- * 'ulpLayerPartBlob'
uploadLayerPart
    :: Text -- ^ 'ulpRepositoryName'
    -> Text -- ^ 'ulpUploadId'
    -> Natural -- ^ 'ulpPartFirstByte'
    -> Natural -- ^ 'ulpPartLastByte'
    -> ByteString -- ^ 'ulpLayerPartBlob'
    -> UploadLayerPart
uploadLayerPart pRepositoryName_ pUploadId_ pPartFirstByte_ pPartLastByte_ pLayerPartBlob_ =
    UploadLayerPart'
    { _ulpRegistryId = Nothing
    , _ulpRepositoryName = pRepositoryName_
    , _ulpUploadId = pUploadId_
    , _ulpPartFirstByte = _Nat # pPartFirstByte_
    , _ulpPartLastByte = _Nat # pPartLastByte_
    , _ulpLayerPartBlob = _Base64 # pLayerPartBlob_
    }

-- | The AWS account ID associated with the registry that you are uploading layer parts to. If you do not specify a registry, the default registry is assumed.
ulpRegistryId :: Lens' UploadLayerPart (Maybe Text)
ulpRegistryId = lens _ulpRegistryId (\ s a -> s{_ulpRegistryId = a});

-- | The name of the repository that you are uploading layer parts to.
ulpRepositoryName :: Lens' UploadLayerPart Text
ulpRepositoryName = lens _ulpRepositoryName (\ s a -> s{_ulpRepositoryName = a});

-- | The upload ID from a previous < InitiateLayerUpload> operation to associate with the layer part upload.
ulpUploadId :: Lens' UploadLayerPart Text
ulpUploadId = lens _ulpUploadId (\ s a -> s{_ulpUploadId = a});

-- | The integer value of the first byte of the layer part.
ulpPartFirstByte :: Lens' UploadLayerPart Natural
ulpPartFirstByte = lens _ulpPartFirstByte (\ s a -> s{_ulpPartFirstByte = a}) . _Nat;

-- | The integer value of the last byte of the layer part.
ulpPartLastByte :: Lens' UploadLayerPart Natural
ulpPartLastByte = lens _ulpPartLastByte (\ s a -> s{_ulpPartLastByte = a}) . _Nat;

-- | The base64-encoded layer part payload.
--
-- /Note:/ This 'Lens' automatically encodes and decodes Base64 data,
-- despite what the AWS documentation might say.
-- The underlying isomorphism will encode to Base64 representation during
-- serialisation, and decode from Base64 representation during deserialisation.
-- This 'Lens' accepts and returns only raw unencoded data.
ulpLayerPartBlob :: Lens' UploadLayerPart ByteString
ulpLayerPartBlob = lens _ulpLayerPartBlob (\ s a -> s{_ulpLayerPartBlob = a}) . _Base64;

instance AWSRequest UploadLayerPart where
        type Rs UploadLayerPart = UploadLayerPartResponse
        request = postJSON ecr
        response
          = receiveJSON
              (\ s h x ->
                 UploadLayerPartResponse' <$>
                   (x .?> "registryId") <*> (x .?> "lastByteReceived")
                     <*> (x .?> "repositoryName")
                     <*> (x .?> "uploadId")
                     <*> (pure (fromEnum s)))

instance Hashable UploadLayerPart

instance NFData UploadLayerPart

instance ToHeaders UploadLayerPart where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("AmazonEC2ContainerRegistry_V20150921.UploadLayerPart"
                       :: ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON UploadLayerPart where
        toJSON UploadLayerPart'{..}
          = object
              (catMaybes
                 [("registryId" .=) <$> _ulpRegistryId,
                  Just ("repositoryName" .= _ulpRepositoryName),
                  Just ("uploadId" .= _ulpUploadId),
                  Just ("partFirstByte" .= _ulpPartFirstByte),
                  Just ("partLastByte" .= _ulpPartLastByte),
                  Just ("layerPartBlob" .= _ulpLayerPartBlob)])

instance ToPath UploadLayerPart where
        toPath = const "/"

instance ToQuery UploadLayerPart where
        toQuery = const mempty

-- | /See:/ 'uploadLayerPartResponse' smart constructor.
data UploadLayerPartResponse = UploadLayerPartResponse'
    { _ulprsRegistryId       :: !(Maybe Text)
    , _ulprsLastByteReceived :: !(Maybe Nat)
    , _ulprsRepositoryName   :: !(Maybe Text)
    , _ulprsUploadId         :: !(Maybe Text)
    , _ulprsResponseStatus   :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'UploadLayerPartResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ulprsRegistryId'
--
-- * 'ulprsLastByteReceived'
--
-- * 'ulprsRepositoryName'
--
-- * 'ulprsUploadId'
--
-- * 'ulprsResponseStatus'
uploadLayerPartResponse
    :: Int -- ^ 'ulprsResponseStatus'
    -> UploadLayerPartResponse
uploadLayerPartResponse pResponseStatus_ =
    UploadLayerPartResponse'
    { _ulprsRegistryId = Nothing
    , _ulprsLastByteReceived = Nothing
    , _ulprsRepositoryName = Nothing
    , _ulprsUploadId = Nothing
    , _ulprsResponseStatus = pResponseStatus_
    }

-- | The registry ID associated with the request.
ulprsRegistryId :: Lens' UploadLayerPartResponse (Maybe Text)
ulprsRegistryId = lens _ulprsRegistryId (\ s a -> s{_ulprsRegistryId = a});

-- | The integer value of the last byte received in the request.
ulprsLastByteReceived :: Lens' UploadLayerPartResponse (Maybe Natural)
ulprsLastByteReceived = lens _ulprsLastByteReceived (\ s a -> s{_ulprsLastByteReceived = a}) . mapping _Nat;

-- | The repository name associated with the request.
ulprsRepositoryName :: Lens' UploadLayerPartResponse (Maybe Text)
ulprsRepositoryName = lens _ulprsRepositoryName (\ s a -> s{_ulprsRepositoryName = a});

-- | The upload ID associated with the request.
ulprsUploadId :: Lens' UploadLayerPartResponse (Maybe Text)
ulprsUploadId = lens _ulprsUploadId (\ s a -> s{_ulprsUploadId = a});

-- | The response status code.
ulprsResponseStatus :: Lens' UploadLayerPartResponse Int
ulprsResponseStatus = lens _ulprsResponseStatus (\ s a -> s{_ulprsResponseStatus = a});

instance NFData UploadLayerPartResponse