{-# 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.DirectConnect.DescribeLocations
-- 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)
--
-- Returns the list of AWS Direct Connect locations in the current AWS region. These are the locations that may be selected when calling CreateConnection or CreateInterconnect.
module Network.AWS.DirectConnect.DescribeLocations
    (
    -- * Creating a Request
      describeLocations
    , DescribeLocations

    -- * Destructuring the Response
    , describeLocationsResponse
    , DescribeLocationsResponse
    -- * Response Lenses
    , dlrsLocations
    , dlrsResponseStatus
    ) where

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

-- | /See:/ 'describeLocations' smart constructor.
data DescribeLocations =
    DescribeLocations'
    deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DescribeLocations' with the minimum fields required to make a request.
--
describeLocations
    :: DescribeLocations
describeLocations = DescribeLocations'

instance AWSRequest DescribeLocations where
        type Rs DescribeLocations = DescribeLocationsResponse
        request = postJSON directConnect
        response
          = receiveJSON
              (\ s h x ->
                 DescribeLocationsResponse' <$>
                   (x .?> "locations" .!@ mempty) <*>
                     (pure (fromEnum s)))

instance Hashable DescribeLocations

instance NFData DescribeLocations

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

instance ToJSON DescribeLocations where
        toJSON = const (Object mempty)

instance ToPath DescribeLocations where
        toPath = const "/"

instance ToQuery DescribeLocations where
        toQuery = const mempty

-- | A location is a network facility where AWS Direct Connect routers are available to be connected. Generally, these are colocation hubs where many network providers have equipment, and where cross connects can be delivered. Locations include a name and facility code, and must be provided when creating a connection.
--
-- /See:/ 'describeLocationsResponse' smart constructor.
data DescribeLocationsResponse = DescribeLocationsResponse'
    { _dlrsLocations      :: !(Maybe [Location])
    , _dlrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DescribeLocationsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dlrsLocations'
--
-- * 'dlrsResponseStatus'
describeLocationsResponse
    :: Int -- ^ 'dlrsResponseStatus'
    -> DescribeLocationsResponse
describeLocationsResponse pResponseStatus_ =
    DescribeLocationsResponse'
    { _dlrsLocations = Nothing
    , _dlrsResponseStatus = pResponseStatus_
    }

-- | A list of colocation hubs where network providers have equipment. Most regions have multiple locations available.
dlrsLocations :: Lens' DescribeLocationsResponse [Location]
dlrsLocations = lens _dlrsLocations (\ s a -> s{_dlrsLocations = a}) . _Default . _Coerce;

-- | The response status code.
dlrsResponseStatus :: Lens' DescribeLocationsResponse Int
dlrsResponseStatus = lens _dlrsResponseStatus (\ s a -> s{_dlrsResponseStatus = a});

instance NFData DescribeLocationsResponse