{-# 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.WorkSpaces.CreateWorkspaces
-- 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 one or more WorkSpaces.
--
-- This operation is asynchronous and returns before the WorkSpaces are
-- created.
--
-- The @MANUAL@ running mode value is only supported by Amazon WorkSpaces
-- Core. Contact your account team to be allow-listed to use this value.
-- For more information, see
-- <http://aws.amazon.com/workspaces/core/ Amazon WorkSpaces Core>.
module Amazonka.WorkSpaces.CreateWorkspaces
  ( -- * Creating a Request
    CreateWorkspaces (..),
    newCreateWorkspaces,

    -- * Request Lenses
    createWorkspaces_workspaces,

    -- * Destructuring the Response
    CreateWorkspacesResponse (..),
    newCreateWorkspacesResponse,

    -- * Response Lenses
    createWorkspacesResponse_failedRequests,
    createWorkspacesResponse_pendingRequests,
    createWorkspacesResponse_httpStatus,
  )
where

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

-- | /See:/ 'newCreateWorkspaces' smart constructor.
data CreateWorkspaces = CreateWorkspaces'
  { -- | The WorkSpaces to create. You can specify up to 25 WorkSpaces.
    CreateWorkspaces -> NonEmpty WorkspaceRequest
workspaces :: Prelude.NonEmpty WorkspaceRequest
  }
  deriving (CreateWorkspaces -> CreateWorkspaces -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateWorkspaces -> CreateWorkspaces -> Bool
$c/= :: CreateWorkspaces -> CreateWorkspaces -> Bool
== :: CreateWorkspaces -> CreateWorkspaces -> Bool
$c== :: CreateWorkspaces -> CreateWorkspaces -> Bool
Prelude.Eq, ReadPrec [CreateWorkspaces]
ReadPrec CreateWorkspaces
Int -> ReadS CreateWorkspaces
ReadS [CreateWorkspaces]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateWorkspaces]
$creadListPrec :: ReadPrec [CreateWorkspaces]
readPrec :: ReadPrec CreateWorkspaces
$creadPrec :: ReadPrec CreateWorkspaces
readList :: ReadS [CreateWorkspaces]
$creadList :: ReadS [CreateWorkspaces]
readsPrec :: Int -> ReadS CreateWorkspaces
$creadsPrec :: Int -> ReadS CreateWorkspaces
Prelude.Read, Int -> CreateWorkspaces -> ShowS
[CreateWorkspaces] -> ShowS
CreateWorkspaces -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateWorkspaces] -> ShowS
$cshowList :: [CreateWorkspaces] -> ShowS
show :: CreateWorkspaces -> String
$cshow :: CreateWorkspaces -> String
showsPrec :: Int -> CreateWorkspaces -> ShowS
$cshowsPrec :: Int -> CreateWorkspaces -> ShowS
Prelude.Show, forall x. Rep CreateWorkspaces x -> CreateWorkspaces
forall x. CreateWorkspaces -> Rep CreateWorkspaces x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateWorkspaces x -> CreateWorkspaces
$cfrom :: forall x. CreateWorkspaces -> Rep CreateWorkspaces x
Prelude.Generic)

-- |
-- Create a value of 'CreateWorkspaces' 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:
--
-- 'workspaces', 'createWorkspaces_workspaces' - The WorkSpaces to create. You can specify up to 25 WorkSpaces.
newCreateWorkspaces ::
  -- | 'workspaces'
  Prelude.NonEmpty WorkspaceRequest ->
  CreateWorkspaces
newCreateWorkspaces :: NonEmpty WorkspaceRequest -> CreateWorkspaces
newCreateWorkspaces NonEmpty WorkspaceRequest
pWorkspaces_ =
  CreateWorkspaces'
    { $sel:workspaces:CreateWorkspaces' :: NonEmpty WorkspaceRequest
workspaces =
        forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced forall t b. AReview t b -> b -> t
Lens.# NonEmpty WorkspaceRequest
pWorkspaces_
    }

-- | The WorkSpaces to create. You can specify up to 25 WorkSpaces.
createWorkspaces_workspaces :: Lens.Lens' CreateWorkspaces (Prelude.NonEmpty WorkspaceRequest)
createWorkspaces_workspaces :: Lens' CreateWorkspaces (NonEmpty WorkspaceRequest)
createWorkspaces_workspaces = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateWorkspaces' {NonEmpty WorkspaceRequest
workspaces :: NonEmpty WorkspaceRequest
$sel:workspaces:CreateWorkspaces' :: CreateWorkspaces -> NonEmpty WorkspaceRequest
workspaces} -> NonEmpty WorkspaceRequest
workspaces) (\s :: CreateWorkspaces
s@CreateWorkspaces' {} NonEmpty WorkspaceRequest
a -> CreateWorkspaces
s {$sel:workspaces:CreateWorkspaces' :: NonEmpty WorkspaceRequest
workspaces = NonEmpty WorkspaceRequest
a} :: CreateWorkspaces) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

instance Core.AWSRequest CreateWorkspaces where
  type
    AWSResponse CreateWorkspaces =
      CreateWorkspacesResponse
  request :: (Service -> Service)
-> CreateWorkspaces -> Request CreateWorkspaces
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 CreateWorkspaces
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateWorkspaces)))
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 [FailedCreateWorkspaceRequest]
-> Maybe [Workspace] -> Int -> CreateWorkspacesResponse
CreateWorkspacesResponse'
            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
"FailedRequests" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ( Object
x
                            forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"PendingRequests"
                            forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                        )
            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 CreateWorkspaces where
  hashWithSalt :: Int -> CreateWorkspaces -> Int
hashWithSalt Int
_salt CreateWorkspaces' {NonEmpty WorkspaceRequest
workspaces :: NonEmpty WorkspaceRequest
$sel:workspaces:CreateWorkspaces' :: CreateWorkspaces -> NonEmpty WorkspaceRequest
..} =
    Int
_salt forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` NonEmpty WorkspaceRequest
workspaces

instance Prelude.NFData CreateWorkspaces where
  rnf :: CreateWorkspaces -> ()
rnf CreateWorkspaces' {NonEmpty WorkspaceRequest
workspaces :: NonEmpty WorkspaceRequest
$sel:workspaces:CreateWorkspaces' :: CreateWorkspaces -> NonEmpty WorkspaceRequest
..} = forall a. NFData a => a -> ()
Prelude.rnf NonEmpty WorkspaceRequest
workspaces

instance Data.ToHeaders CreateWorkspaces where
  toHeaders :: CreateWorkspaces -> 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
"WorkspacesService.CreateWorkspaces" ::
                          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 CreateWorkspaces where
  toJSON :: CreateWorkspaces -> Value
toJSON CreateWorkspaces' {NonEmpty WorkspaceRequest
workspaces :: NonEmpty WorkspaceRequest
$sel:workspaces:CreateWorkspaces' :: CreateWorkspaces -> NonEmpty WorkspaceRequest
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [forall a. a -> Maybe a
Prelude.Just (Key
"Workspaces" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= NonEmpty WorkspaceRequest
workspaces)]
      )

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

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

-- | /See:/ 'newCreateWorkspacesResponse' smart constructor.
data CreateWorkspacesResponse = CreateWorkspacesResponse'
  { -- | Information about the WorkSpaces that could not be created.
    CreateWorkspacesResponse -> Maybe [FailedCreateWorkspaceRequest]
failedRequests :: Prelude.Maybe [FailedCreateWorkspaceRequest],
    -- | Information about the WorkSpaces that were created.
    --
    -- Because this operation is asynchronous, the identifier returned is not
    -- immediately available for use with other operations. For example, if you
    -- call DescribeWorkspaces before the WorkSpace is created, the information
    -- returned can be incomplete.
    CreateWorkspacesResponse -> Maybe [Workspace]
pendingRequests :: Prelude.Maybe [Workspace],
    -- | The response's http status code.
    CreateWorkspacesResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateWorkspacesResponse -> CreateWorkspacesResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateWorkspacesResponse -> CreateWorkspacesResponse -> Bool
$c/= :: CreateWorkspacesResponse -> CreateWorkspacesResponse -> Bool
== :: CreateWorkspacesResponse -> CreateWorkspacesResponse -> Bool
$c== :: CreateWorkspacesResponse -> CreateWorkspacesResponse -> Bool
Prelude.Eq, ReadPrec [CreateWorkspacesResponse]
ReadPrec CreateWorkspacesResponse
Int -> ReadS CreateWorkspacesResponse
ReadS [CreateWorkspacesResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateWorkspacesResponse]
$creadListPrec :: ReadPrec [CreateWorkspacesResponse]
readPrec :: ReadPrec CreateWorkspacesResponse
$creadPrec :: ReadPrec CreateWorkspacesResponse
readList :: ReadS [CreateWorkspacesResponse]
$creadList :: ReadS [CreateWorkspacesResponse]
readsPrec :: Int -> ReadS CreateWorkspacesResponse
$creadsPrec :: Int -> ReadS CreateWorkspacesResponse
Prelude.Read, Int -> CreateWorkspacesResponse -> ShowS
[CreateWorkspacesResponse] -> ShowS
CreateWorkspacesResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateWorkspacesResponse] -> ShowS
$cshowList :: [CreateWorkspacesResponse] -> ShowS
show :: CreateWorkspacesResponse -> String
$cshow :: CreateWorkspacesResponse -> String
showsPrec :: Int -> CreateWorkspacesResponse -> ShowS
$cshowsPrec :: Int -> CreateWorkspacesResponse -> ShowS
Prelude.Show, forall x.
Rep CreateWorkspacesResponse x -> CreateWorkspacesResponse
forall x.
CreateWorkspacesResponse -> Rep CreateWorkspacesResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateWorkspacesResponse x -> CreateWorkspacesResponse
$cfrom :: forall x.
CreateWorkspacesResponse -> Rep CreateWorkspacesResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateWorkspacesResponse' 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:
--
-- 'failedRequests', 'createWorkspacesResponse_failedRequests' - Information about the WorkSpaces that could not be created.
--
-- 'pendingRequests', 'createWorkspacesResponse_pendingRequests' - Information about the WorkSpaces that were created.
--
-- Because this operation is asynchronous, the identifier returned is not
-- immediately available for use with other operations. For example, if you
-- call DescribeWorkspaces before the WorkSpace is created, the information
-- returned can be incomplete.
--
-- 'httpStatus', 'createWorkspacesResponse_httpStatus' - The response's http status code.
newCreateWorkspacesResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateWorkspacesResponse
newCreateWorkspacesResponse :: Int -> CreateWorkspacesResponse
newCreateWorkspacesResponse Int
pHttpStatus_ =
  CreateWorkspacesResponse'
    { $sel:failedRequests:CreateWorkspacesResponse' :: Maybe [FailedCreateWorkspaceRequest]
failedRequests =
        forall a. Maybe a
Prelude.Nothing,
      $sel:pendingRequests:CreateWorkspacesResponse' :: Maybe [Workspace]
pendingRequests = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateWorkspacesResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Information about the WorkSpaces that could not be created.
createWorkspacesResponse_failedRequests :: Lens.Lens' CreateWorkspacesResponse (Prelude.Maybe [FailedCreateWorkspaceRequest])
createWorkspacesResponse_failedRequests :: Lens'
  CreateWorkspacesResponse (Maybe [FailedCreateWorkspaceRequest])
createWorkspacesResponse_failedRequests = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateWorkspacesResponse' {Maybe [FailedCreateWorkspaceRequest]
failedRequests :: Maybe [FailedCreateWorkspaceRequest]
$sel:failedRequests:CreateWorkspacesResponse' :: CreateWorkspacesResponse -> Maybe [FailedCreateWorkspaceRequest]
failedRequests} -> Maybe [FailedCreateWorkspaceRequest]
failedRequests) (\s :: CreateWorkspacesResponse
s@CreateWorkspacesResponse' {} Maybe [FailedCreateWorkspaceRequest]
a -> CreateWorkspacesResponse
s {$sel:failedRequests:CreateWorkspacesResponse' :: Maybe [FailedCreateWorkspaceRequest]
failedRequests = Maybe [FailedCreateWorkspaceRequest]
a} :: CreateWorkspacesResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Information about the WorkSpaces that were created.
--
-- Because this operation is asynchronous, the identifier returned is not
-- immediately available for use with other operations. For example, if you
-- call DescribeWorkspaces before the WorkSpace is created, the information
-- returned can be incomplete.
createWorkspacesResponse_pendingRequests :: Lens.Lens' CreateWorkspacesResponse (Prelude.Maybe [Workspace])
createWorkspacesResponse_pendingRequests :: Lens' CreateWorkspacesResponse (Maybe [Workspace])
createWorkspacesResponse_pendingRequests = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateWorkspacesResponse' {Maybe [Workspace]
pendingRequests :: Maybe [Workspace]
$sel:pendingRequests:CreateWorkspacesResponse' :: CreateWorkspacesResponse -> Maybe [Workspace]
pendingRequests} -> Maybe [Workspace]
pendingRequests) (\s :: CreateWorkspacesResponse
s@CreateWorkspacesResponse' {} Maybe [Workspace]
a -> CreateWorkspacesResponse
s {$sel:pendingRequests:CreateWorkspacesResponse' :: Maybe [Workspace]
pendingRequests = Maybe [Workspace]
a} :: CreateWorkspacesResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

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

instance Prelude.NFData CreateWorkspacesResponse where
  rnf :: CreateWorkspacesResponse -> ()
rnf CreateWorkspacesResponse' {Int
Maybe [FailedCreateWorkspaceRequest]
Maybe [Workspace]
httpStatus :: Int
pendingRequests :: Maybe [Workspace]
failedRequests :: Maybe [FailedCreateWorkspaceRequest]
$sel:httpStatus:CreateWorkspacesResponse' :: CreateWorkspacesResponse -> Int
$sel:pendingRequests:CreateWorkspacesResponse' :: CreateWorkspacesResponse -> Maybe [Workspace]
$sel:failedRequests:CreateWorkspacesResponse' :: CreateWorkspacesResponse -> Maybe [FailedCreateWorkspaceRequest]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [FailedCreateWorkspaceRequest]
failedRequests
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [Workspace]
pendingRequests
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus