{-# 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.DataPipeline.GetPipelineDefinition
-- 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)
--
-- Gets the definition of the specified pipeline. You can call 'GetPipelineDefinition' to retrieve the pipeline definition that you provided using < PutPipelineDefinition>.
module Network.AWS.DataPipeline.GetPipelineDefinition
    (
    -- * Creating a Request
      getPipelineDefinition
    , GetPipelineDefinition
    -- * Request Lenses
    , gpdVersion
    , gpdPipelineId

    -- * Destructuring the Response
    , getPipelineDefinitionResponse
    , GetPipelineDefinitionResponse
    -- * Response Lenses
    , gpdrsPipelineObjects
    , gpdrsParameterObjects
    , gpdrsParameterValues
    , gpdrsResponseStatus
    ) where

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

-- | Contains the parameters for GetPipelineDefinition.
--
-- /See:/ 'getPipelineDefinition' smart constructor.
data GetPipelineDefinition = GetPipelineDefinition'
    { _gpdVersion    :: !(Maybe Text)
    , _gpdPipelineId :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetPipelineDefinition' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gpdVersion'
--
-- * 'gpdPipelineId'
getPipelineDefinition
    :: Text -- ^ 'gpdPipelineId'
    -> GetPipelineDefinition
getPipelineDefinition pPipelineId_ =
    GetPipelineDefinition'
    { _gpdVersion = Nothing
    , _gpdPipelineId = pPipelineId_
    }

-- | The version of the pipeline definition to retrieve. Set this parameter to 'latest' (default) to use the last definition saved to the pipeline or 'active' to use the last definition that was activated.
gpdVersion :: Lens' GetPipelineDefinition (Maybe Text)
gpdVersion = lens _gpdVersion (\ s a -> s{_gpdVersion = a});

-- | The ID of the pipeline.
gpdPipelineId :: Lens' GetPipelineDefinition Text
gpdPipelineId = lens _gpdPipelineId (\ s a -> s{_gpdPipelineId = a});

instance AWSRequest GetPipelineDefinition where
        type Rs GetPipelineDefinition =
             GetPipelineDefinitionResponse
        request = postJSON dataPipeline
        response
          = receiveJSON
              (\ s h x ->
                 GetPipelineDefinitionResponse' <$>
                   (x .?> "pipelineObjects" .!@ mempty) <*>
                     (x .?> "parameterObjects" .!@ mempty)
                     <*> (x .?> "parameterValues" .!@ mempty)
                     <*> (pure (fromEnum s)))

instance Hashable GetPipelineDefinition

instance NFData GetPipelineDefinition

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

instance ToJSON GetPipelineDefinition where
        toJSON GetPipelineDefinition'{..}
          = object
              (catMaybes
                 [("version" .=) <$> _gpdVersion,
                  Just ("pipelineId" .= _gpdPipelineId)])

instance ToPath GetPipelineDefinition where
        toPath = const "/"

instance ToQuery GetPipelineDefinition where
        toQuery = const mempty

-- | Contains the output of GetPipelineDefinition.
--
-- /See:/ 'getPipelineDefinitionResponse' smart constructor.
data GetPipelineDefinitionResponse = GetPipelineDefinitionResponse'
    { _gpdrsPipelineObjects  :: !(Maybe [PipelineObject])
    , _gpdrsParameterObjects :: !(Maybe [ParameterObject])
    , _gpdrsParameterValues  :: !(Maybe [ParameterValue])
    , _gpdrsResponseStatus   :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetPipelineDefinitionResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gpdrsPipelineObjects'
--
-- * 'gpdrsParameterObjects'
--
-- * 'gpdrsParameterValues'
--
-- * 'gpdrsResponseStatus'
getPipelineDefinitionResponse
    :: Int -- ^ 'gpdrsResponseStatus'
    -> GetPipelineDefinitionResponse
getPipelineDefinitionResponse pResponseStatus_ =
    GetPipelineDefinitionResponse'
    { _gpdrsPipelineObjects = Nothing
    , _gpdrsParameterObjects = Nothing
    , _gpdrsParameterValues = Nothing
    , _gpdrsResponseStatus = pResponseStatus_
    }

-- | The objects defined in the pipeline.
gpdrsPipelineObjects :: Lens' GetPipelineDefinitionResponse [PipelineObject]
gpdrsPipelineObjects = lens _gpdrsPipelineObjects (\ s a -> s{_gpdrsPipelineObjects = a}) . _Default . _Coerce;

-- | The parameter objects used in the pipeline definition.
gpdrsParameterObjects :: Lens' GetPipelineDefinitionResponse [ParameterObject]
gpdrsParameterObjects = lens _gpdrsParameterObjects (\ s a -> s{_gpdrsParameterObjects = a}) . _Default . _Coerce;

-- | The parameter values used in the pipeline definition.
gpdrsParameterValues :: Lens' GetPipelineDefinitionResponse [ParameterValue]
gpdrsParameterValues = lens _gpdrsParameterValues (\ s a -> s{_gpdrsParameterValues = a}) . _Default . _Coerce;

-- | The response status code.
gpdrsResponseStatus :: Lens' GetPipelineDefinitionResponse Int
gpdrsResponseStatus = lens _gpdrsResponseStatus (\ s a -> s{_gpdrsResponseStatus = a});

instance NFData GetPipelineDefinitionResponse