/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

#pragma once
#include <aws/sagemaker/SageMaker_EXPORTS.h>
#include <aws/sagemaker/model/S3DataType.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <utility>

namespace Aws
{
namespace Utils
{
namespace Json
{
  class JsonValue;
  class JsonView;
} // namespace Json
} // namespace Utils
namespace SageMaker
{
namespace Model
{

  /**
   * <p>Describes the S3 data source.</p><p><h3>See Also:</h3>   <a
   * href="http://docs.aws.amazon.com/goto/WebAPI/sagemaker-2017-07-24/TransformS3DataSource">AWS
   * API Reference</a></p>
   */
  class TransformS3DataSource
  {
  public:
    AWS_SAGEMAKER_API TransformS3DataSource();
    AWS_SAGEMAKER_API TransformS3DataSource(Aws::Utils::Json::JsonView jsonValue);
    AWS_SAGEMAKER_API TransformS3DataSource& operator=(Aws::Utils::Json::JsonView jsonValue);
    AWS_SAGEMAKER_API Aws::Utils::Json::JsonValue Jsonize() const;


    /**
     * <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name
     * prefix. Amazon SageMaker uses all objects with the specified key name prefix for
     * batch transform. </p> <p>If you choose <code>ManifestFile</code>,
     * <code>S3Uri</code> identifies an object that is a manifest file containing a
     * list of object keys that you want Amazon SageMaker to use for batch transform.
     * </p> <p>The following values are compatible: <code>ManifestFile</code>,
     * <code>S3Prefix</code> </p> <p>The following value is not compatible:
     * <code>AugmentedManifestFile</code> </p>
     */
    inline const S3DataType& GetS3DataType() const{ return m_s3DataType; }

    /**
     * <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name
     * prefix. Amazon SageMaker uses all objects with the specified key name prefix for
     * batch transform. </p> <p>If you choose <code>ManifestFile</code>,
     * <code>S3Uri</code> identifies an object that is a manifest file containing a
     * list of object keys that you want Amazon SageMaker to use for batch transform.
     * </p> <p>The following values are compatible: <code>ManifestFile</code>,
     * <code>S3Prefix</code> </p> <p>The following value is not compatible:
     * <code>AugmentedManifestFile</code> </p>
     */
    inline bool S3DataTypeHasBeenSet() const { return m_s3DataTypeHasBeenSet; }

    /**
     * <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name
     * prefix. Amazon SageMaker uses all objects with the specified key name prefix for
     * batch transform. </p> <p>If you choose <code>ManifestFile</code>,
     * <code>S3Uri</code> identifies an object that is a manifest file containing a
     * list of object keys that you want Amazon SageMaker to use for batch transform.
     * </p> <p>The following values are compatible: <code>ManifestFile</code>,
     * <code>S3Prefix</code> </p> <p>The following value is not compatible:
     * <code>AugmentedManifestFile</code> </p>
     */
    inline void SetS3DataType(const S3DataType& value) { m_s3DataTypeHasBeenSet = true; m_s3DataType = value; }

    /**
     * <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name
     * prefix. Amazon SageMaker uses all objects with the specified key name prefix for
     * batch transform. </p> <p>If you choose <code>ManifestFile</code>,
     * <code>S3Uri</code> identifies an object that is a manifest file containing a
     * list of object keys that you want Amazon SageMaker to use for batch transform.
     * </p> <p>The following values are compatible: <code>ManifestFile</code>,
     * <code>S3Prefix</code> </p> <p>The following value is not compatible:
     * <code>AugmentedManifestFile</code> </p>
     */
    inline void SetS3DataType(S3DataType&& value) { m_s3DataTypeHasBeenSet = true; m_s3DataType = std::move(value); }

    /**
     * <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name
     * prefix. Amazon SageMaker uses all objects with the specified key name prefix for
     * batch transform. </p> <p>If you choose <code>ManifestFile</code>,
     * <code>S3Uri</code> identifies an object that is a manifest file containing a
     * list of object keys that you want Amazon SageMaker to use for batch transform.
     * </p> <p>The following values are compatible: <code>ManifestFile</code>,
     * <code>S3Prefix</code> </p> <p>The following value is not compatible:
     * <code>AugmentedManifestFile</code> </p>
     */
    inline TransformS3DataSource& WithS3DataType(const S3DataType& value) { SetS3DataType(value); return *this;}

    /**
     * <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name
     * prefix. Amazon SageMaker uses all objects with the specified key name prefix for
     * batch transform. </p> <p>If you choose <code>ManifestFile</code>,
     * <code>S3Uri</code> identifies an object that is a manifest file containing a
     * list of object keys that you want Amazon SageMaker to use for batch transform.
     * </p> <p>The following values are compatible: <code>ManifestFile</code>,
     * <code>S3Prefix</code> </p> <p>The following value is not compatible:
     * <code>AugmentedManifestFile</code> </p>
     */
    inline TransformS3DataSource& WithS3DataType(S3DataType&& value) { SetS3DataType(std::move(value)); return *this;}


    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline const Aws::String& GetS3Uri() const{ return m_s3Uri; }

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline bool S3UriHasBeenSet() const { return m_s3UriHasBeenSet; }

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline void SetS3Uri(const Aws::String& value) { m_s3UriHasBeenSet = true; m_s3Uri = value; }

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline void SetS3Uri(Aws::String&& value) { m_s3UriHasBeenSet = true; m_s3Uri = std::move(value); }

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline void SetS3Uri(const char* value) { m_s3UriHasBeenSet = true; m_s3Uri.assign(value); }

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline TransformS3DataSource& WithS3Uri(const Aws::String& value) { SetS3Uri(value); return *this;}

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline TransformS3DataSource& WithS3Uri(Aws::String&& value) { SetS3Uri(std::move(value)); return *this;}

    /**
     * <p>Depending on the value specified for the <code>S3DataType</code>, identifies
     * either a key name prefix or a manifest. For example:</p> <ul> <li> <p> A key
     * name prefix might look like this: <code>s3://bucketname/exampleprefix</code>.
     * </p> </li> <li> <p> A manifest might look like this:
     * <code>s3://bucketname/example.manifest</code> </p> <p> The manifest is an S3
     * object which is a JSON file with the following format: </p> <p> <code>[
     * {"prefix": "s3://customer_bucket/some/prefix/"},</code> </p> <p>
     * <code>"relative/path/to/custdata-1",</code> </p> <p>
     * <code>"relative/path/custdata-2",</code> </p> <p> <code>...</code> </p> <p>
     * <code>"relative/path/custdata-N"</code> </p> <p> <code>]</code> </p> <p> The
     * preceding JSON matches the following <code>S3Uris</code>: </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/to/custdata-1</code> </p>
     * <p> <code>s3://customer_bucket/some/prefix/relative/path/custdata-2</code> </p>
     * <p> <code>...</code> </p> <p>
     * <code>s3://customer_bucket/some/prefix/relative/path/custdata-N</code> </p> <p>
     * The complete set of <code>S3Uris</code> in this manifest constitutes the input
     * data for the channel for this datasource. The object that each
     * <code>S3Uris</code> points to must be readable by the IAM role that Amazon
     * SageMaker uses to perform tasks on your behalf.</p> </li> </ul>
     */
    inline TransformS3DataSource& WithS3Uri(const char* value) { SetS3Uri(value); return *this;}

  private:

    S3DataType m_s3DataType;
    bool m_s3DataTypeHasBeenSet = false;

    Aws::String m_s3Uri;
    bool m_s3UriHasBeenSet = false;
  };

} // namespace Model
} // namespace SageMaker
} // namespace Aws