{-# 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.Rekognition.DistributeDatasetEntries
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Distributes the entries (images) in a training dataset across the
-- training dataset and the test dataset for a project.
-- @DistributeDatasetEntries@ moves 20% of the training dataset images to
-- the test dataset. An entry is a JSON Line that describes an image.
--
-- You supply the Amazon Resource Names (ARN) of a project\'s training
-- dataset and test dataset. The training dataset must contain the images
-- that you want to split. The test dataset must be empty. The datasets
-- must belong to the same project. To create training and test datasets
-- for a project, call CreateDataset.
--
-- Distributing a dataset takes a while to complete. To check the status
-- call @DescribeDataset@. The operation is complete when the @Status@
-- field for the training dataset and the test dataset is
-- @UPDATE_COMPLETE@. If the dataset split fails, the value of @Status@ is
-- @UPDATE_FAILED@.
--
-- This operation requires permissions to perform the
-- @rekognition:DistributeDatasetEntries@ action.
module Amazonka.Rekognition.DistributeDatasetEntries
  ( -- * Creating a Request
    DistributeDatasetEntries (..),
    newDistributeDatasetEntries,

    -- * Request Lenses
    distributeDatasetEntries_datasets,

    -- * Destructuring the Response
    DistributeDatasetEntriesResponse (..),
    newDistributeDatasetEntriesResponse,

    -- * Response Lenses
    distributeDatasetEntriesResponse_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 Amazonka.Rekognition.Types
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newDistributeDatasetEntries' smart constructor.
data DistributeDatasetEntries = DistributeDatasetEntries'
  { -- | The ARNS for the training dataset and test dataset that you want to use.
    -- The datasets must belong to the same project. The test dataset must be
    -- empty.
    DistributeDatasetEntries -> NonEmpty DistributeDataset
datasets :: Prelude.NonEmpty DistributeDataset
  }
  deriving (DistributeDatasetEntries -> DistributeDatasetEntries -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DistributeDatasetEntries -> DistributeDatasetEntries -> Bool
$c/= :: DistributeDatasetEntries -> DistributeDatasetEntries -> Bool
== :: DistributeDatasetEntries -> DistributeDatasetEntries -> Bool
$c== :: DistributeDatasetEntries -> DistributeDatasetEntries -> Bool
Prelude.Eq, ReadPrec [DistributeDatasetEntries]
ReadPrec DistributeDatasetEntries
Int -> ReadS DistributeDatasetEntries
ReadS [DistributeDatasetEntries]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DistributeDatasetEntries]
$creadListPrec :: ReadPrec [DistributeDatasetEntries]
readPrec :: ReadPrec DistributeDatasetEntries
$creadPrec :: ReadPrec DistributeDatasetEntries
readList :: ReadS [DistributeDatasetEntries]
$creadList :: ReadS [DistributeDatasetEntries]
readsPrec :: Int -> ReadS DistributeDatasetEntries
$creadsPrec :: Int -> ReadS DistributeDatasetEntries
Prelude.Read, Int -> DistributeDatasetEntries -> ShowS
[DistributeDatasetEntries] -> ShowS
DistributeDatasetEntries -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DistributeDatasetEntries] -> ShowS
$cshowList :: [DistributeDatasetEntries] -> ShowS
show :: DistributeDatasetEntries -> String
$cshow :: DistributeDatasetEntries -> String
showsPrec :: Int -> DistributeDatasetEntries -> ShowS
$cshowsPrec :: Int -> DistributeDatasetEntries -> ShowS
Prelude.Show, forall x.
Rep DistributeDatasetEntries x -> DistributeDatasetEntries
forall x.
DistributeDatasetEntries -> Rep DistributeDatasetEntries x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DistributeDatasetEntries x -> DistributeDatasetEntries
$cfrom :: forall x.
DistributeDatasetEntries -> Rep DistributeDatasetEntries x
Prelude.Generic)

-- |
-- Create a value of 'DistributeDatasetEntries' 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:
--
-- 'datasets', 'distributeDatasetEntries_datasets' - The ARNS for the training dataset and test dataset that you want to use.
-- The datasets must belong to the same project. The test dataset must be
-- empty.
newDistributeDatasetEntries ::
  -- | 'datasets'
  Prelude.NonEmpty DistributeDataset ->
  DistributeDatasetEntries
newDistributeDatasetEntries :: NonEmpty DistributeDataset -> DistributeDatasetEntries
newDistributeDatasetEntries NonEmpty DistributeDataset
pDatasets_ =
  DistributeDatasetEntries'
    { $sel:datasets:DistributeDatasetEntries' :: NonEmpty DistributeDataset
datasets =
        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 DistributeDataset
pDatasets_
    }

-- | The ARNS for the training dataset and test dataset that you want to use.
-- The datasets must belong to the same project. The test dataset must be
-- empty.
distributeDatasetEntries_datasets :: Lens.Lens' DistributeDatasetEntries (Prelude.NonEmpty DistributeDataset)
distributeDatasetEntries_datasets :: Lens' DistributeDatasetEntries (NonEmpty DistributeDataset)
distributeDatasetEntries_datasets = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DistributeDatasetEntries' {NonEmpty DistributeDataset
datasets :: NonEmpty DistributeDataset
$sel:datasets:DistributeDatasetEntries' :: DistributeDatasetEntries -> NonEmpty DistributeDataset
datasets} -> NonEmpty DistributeDataset
datasets) (\s :: DistributeDatasetEntries
s@DistributeDatasetEntries' {} NonEmpty DistributeDataset
a -> DistributeDatasetEntries
s {$sel:datasets:DistributeDatasetEntries' :: NonEmpty DistributeDataset
datasets = NonEmpty DistributeDataset
a} :: DistributeDatasetEntries) 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 DistributeDatasetEntries where
  type
    AWSResponse DistributeDatasetEntries =
      DistributeDatasetEntriesResponse
  request :: (Service -> Service)
-> DistributeDatasetEntries -> Request DistributeDatasetEntries
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 DistributeDatasetEntries
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DistributeDatasetEntries)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Int -> DistributeDatasetEntriesResponse
DistributeDatasetEntriesResponse'
            forall (f :: * -> *) a b. Functor 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 DistributeDatasetEntries where
  hashWithSalt :: Int -> DistributeDatasetEntries -> Int
hashWithSalt Int
_salt DistributeDatasetEntries' {NonEmpty DistributeDataset
datasets :: NonEmpty DistributeDataset
$sel:datasets:DistributeDatasetEntries' :: DistributeDatasetEntries -> NonEmpty DistributeDataset
..} =
    Int
_salt forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` NonEmpty DistributeDataset
datasets

instance Prelude.NFData DistributeDatasetEntries where
  rnf :: DistributeDatasetEntries -> ()
rnf DistributeDatasetEntries' {NonEmpty DistributeDataset
datasets :: NonEmpty DistributeDataset
$sel:datasets:DistributeDatasetEntries' :: DistributeDatasetEntries -> NonEmpty DistributeDataset
..} =
    forall a. NFData a => a -> ()
Prelude.rnf NonEmpty DistributeDataset
datasets

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

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

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

-- | /See:/ 'newDistributeDatasetEntriesResponse' smart constructor.
data DistributeDatasetEntriesResponse = DistributeDatasetEntriesResponse'
  { -- | The response's http status code.
    DistributeDatasetEntriesResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DistributeDatasetEntriesResponse
-> DistributeDatasetEntriesResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DistributeDatasetEntriesResponse
-> DistributeDatasetEntriesResponse -> Bool
$c/= :: DistributeDatasetEntriesResponse
-> DistributeDatasetEntriesResponse -> Bool
== :: DistributeDatasetEntriesResponse
-> DistributeDatasetEntriesResponse -> Bool
$c== :: DistributeDatasetEntriesResponse
-> DistributeDatasetEntriesResponse -> Bool
Prelude.Eq, ReadPrec [DistributeDatasetEntriesResponse]
ReadPrec DistributeDatasetEntriesResponse
Int -> ReadS DistributeDatasetEntriesResponse
ReadS [DistributeDatasetEntriesResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DistributeDatasetEntriesResponse]
$creadListPrec :: ReadPrec [DistributeDatasetEntriesResponse]
readPrec :: ReadPrec DistributeDatasetEntriesResponse
$creadPrec :: ReadPrec DistributeDatasetEntriesResponse
readList :: ReadS [DistributeDatasetEntriesResponse]
$creadList :: ReadS [DistributeDatasetEntriesResponse]
readsPrec :: Int -> ReadS DistributeDatasetEntriesResponse
$creadsPrec :: Int -> ReadS DistributeDatasetEntriesResponse
Prelude.Read, Int -> DistributeDatasetEntriesResponse -> ShowS
[DistributeDatasetEntriesResponse] -> ShowS
DistributeDatasetEntriesResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DistributeDatasetEntriesResponse] -> ShowS
$cshowList :: [DistributeDatasetEntriesResponse] -> ShowS
show :: DistributeDatasetEntriesResponse -> String
$cshow :: DistributeDatasetEntriesResponse -> String
showsPrec :: Int -> DistributeDatasetEntriesResponse -> ShowS
$cshowsPrec :: Int -> DistributeDatasetEntriesResponse -> ShowS
Prelude.Show, forall x.
Rep DistributeDatasetEntriesResponse x
-> DistributeDatasetEntriesResponse
forall x.
DistributeDatasetEntriesResponse
-> Rep DistributeDatasetEntriesResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DistributeDatasetEntriesResponse x
-> DistributeDatasetEntriesResponse
$cfrom :: forall x.
DistributeDatasetEntriesResponse
-> Rep DistributeDatasetEntriesResponse x
Prelude.Generic)

-- |
-- Create a value of 'DistributeDatasetEntriesResponse' 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:
--
-- 'httpStatus', 'distributeDatasetEntriesResponse_httpStatus' - The response's http status code.
newDistributeDatasetEntriesResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DistributeDatasetEntriesResponse
newDistributeDatasetEntriesResponse :: Int -> DistributeDatasetEntriesResponse
newDistributeDatasetEntriesResponse Int
pHttpStatus_ =
  DistributeDatasetEntriesResponse'
    { $sel:httpStatus:DistributeDatasetEntriesResponse' :: Int
httpStatus =
        Int
pHttpStatus_
    }

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

instance
  Prelude.NFData
    DistributeDatasetEntriesResponse
  where
  rnf :: DistributeDatasetEntriesResponse -> ()
rnf DistributeDatasetEntriesResponse' {Int
httpStatus :: Int
$sel:httpStatus:DistributeDatasetEntriesResponse' :: DistributeDatasetEntriesResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus