{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

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

-- |
-- Module      : Amazonka.DeviceFarm.CreateTestGridProject
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a Selenium testing project. Projects are used to track
-- TestGridSession instances.
module Amazonka.DeviceFarm.CreateTestGridProject
  ( -- * Creating a Request
    CreateTestGridProject (..),
    newCreateTestGridProject,

    -- * Request Lenses
    createTestGridProject_description,
    createTestGridProject_vpcConfig,
    createTestGridProject_name,

    -- * Destructuring the Response
    CreateTestGridProjectResponse (..),
    newCreateTestGridProjectResponse,

    -- * Response Lenses
    createTestGridProjectResponse_testGridProject,
    createTestGridProjectResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.DeviceFarm.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newCreateTestGridProject' smart constructor.
data CreateTestGridProject = CreateTestGridProject'
  { -- | Human-readable description of the project.
    CreateTestGridProject -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | The VPC security groups and subnets that are attached to a project.
    CreateTestGridProject -> Maybe TestGridVpcConfig
vpcConfig :: Prelude.Maybe TestGridVpcConfig,
    -- | Human-readable name of the Selenium testing project.
    CreateTestGridProject -> Text
name :: Prelude.Text
  }
  deriving (CreateTestGridProject -> CreateTestGridProject -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateTestGridProject -> CreateTestGridProject -> Bool
$c/= :: CreateTestGridProject -> CreateTestGridProject -> Bool
== :: CreateTestGridProject -> CreateTestGridProject -> Bool
$c== :: CreateTestGridProject -> CreateTestGridProject -> Bool
Prelude.Eq, ReadPrec [CreateTestGridProject]
ReadPrec CreateTestGridProject
Int -> ReadS CreateTestGridProject
ReadS [CreateTestGridProject]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateTestGridProject]
$creadListPrec :: ReadPrec [CreateTestGridProject]
readPrec :: ReadPrec CreateTestGridProject
$creadPrec :: ReadPrec CreateTestGridProject
readList :: ReadS [CreateTestGridProject]
$creadList :: ReadS [CreateTestGridProject]
readsPrec :: Int -> ReadS CreateTestGridProject
$creadsPrec :: Int -> ReadS CreateTestGridProject
Prelude.Read, Int -> CreateTestGridProject -> ShowS
[CreateTestGridProject] -> ShowS
CreateTestGridProject -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateTestGridProject] -> ShowS
$cshowList :: [CreateTestGridProject] -> ShowS
show :: CreateTestGridProject -> String
$cshow :: CreateTestGridProject -> String
showsPrec :: Int -> CreateTestGridProject -> ShowS
$cshowsPrec :: Int -> CreateTestGridProject -> ShowS
Prelude.Show, forall x. Rep CreateTestGridProject x -> CreateTestGridProject
forall x. CreateTestGridProject -> Rep CreateTestGridProject x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateTestGridProject x -> CreateTestGridProject
$cfrom :: forall x. CreateTestGridProject -> Rep CreateTestGridProject x
Prelude.Generic)

-- |
-- Create a value of 'CreateTestGridProject' 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:
--
-- 'description', 'createTestGridProject_description' - Human-readable description of the project.
--
-- 'vpcConfig', 'createTestGridProject_vpcConfig' - The VPC security groups and subnets that are attached to a project.
--
-- 'name', 'createTestGridProject_name' - Human-readable name of the Selenium testing project.
newCreateTestGridProject ::
  -- | 'name'
  Prelude.Text ->
  CreateTestGridProject
newCreateTestGridProject :: Text -> CreateTestGridProject
newCreateTestGridProject Text
pName_ =
  CreateTestGridProject'
    { $sel:description:CreateTestGridProject' :: Maybe Text
description =
        forall a. Maybe a
Prelude.Nothing,
      $sel:vpcConfig:CreateTestGridProject' :: Maybe TestGridVpcConfig
vpcConfig = forall a. Maybe a
Prelude.Nothing,
      $sel:name:CreateTestGridProject' :: Text
name = Text
pName_
    }

-- | Human-readable description of the project.
createTestGridProject_description :: Lens.Lens' CreateTestGridProject (Prelude.Maybe Prelude.Text)
createTestGridProject_description :: Lens' CreateTestGridProject (Maybe Text)
createTestGridProject_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateTestGridProject' {Maybe Text
description :: Maybe Text
$sel:description:CreateTestGridProject' :: CreateTestGridProject -> Maybe Text
description} -> Maybe Text
description) (\s :: CreateTestGridProject
s@CreateTestGridProject' {} Maybe Text
a -> CreateTestGridProject
s {$sel:description:CreateTestGridProject' :: Maybe Text
description = Maybe Text
a} :: CreateTestGridProject)

-- | The VPC security groups and subnets that are attached to a project.
createTestGridProject_vpcConfig :: Lens.Lens' CreateTestGridProject (Prelude.Maybe TestGridVpcConfig)
createTestGridProject_vpcConfig :: Lens' CreateTestGridProject (Maybe TestGridVpcConfig)
createTestGridProject_vpcConfig = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateTestGridProject' {Maybe TestGridVpcConfig
vpcConfig :: Maybe TestGridVpcConfig
$sel:vpcConfig:CreateTestGridProject' :: CreateTestGridProject -> Maybe TestGridVpcConfig
vpcConfig} -> Maybe TestGridVpcConfig
vpcConfig) (\s :: CreateTestGridProject
s@CreateTestGridProject' {} Maybe TestGridVpcConfig
a -> CreateTestGridProject
s {$sel:vpcConfig:CreateTestGridProject' :: Maybe TestGridVpcConfig
vpcConfig = Maybe TestGridVpcConfig
a} :: CreateTestGridProject)

-- | Human-readable name of the Selenium testing project.
createTestGridProject_name :: Lens.Lens' CreateTestGridProject Prelude.Text
createTestGridProject_name :: Lens' CreateTestGridProject Text
createTestGridProject_name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateTestGridProject' {Text
name :: Text
$sel:name:CreateTestGridProject' :: CreateTestGridProject -> Text
name} -> Text
name) (\s :: CreateTestGridProject
s@CreateTestGridProject' {} Text
a -> CreateTestGridProject
s {$sel:name:CreateTestGridProject' :: Text
name = Text
a} :: CreateTestGridProject)

instance Core.AWSRequest CreateTestGridProject where
  type
    AWSResponse CreateTestGridProject =
      CreateTestGridProjectResponse
  request :: (Service -> Service)
-> CreateTestGridProject -> Request CreateTestGridProject
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateTestGridProject
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateTestGridProject)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe TestGridProject -> Int -> CreateTestGridProjectResponse
CreateTestGridProjectResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"testGridProject")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable CreateTestGridProject where
  hashWithSalt :: Int -> CreateTestGridProject -> Int
hashWithSalt Int
_salt CreateTestGridProject' {Maybe Text
Maybe TestGridVpcConfig
Text
name :: Text
vpcConfig :: Maybe TestGridVpcConfig
description :: Maybe Text
$sel:name:CreateTestGridProject' :: CreateTestGridProject -> Text
$sel:vpcConfig:CreateTestGridProject' :: CreateTestGridProject -> Maybe TestGridVpcConfig
$sel:description:CreateTestGridProject' :: CreateTestGridProject -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TestGridVpcConfig
vpcConfig
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
name

instance Prelude.NFData CreateTestGridProject where
  rnf :: CreateTestGridProject -> ()
rnf CreateTestGridProject' {Maybe Text
Maybe TestGridVpcConfig
Text
name :: Text
vpcConfig :: Maybe TestGridVpcConfig
description :: Maybe Text
$sel:name:CreateTestGridProject' :: CreateTestGridProject -> Text
$sel:vpcConfig:CreateTestGridProject' :: CreateTestGridProject -> Maybe TestGridVpcConfig
$sel:description:CreateTestGridProject' :: CreateTestGridProject -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TestGridVpcConfig
vpcConfig
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
name

instance Data.ToHeaders CreateTestGridProject where
  toHeaders :: CreateTestGridProject -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"DeviceFarm_20150623.CreateTestGridProject" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON CreateTestGridProject where
  toJSON :: CreateTestGridProject -> Value
toJSON CreateTestGridProject' {Maybe Text
Maybe TestGridVpcConfig
Text
name :: Text
vpcConfig :: Maybe TestGridVpcConfig
description :: Maybe Text
$sel:name:CreateTestGridProject' :: CreateTestGridProject -> Text
$sel:vpcConfig:CreateTestGridProject' :: CreateTestGridProject -> Maybe TestGridVpcConfig
$sel:description:CreateTestGridProject' :: CreateTestGridProject -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"description" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
description,
            (Key
"vpcConfig" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe TestGridVpcConfig
vpcConfig,
            forall a. a -> Maybe a
Prelude.Just (Key
"name" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
name)
          ]
      )

instance Data.ToPath CreateTestGridProject where
  toPath :: CreateTestGridProject -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery CreateTestGridProject where
  toQuery :: CreateTestGridProject -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newCreateTestGridProjectResponse' smart constructor.
data CreateTestGridProjectResponse = CreateTestGridProjectResponse'
  { -- | ARN of the Selenium testing project that was created.
    CreateTestGridProjectResponse -> Maybe TestGridProject
testGridProject :: Prelude.Maybe TestGridProject,
    -- | The response's http status code.
    CreateTestGridProjectResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateTestGridProjectResponse
-> CreateTestGridProjectResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateTestGridProjectResponse
-> CreateTestGridProjectResponse -> Bool
$c/= :: CreateTestGridProjectResponse
-> CreateTestGridProjectResponse -> Bool
== :: CreateTestGridProjectResponse
-> CreateTestGridProjectResponse -> Bool
$c== :: CreateTestGridProjectResponse
-> CreateTestGridProjectResponse -> Bool
Prelude.Eq, ReadPrec [CreateTestGridProjectResponse]
ReadPrec CreateTestGridProjectResponse
Int -> ReadS CreateTestGridProjectResponse
ReadS [CreateTestGridProjectResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateTestGridProjectResponse]
$creadListPrec :: ReadPrec [CreateTestGridProjectResponse]
readPrec :: ReadPrec CreateTestGridProjectResponse
$creadPrec :: ReadPrec CreateTestGridProjectResponse
readList :: ReadS [CreateTestGridProjectResponse]
$creadList :: ReadS [CreateTestGridProjectResponse]
readsPrec :: Int -> ReadS CreateTestGridProjectResponse
$creadsPrec :: Int -> ReadS CreateTestGridProjectResponse
Prelude.Read, Int -> CreateTestGridProjectResponse -> ShowS
[CreateTestGridProjectResponse] -> ShowS
CreateTestGridProjectResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateTestGridProjectResponse] -> ShowS
$cshowList :: [CreateTestGridProjectResponse] -> ShowS
show :: CreateTestGridProjectResponse -> String
$cshow :: CreateTestGridProjectResponse -> String
showsPrec :: Int -> CreateTestGridProjectResponse -> ShowS
$cshowsPrec :: Int -> CreateTestGridProjectResponse -> ShowS
Prelude.Show, forall x.
Rep CreateTestGridProjectResponse x
-> CreateTestGridProjectResponse
forall x.
CreateTestGridProjectResponse
-> Rep CreateTestGridProjectResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateTestGridProjectResponse x
-> CreateTestGridProjectResponse
$cfrom :: forall x.
CreateTestGridProjectResponse
-> Rep CreateTestGridProjectResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateTestGridProjectResponse' 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:
--
-- 'testGridProject', 'createTestGridProjectResponse_testGridProject' - ARN of the Selenium testing project that was created.
--
-- 'httpStatus', 'createTestGridProjectResponse_httpStatus' - The response's http status code.
newCreateTestGridProjectResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateTestGridProjectResponse
newCreateTestGridProjectResponse :: Int -> CreateTestGridProjectResponse
newCreateTestGridProjectResponse Int
pHttpStatus_ =
  CreateTestGridProjectResponse'
    { $sel:testGridProject:CreateTestGridProjectResponse' :: Maybe TestGridProject
testGridProject =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateTestGridProjectResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | ARN of the Selenium testing project that was created.
createTestGridProjectResponse_testGridProject :: Lens.Lens' CreateTestGridProjectResponse (Prelude.Maybe TestGridProject)
createTestGridProjectResponse_testGridProject :: Lens' CreateTestGridProjectResponse (Maybe TestGridProject)
createTestGridProjectResponse_testGridProject = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateTestGridProjectResponse' {Maybe TestGridProject
testGridProject :: Maybe TestGridProject
$sel:testGridProject:CreateTestGridProjectResponse' :: CreateTestGridProjectResponse -> Maybe TestGridProject
testGridProject} -> Maybe TestGridProject
testGridProject) (\s :: CreateTestGridProjectResponse
s@CreateTestGridProjectResponse' {} Maybe TestGridProject
a -> CreateTestGridProjectResponse
s {$sel:testGridProject:CreateTestGridProjectResponse' :: Maybe TestGridProject
testGridProject = Maybe TestGridProject
a} :: CreateTestGridProjectResponse)

-- | The response's http status code.
createTestGridProjectResponse_httpStatus :: Lens.Lens' CreateTestGridProjectResponse Prelude.Int
createTestGridProjectResponse_httpStatus :: Lens' CreateTestGridProjectResponse Int
createTestGridProjectResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateTestGridProjectResponse' {Int
httpStatus :: Int
$sel:httpStatus:CreateTestGridProjectResponse' :: CreateTestGridProjectResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: CreateTestGridProjectResponse
s@CreateTestGridProjectResponse' {} Int
a -> CreateTestGridProjectResponse
s {$sel:httpStatus:CreateTestGridProjectResponse' :: Int
httpStatus = Int
a} :: CreateTestGridProjectResponse)

instance Prelude.NFData CreateTestGridProjectResponse where
  rnf :: CreateTestGridProjectResponse -> ()
rnf CreateTestGridProjectResponse' {Int
Maybe TestGridProject
httpStatus :: Int
testGridProject :: Maybe TestGridProject
$sel:httpStatus:CreateTestGridProjectResponse' :: CreateTestGridProjectResponse -> Int
$sel:testGridProject:CreateTestGridProjectResponse' :: CreateTestGridProjectResponse -> Maybe TestGridProject
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe TestGridProject
testGridProject
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus