aws-sdk-sagemaker 0.24.0

AWS SDK for Amazon SageMaker Service
Documentation
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.

/// <p>Provides details about a labeling work team.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Workteam {
    /// <p>The name of the work team.</p>
    #[doc(hidden)]
    pub workteam_name: std::option::Option<std::string::String>,
    /// <p>A list of <code>MemberDefinition</code> objects that contains objects that identify the workers that make up the work team. </p>
    /// <p>Workforces can be created using Amazon Cognito or your own OIDC Identity Provider (IdP). For private workforces created using Amazon Cognito use <code>CognitoMemberDefinition</code>. For workforces created using your own OIDC identity provider (IdP) use <code>OidcMemberDefinition</code>.</p>
    #[doc(hidden)]
    pub member_definitions: std::option::Option<std::vec::Vec<crate::model::MemberDefinition>>,
    /// <p>The Amazon Resource Name (ARN) that identifies the work team.</p>
    #[doc(hidden)]
    pub workteam_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the workforce.</p>
    #[doc(hidden)]
    pub workforce_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Marketplace identifier for a vendor's work team.</p>
    #[doc(hidden)]
    pub product_listing_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A description of the work team.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The URI of the labeling job's user interface. Workers open this URI to start labeling your data objects.</p>
    #[doc(hidden)]
    pub sub_domain: std::option::Option<std::string::String>,
    /// <p>The date and time that the work team was created (timestamp).</p>
    #[doc(hidden)]
    pub create_date: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the work team was last updated (timestamp).</p>
    #[doc(hidden)]
    pub last_updated_date: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Configures SNS notifications of available or expiring work items for work teams.</p>
    #[doc(hidden)]
    pub notification_configuration: std::option::Option<crate::model::NotificationConfiguration>,
}
impl Workteam {
    /// <p>The name of the work team.</p>
    pub fn workteam_name(&self) -> std::option::Option<&str> {
        self.workteam_name.as_deref()
    }
    /// <p>A list of <code>MemberDefinition</code> objects that contains objects that identify the workers that make up the work team. </p>
    /// <p>Workforces can be created using Amazon Cognito or your own OIDC Identity Provider (IdP). For private workforces created using Amazon Cognito use <code>CognitoMemberDefinition</code>. For workforces created using your own OIDC identity provider (IdP) use <code>OidcMemberDefinition</code>.</p>
    pub fn member_definitions(&self) -> std::option::Option<&[crate::model::MemberDefinition]> {
        self.member_definitions.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) that identifies the work team.</p>
    pub fn workteam_arn(&self) -> std::option::Option<&str> {
        self.workteam_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the workforce.</p>
    pub fn workforce_arn(&self) -> std::option::Option<&str> {
        self.workforce_arn.as_deref()
    }
    /// <p>The Amazon Marketplace identifier for a vendor's work team.</p>
    pub fn product_listing_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.product_listing_ids.as_deref()
    }
    /// <p>A description of the work team.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The URI of the labeling job's user interface. Workers open this URI to start labeling your data objects.</p>
    pub fn sub_domain(&self) -> std::option::Option<&str> {
        self.sub_domain.as_deref()
    }
    /// <p>The date and time that the work team was created (timestamp).</p>
    pub fn create_date(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.create_date.as_ref()
    }
    /// <p>The date and time that the work team was last updated (timestamp).</p>
    pub fn last_updated_date(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_updated_date.as_ref()
    }
    /// <p>Configures SNS notifications of available or expiring work items for work teams.</p>
    pub fn notification_configuration(
        &self,
    ) -> std::option::Option<&crate::model::NotificationConfiguration> {
        self.notification_configuration.as_ref()
    }
}
/// See [`Workteam`](crate::model::Workteam).
pub mod workteam {

    /// A builder for [`Workteam`](crate::model::Workteam).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) workteam_name: std::option::Option<std::string::String>,
        pub(crate) member_definitions:
            std::option::Option<std::vec::Vec<crate::model::MemberDefinition>>,
        pub(crate) workteam_arn: std::option::Option<std::string::String>,
        pub(crate) workforce_arn: std::option::Option<std::string::String>,
        pub(crate) product_listing_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) sub_domain: std::option::Option<std::string::String>,
        pub(crate) create_date: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_updated_date: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) notification_configuration:
            std::option::Option<crate::model::NotificationConfiguration>,
    }
    impl Builder {
        /// <p>The name of the work team.</p>
        pub fn workteam_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.workteam_name = Some(input.into());
            self
        }
        /// <p>The name of the work team.</p>
        pub fn set_workteam_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.workteam_name = input;
            self
        }
        /// Appends an item to `member_definitions`.
        ///
        /// To override the contents of this collection use [`set_member_definitions`](Self::set_member_definitions).
        ///
        /// <p>A list of <code>MemberDefinition</code> objects that contains objects that identify the workers that make up the work team. </p>
        /// <p>Workforces can be created using Amazon Cognito or your own OIDC Identity Provider (IdP). For private workforces created using Amazon Cognito use <code>CognitoMemberDefinition</code>. For workforces created using your own OIDC identity provider (IdP) use <code>OidcMemberDefinition</code>.</p>
        pub fn member_definitions(mut self, input: crate::model::MemberDefinition) -> Self {
            let mut v = self.member_definitions.unwrap_or_default();
            v.push(input);
            self.member_definitions = Some(v);
            self
        }
        /// <p>A list of <code>MemberDefinition</code> objects that contains objects that identify the workers that make up the work team. </p>
        /// <p>Workforces can be created using Amazon Cognito or your own OIDC Identity Provider (IdP). For private workforces created using Amazon Cognito use <code>CognitoMemberDefinition</code>. For workforces created using your own OIDC identity provider (IdP) use <code>OidcMemberDefinition</code>.</p>
        pub fn set_member_definitions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MemberDefinition>>,
        ) -> Self {
            self.member_definitions = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) that identifies the work team.</p>
        pub fn workteam_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workteam_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) that identifies the work team.</p>
        pub fn set_workteam_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.workteam_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the workforce.</p>
        pub fn workforce_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workforce_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the workforce.</p>
        pub fn set_workforce_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.workforce_arn = input;
            self
        }
        /// Appends an item to `product_listing_ids`.
        ///
        /// To override the contents of this collection use [`set_product_listing_ids`](Self::set_product_listing_ids).
        ///
        /// <p>The Amazon Marketplace identifier for a vendor's work team.</p>
        pub fn product_listing_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.product_listing_ids.unwrap_or_default();
            v.push(input.into());
            self.product_listing_ids = Some(v);
            self
        }
        /// <p>The Amazon Marketplace identifier for a vendor's work team.</p>
        pub fn set_product_listing_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.product_listing_ids = input;
            self
        }
        /// <p>A description of the work team.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>A description of the work team.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>The URI of the labeling job's user interface. Workers open this URI to start labeling your data objects.</p>
        pub fn sub_domain(mut self, input: impl Into<std::string::String>) -> Self {
            self.sub_domain = Some(input.into());
            self
        }
        /// <p>The URI of the labeling job's user interface. Workers open this URI to start labeling your data objects.</p>
        pub fn set_sub_domain(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.sub_domain = input;
            self
        }
        /// <p>The date and time that the work team was created (timestamp).</p>
        pub fn create_date(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.create_date = Some(input);
            self
        }
        /// <p>The date and time that the work team was created (timestamp).</p>
        pub fn set_create_date(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.create_date = input;
            self
        }
        /// <p>The date and time that the work team was last updated (timestamp).</p>
        pub fn last_updated_date(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_updated_date = Some(input);
            self
        }
        /// <p>The date and time that the work team was last updated (timestamp).</p>
        pub fn set_last_updated_date(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_updated_date = input;
            self
        }
        /// <p>Configures SNS notifications of available or expiring work items for work teams.</p>
        pub fn notification_configuration(
            mut self,
            input: crate::model::NotificationConfiguration,
        ) -> Self {
            self.notification_configuration = Some(input);
            self
        }
        /// <p>Configures SNS notifications of available or expiring work items for work teams.</p>
        pub fn set_notification_configuration(
            mut self,
            input: std::option::Option<crate::model::NotificationConfiguration>,
        ) -> Self {
            self.notification_configuration = input;
            self
        }
        /// Consumes the builder and constructs a [`Workteam`](crate::model::Workteam).
        pub fn build(self) -> crate::model::Workteam {
            crate::model::Workteam {
                workteam_name: self.workteam_name,
                member_definitions: self.member_definitions,
                workteam_arn: self.workteam_arn,
                workforce_arn: self.workforce_arn,
                product_listing_ids: self.product_listing_ids,
                description: self.description,
                sub_domain: self.sub_domain,
                create_date: self.create_date,
                last_updated_date: self.last_updated_date,
                notification_configuration: self.notification_configuration,
            }
        }
    }
}
impl Workteam {
    /// Creates a new builder-style object to manufacture [`Workteam`](crate::model::Workteam).
    pub fn builder() -> crate::model::workteam::Builder {
        crate::model::workteam::Builder::default()
    }
}

/// <p>Configures Amazon SNS notifications of available or expiring work items for work teams.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NotificationConfiguration {
    /// <p>The ARN for the Amazon SNS topic to which notifications should be published.</p>
    #[doc(hidden)]
    pub notification_topic_arn: std::option::Option<std::string::String>,
}
impl NotificationConfiguration {
    /// <p>The ARN for the Amazon SNS topic to which notifications should be published.</p>
    pub fn notification_topic_arn(&self) -> std::option::Option<&str> {
        self.notification_topic_arn.as_deref()
    }
}
/// See [`NotificationConfiguration`](crate::model::NotificationConfiguration).
pub mod notification_configuration {

    /// A builder for [`NotificationConfiguration`](crate::model::NotificationConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) notification_topic_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The ARN for the Amazon SNS topic to which notifications should be published.</p>
        pub fn notification_topic_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.notification_topic_arn = Some(input.into());
            self
        }
        /// <p>The ARN for the Amazon SNS topic to which notifications should be published.</p>
        pub fn set_notification_topic_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.notification_topic_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`NotificationConfiguration`](crate::model::NotificationConfiguration).
        pub fn build(self) -> crate::model::NotificationConfiguration {
            crate::model::NotificationConfiguration {
                notification_topic_arn: self.notification_topic_arn,
            }
        }
    }
}
impl NotificationConfiguration {
    /// Creates a new builder-style object to manufacture [`NotificationConfiguration`](crate::model::NotificationConfiguration).
    pub fn builder() -> crate::model::notification_configuration::Builder {
        crate::model::notification_configuration::Builder::default()
    }
}

/// <p>Defines an Amazon Cognito or your own OIDC IdP user group that is part of a work team.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MemberDefinition {
    /// <p>The Amazon Cognito user group that is part of the work team.</p>
    #[doc(hidden)]
    pub cognito_member_definition: std::option::Option<crate::model::CognitoMemberDefinition>,
    /// <p>A list user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of <code>Groups</code>, you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team.</p>
    #[doc(hidden)]
    pub oidc_member_definition: std::option::Option<crate::model::OidcMemberDefinition>,
}
impl MemberDefinition {
    /// <p>The Amazon Cognito user group that is part of the work team.</p>
    pub fn cognito_member_definition(
        &self,
    ) -> std::option::Option<&crate::model::CognitoMemberDefinition> {
        self.cognito_member_definition.as_ref()
    }
    /// <p>A list user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of <code>Groups</code>, you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team.</p>
    pub fn oidc_member_definition(
        &self,
    ) -> std::option::Option<&crate::model::OidcMemberDefinition> {
        self.oidc_member_definition.as_ref()
    }
}
/// See [`MemberDefinition`](crate::model::MemberDefinition).
pub mod member_definition {

    /// A builder for [`MemberDefinition`](crate::model::MemberDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cognito_member_definition:
            std::option::Option<crate::model::CognitoMemberDefinition>,
        pub(crate) oidc_member_definition: std::option::Option<crate::model::OidcMemberDefinition>,
    }
    impl Builder {
        /// <p>The Amazon Cognito user group that is part of the work team.</p>
        pub fn cognito_member_definition(
            mut self,
            input: crate::model::CognitoMemberDefinition,
        ) -> Self {
            self.cognito_member_definition = Some(input);
            self
        }
        /// <p>The Amazon Cognito user group that is part of the work team.</p>
        pub fn set_cognito_member_definition(
            mut self,
            input: std::option::Option<crate::model::CognitoMemberDefinition>,
        ) -> Self {
            self.cognito_member_definition = input;
            self
        }
        /// <p>A list user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of <code>Groups</code>, you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team.</p>
        pub fn oidc_member_definition(mut self, input: crate::model::OidcMemberDefinition) -> Self {
            self.oidc_member_definition = Some(input);
            self
        }
        /// <p>A list user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of <code>Groups</code>, you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team.</p>
        pub fn set_oidc_member_definition(
            mut self,
            input: std::option::Option<crate::model::OidcMemberDefinition>,
        ) -> Self {
            self.oidc_member_definition = input;
            self
        }
        /// Consumes the builder and constructs a [`MemberDefinition`](crate::model::MemberDefinition).
        pub fn build(self) -> crate::model::MemberDefinition {
            crate::model::MemberDefinition {
                cognito_member_definition: self.cognito_member_definition,
                oidc_member_definition: self.oidc_member_definition,
            }
        }
    }
}
impl MemberDefinition {
    /// Creates a new builder-style object to manufacture [`MemberDefinition`](crate::model::MemberDefinition).
    pub fn builder() -> crate::model::member_definition::Builder {
        crate::model::member_definition::Builder::default()
    }
}

/// <p>A list of user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of <code>Groups</code>, you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OidcMemberDefinition {
    /// <p>A list of comma seperated strings that identifies user groups in your OIDC IdP. Each user group is made up of a group of private workers.</p>
    #[doc(hidden)]
    pub groups: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl OidcMemberDefinition {
    /// <p>A list of comma seperated strings that identifies user groups in your OIDC IdP. Each user group is made up of a group of private workers.</p>
    pub fn groups(&self) -> std::option::Option<&[std::string::String]> {
        self.groups.as_deref()
    }
}
/// See [`OidcMemberDefinition`](crate::model::OidcMemberDefinition).
pub mod oidc_member_definition {

    /// A builder for [`OidcMemberDefinition`](crate::model::OidcMemberDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) groups: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `groups`.
        ///
        /// To override the contents of this collection use [`set_groups`](Self::set_groups).
        ///
        /// <p>A list of comma seperated strings that identifies user groups in your OIDC IdP. Each user group is made up of a group of private workers.</p>
        pub fn groups(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.groups.unwrap_or_default();
            v.push(input.into());
            self.groups = Some(v);
            self
        }
        /// <p>A list of comma seperated strings that identifies user groups in your OIDC IdP. Each user group is made up of a group of private workers.</p>
        pub fn set_groups(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.groups = input;
            self
        }
        /// Consumes the builder and constructs a [`OidcMemberDefinition`](crate::model::OidcMemberDefinition).
        pub fn build(self) -> crate::model::OidcMemberDefinition {
            crate::model::OidcMemberDefinition {
                groups: self.groups,
            }
        }
    }
}
impl OidcMemberDefinition {
    /// Creates a new builder-style object to manufacture [`OidcMemberDefinition`](crate::model::OidcMemberDefinition).
    pub fn builder() -> crate::model::oidc_member_definition::Builder {
        crate::model::oidc_member_definition::Builder::default()
    }
}

/// <p>Identifies a Amazon Cognito user group. A user group can be used in on or more work teams.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CognitoMemberDefinition {
    /// <p>An identifier for a user pool. The user pool must be in the same region as the service that you are calling.</p>
    #[doc(hidden)]
    pub user_pool: std::option::Option<std::string::String>,
    /// <p>An identifier for a user group.</p>
    #[doc(hidden)]
    pub user_group: std::option::Option<std::string::String>,
    /// <p>An identifier for an application client. You must create the app client ID using Amazon Cognito.</p>
    #[doc(hidden)]
    pub client_id: std::option::Option<std::string::String>,
}
impl CognitoMemberDefinition {
    /// <p>An identifier for a user pool. The user pool must be in the same region as the service that you are calling.</p>
    pub fn user_pool(&self) -> std::option::Option<&str> {
        self.user_pool.as_deref()
    }
    /// <p>An identifier for a user group.</p>
    pub fn user_group(&self) -> std::option::Option<&str> {
        self.user_group.as_deref()
    }
    /// <p>An identifier for an application client. You must create the app client ID using Amazon Cognito.</p>
    pub fn client_id(&self) -> std::option::Option<&str> {
        self.client_id.as_deref()
    }
}
/// See [`CognitoMemberDefinition`](crate::model::CognitoMemberDefinition).
pub mod cognito_member_definition {

    /// A builder for [`CognitoMemberDefinition`](crate::model::CognitoMemberDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) user_pool: std::option::Option<std::string::String>,
        pub(crate) user_group: std::option::Option<std::string::String>,
        pub(crate) client_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>An identifier for a user pool. The user pool must be in the same region as the service that you are calling.</p>
        pub fn user_pool(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_pool = Some(input.into());
            self
        }
        /// <p>An identifier for a user pool. The user pool must be in the same region as the service that you are calling.</p>
        pub fn set_user_pool(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.user_pool = input;
            self
        }
        /// <p>An identifier for a user group.</p>
        pub fn user_group(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_group = Some(input.into());
            self
        }
        /// <p>An identifier for a user group.</p>
        pub fn set_user_group(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.user_group = input;
            self
        }
        /// <p>An identifier for an application client. You must create the app client ID using Amazon Cognito.</p>
        pub fn client_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.client_id = Some(input.into());
            self
        }
        /// <p>An identifier for an application client. You must create the app client ID using Amazon Cognito.</p>
        pub fn set_client_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.client_id = input;
            self
        }
        /// Consumes the builder and constructs a [`CognitoMemberDefinition`](crate::model::CognitoMemberDefinition).
        pub fn build(self) -> crate::model::CognitoMemberDefinition {
            crate::model::CognitoMemberDefinition {
                user_pool: self.user_pool,
                user_group: self.user_group,
                client_id: self.client_id,
            }
        }
    }
}
impl CognitoMemberDefinition {
    /// Creates a new builder-style object to manufacture [`CognitoMemberDefinition`](crate::model::CognitoMemberDefinition).
    pub fn builder() -> crate::model::cognito_member_definition::Builder {
        crate::model::cognito_member_definition::Builder::default()
    }
}

/// <p>A single private workforce, which is automatically created when you create your first private work team. You can create one private work force in each Amazon Web Services Region. By default, any workforce-related API operation used in a specific region will apply to the workforce created in that region. To learn how to create a private workforce, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-workforce-create-private.html">Create a Private Workforce</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Workforce {
    /// <p>The name of the private workforce.</p>
    #[doc(hidden)]
    pub workforce_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the private workforce.</p>
    #[doc(hidden)]
    pub workforce_arn: std::option::Option<std::string::String>,
    /// <p>The most recent date that was used to successfully add one or more IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to a private workforce's allow list.</p>
    #[doc(hidden)]
    pub last_updated_date: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A list of one to ten IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to be added to the workforce allow list. By default, a workforce isn't restricted to specific IP addresses.</p>
    #[doc(hidden)]
    pub source_ip_config: std::option::Option<crate::model::SourceIpConfig>,
    /// <p>The subdomain for your OIDC Identity Provider.</p>
    #[doc(hidden)]
    pub sub_domain: std::option::Option<std::string::String>,
    /// <p>The configuration of an Amazon Cognito workforce. A single Cognito workforce is created using and corresponds to a single <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> Amazon Cognito user pool</a>.</p>
    #[doc(hidden)]
    pub cognito_config: std::option::Option<crate::model::CognitoConfig>,
    /// <p>The configuration of an OIDC Identity Provider (IdP) private workforce.</p>
    #[doc(hidden)]
    pub oidc_config: std::option::Option<crate::model::OidcConfigForResponse>,
    /// <p>The date that the workforce is created.</p>
    #[doc(hidden)]
    pub create_date: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The configuration of a VPC workforce.</p>
    #[doc(hidden)]
    pub workforce_vpc_config: std::option::Option<crate::model::WorkforceVpcConfigResponse>,
    /// <p>The status of your workforce.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::WorkforceStatus>,
    /// <p>The reason your workforce failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl Workforce {
    /// <p>The name of the private workforce.</p>
    pub fn workforce_name(&self) -> std::option::Option<&str> {
        self.workforce_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the private workforce.</p>
    pub fn workforce_arn(&self) -> std::option::Option<&str> {
        self.workforce_arn.as_deref()
    }
    /// <p>The most recent date that was used to successfully add one or more IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to a private workforce's allow list.</p>
    pub fn last_updated_date(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_updated_date.as_ref()
    }
    /// <p>A list of one to ten IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to be added to the workforce allow list. By default, a workforce isn't restricted to specific IP addresses.</p>
    pub fn source_ip_config(&self) -> std::option::Option<&crate::model::SourceIpConfig> {
        self.source_ip_config.as_ref()
    }
    /// <p>The subdomain for your OIDC Identity Provider.</p>
    pub fn sub_domain(&self) -> std::option::Option<&str> {
        self.sub_domain.as_deref()
    }
    /// <p>The configuration of an Amazon Cognito workforce. A single Cognito workforce is created using and corresponds to a single <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> Amazon Cognito user pool</a>.</p>
    pub fn cognito_config(&self) -> std::option::Option<&crate::model::CognitoConfig> {
        self.cognito_config.as_ref()
    }
    /// <p>The configuration of an OIDC Identity Provider (IdP) private workforce.</p>
    pub fn oidc_config(&self) -> std::option::Option<&crate::model::OidcConfigForResponse> {
        self.oidc_config.as_ref()
    }
    /// <p>The date that the workforce is created.</p>
    pub fn create_date(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.create_date.as_ref()
    }
    /// <p>The configuration of a VPC workforce.</p>
    pub fn workforce_vpc_config(
        &self,
    ) -> std::option::Option<&crate::model::WorkforceVpcConfigResponse> {
        self.workforce_vpc_config.as_ref()
    }
    /// <p>The status of your workforce.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::WorkforceStatus> {
        self.status.as_ref()
    }
    /// <p>The reason your workforce failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`Workforce`](crate::model::Workforce).
pub mod workforce {

    /// A builder for [`Workforce`](crate::model::Workforce).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) workforce_name: std::option::Option<std::string::String>,
        pub(crate) workforce_arn: std::option::Option<std::string::String>,
        pub(crate) last_updated_date: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) source_ip_config: std::option::Option<crate::model::SourceIpConfig>,
        pub(crate) sub_domain: std::option::Option<std::string::String>,
        pub(crate) cognito_config: std::option::Option<crate::model::CognitoConfig>,
        pub(crate) oidc_config: std::option::Option<crate::model::OidcConfigForResponse>,
        pub(crate) create_date: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) workforce_vpc_config:
            std::option::Option<crate::model::WorkforceVpcConfigResponse>,
        pub(crate) status: std::option::Option<crate::model::WorkforceStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the private workforce.</p>
        pub fn workforce_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.workforce_name = Some(input.into());
            self
        }
        /// <p>The name of the private workforce.</p>
        pub fn set_workforce_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.workforce_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the private workforce.</p>
        pub fn workforce_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workforce_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the private workforce.</p>
        pub fn set_workforce_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.workforce_arn = input;
            self
        }
        /// <p>The most recent date that was used to successfully add one or more IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to a private workforce's allow list.</p>
        pub fn last_updated_date(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_updated_date = Some(input);
            self
        }
        /// <p>The most recent date that was used to successfully add one or more IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to a private workforce's allow list.</p>
        pub fn set_last_updated_date(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_updated_date = input;
            self
        }
        /// <p>A list of one to ten IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to be added to the workforce allow list. By default, a workforce isn't restricted to specific IP addresses.</p>
        pub fn source_ip_config(mut self, input: crate::model::SourceIpConfig) -> Self {
            self.source_ip_config = Some(input);
            self
        }
        /// <p>A list of one to ten IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>) to be added to the workforce allow list. By default, a workforce isn't restricted to specific IP addresses.</p>
        pub fn set_source_ip_config(
            mut self,
            input: std::option::Option<crate::model::SourceIpConfig>,
        ) -> Self {
            self.source_ip_config = input;
            self
        }
        /// <p>The subdomain for your OIDC Identity Provider.</p>
        pub fn sub_domain(mut self, input: impl Into<std::string::String>) -> Self {
            self.sub_domain = Some(input.into());
            self
        }
        /// <p>The subdomain for your OIDC Identity Provider.</p>
        pub fn set_sub_domain(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.sub_domain = input;
            self
        }
        /// <p>The configuration of an Amazon Cognito workforce. A single Cognito workforce is created using and corresponds to a single <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> Amazon Cognito user pool</a>.</p>
        pub fn cognito_config(mut self, input: crate::model::CognitoConfig) -> Self {
            self.cognito_config = Some(input);
            self
        }
        /// <p>The configuration of an Amazon Cognito workforce. A single Cognito workforce is created using and corresponds to a single <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> Amazon Cognito user pool</a>.</p>
        pub fn set_cognito_config(
            mut self,
            input: std::option::Option<crate::model::CognitoConfig>,
        ) -> Self {
            self.cognito_config = input;
            self
        }
        /// <p>The configuration of an OIDC Identity Provider (IdP) private workforce.</p>
        pub fn oidc_config(mut self, input: crate::model::OidcConfigForResponse) -> Self {
            self.oidc_config = Some(input);
            self
        }
        /// <p>The configuration of an OIDC Identity Provider (IdP) private workforce.</p>
        pub fn set_oidc_config(
            mut self,
            input: std::option::Option<crate::model::OidcConfigForResponse>,
        ) -> Self {
            self.oidc_config = input;
            self
        }
        /// <p>The date that the workforce is created.</p>
        pub fn create_date(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.create_date = Some(input);
            self
        }
        /// <p>The date that the workforce is created.</p>
        pub fn set_create_date(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.create_date = input;
            self
        }
        /// <p>The configuration of a VPC workforce.</p>
        pub fn workforce_vpc_config(
            mut self,
            input: crate::model::WorkforceVpcConfigResponse,
        ) -> Self {
            self.workforce_vpc_config = Some(input);
            self
        }
        /// <p>The configuration of a VPC workforce.</p>
        pub fn set_workforce_vpc_config(
            mut self,
            input: std::option::Option<crate::model::WorkforceVpcConfigResponse>,
        ) -> Self {
            self.workforce_vpc_config = input;
            self
        }
        /// <p>The status of your workforce.</p>
        pub fn status(mut self, input: crate::model::WorkforceStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of your workforce.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::WorkforceStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The reason your workforce failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The reason your workforce failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`Workforce`](crate::model::Workforce).
        pub fn build(self) -> crate::model::Workforce {
            crate::model::Workforce {
                workforce_name: self.workforce_name,
                workforce_arn: self.workforce_arn,
                last_updated_date: self.last_updated_date,
                source_ip_config: self.source_ip_config,
                sub_domain: self.sub_domain,
                cognito_config: self.cognito_config,
                oidc_config: self.oidc_config,
                create_date: self.create_date,
                workforce_vpc_config: self.workforce_vpc_config,
                status: self.status,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl Workforce {
    /// Creates a new builder-style object to manufacture [`Workforce`](crate::model::Workforce).
    pub fn builder() -> crate::model::workforce::Builder {
        crate::model::workforce::Builder::default()
    }
}

/// When writing a match expression against `WorkforceStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let workforcestatus = unimplemented!();
/// match workforcestatus {
///     WorkforceStatus::Active => { /* ... */ },
///     WorkforceStatus::Deleting => { /* ... */ },
///     WorkforceStatus::Failed => { /* ... */ },
///     WorkforceStatus::Initializing => { /* ... */ },
///     WorkforceStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `workforcestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `WorkforceStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `WorkforceStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `WorkforceStatus::NewFeature` is defined.
/// Specifically, when `workforcestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `WorkforceStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum WorkforceStatus {
    #[allow(missing_docs)] // documentation missing in model
    Active,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Initializing,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for WorkforceStatus {
    fn from(s: &str) -> Self {
        match s {
            "Active" => WorkforceStatus::Active,
            "Deleting" => WorkforceStatus::Deleting,
            "Failed" => WorkforceStatus::Failed,
            "Initializing" => WorkforceStatus::Initializing,
            "Updating" => WorkforceStatus::Updating,
            other => WorkforceStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for WorkforceStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(WorkforceStatus::from(s))
    }
}
impl WorkforceStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            WorkforceStatus::Active => "Active",
            WorkforceStatus::Deleting => "Deleting",
            WorkforceStatus::Failed => "Failed",
            WorkforceStatus::Initializing => "Initializing",
            WorkforceStatus::Updating => "Updating",
            WorkforceStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Active", "Deleting", "Failed", "Initializing", "Updating"]
    }
}
impl AsRef<str> for WorkforceStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A VpcConfig object that specifies the VPC that you want your workforce to connect to.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct WorkforceVpcConfigResponse {
    /// <p>The ID of the VPC that the workforce uses for communication.</p>
    #[doc(hidden)]
    pub vpc_id: std::option::Option<std::string::String>,
    /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The ID of the subnets in the VPC that you want to connect.</p>
    #[doc(hidden)]
    pub subnets: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The IDs for the VPC service endpoints of your VPC workforce when it is created and updated.</p>
    #[doc(hidden)]
    pub vpc_endpoint_id: std::option::Option<std::string::String>,
}
impl WorkforceVpcConfigResponse {
    /// <p>The ID of the VPC that the workforce uses for communication.</p>
    pub fn vpc_id(&self) -> std::option::Option<&str> {
        self.vpc_id.as_deref()
    }
    /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
    /// <p>The ID of the subnets in the VPC that you want to connect.</p>
    pub fn subnets(&self) -> std::option::Option<&[std::string::String]> {
        self.subnets.as_deref()
    }
    /// <p>The IDs for the VPC service endpoints of your VPC workforce when it is created and updated.</p>
    pub fn vpc_endpoint_id(&self) -> std::option::Option<&str> {
        self.vpc_endpoint_id.as_deref()
    }
}
/// See [`WorkforceVpcConfigResponse`](crate::model::WorkforceVpcConfigResponse).
pub mod workforce_vpc_config_response {

    /// A builder for [`WorkforceVpcConfigResponse`](crate::model::WorkforceVpcConfigResponse).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) vpc_id: std::option::Option<std::string::String>,
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) subnets: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) vpc_endpoint_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The ID of the VPC that the workforce uses for communication.</p>
        pub fn vpc_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.vpc_id = Some(input.into());
            self
        }
        /// <p>The ID of the VPC that the workforce uses for communication.</p>
        pub fn set_vpc_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.vpc_id = input;
            self
        }
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// Appends an item to `subnets`.
        ///
        /// To override the contents of this collection use [`set_subnets`](Self::set_subnets).
        ///
        /// <p>The ID of the subnets in the VPC that you want to connect.</p>
        pub fn subnets(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.subnets.unwrap_or_default();
            v.push(input.into());
            self.subnets = Some(v);
            self
        }
        /// <p>The ID of the subnets in the VPC that you want to connect.</p>
        pub fn set_subnets(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.subnets = input;
            self
        }
        /// <p>The IDs for the VPC service endpoints of your VPC workforce when it is created and updated.</p>
        pub fn vpc_endpoint_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.vpc_endpoint_id = Some(input.into());
            self
        }
        /// <p>The IDs for the VPC service endpoints of your VPC workforce when it is created and updated.</p>
        pub fn set_vpc_endpoint_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.vpc_endpoint_id = input;
            self
        }
        /// Consumes the builder and constructs a [`WorkforceVpcConfigResponse`](crate::model::WorkforceVpcConfigResponse).
        pub fn build(self) -> crate::model::WorkforceVpcConfigResponse {
            crate::model::WorkforceVpcConfigResponse {
                vpc_id: self.vpc_id,
                security_group_ids: self.security_group_ids,
                subnets: self.subnets,
                vpc_endpoint_id: self.vpc_endpoint_id,
            }
        }
    }
}
impl WorkforceVpcConfigResponse {
    /// Creates a new builder-style object to manufacture [`WorkforceVpcConfigResponse`](crate::model::WorkforceVpcConfigResponse).
    pub fn builder() -> crate::model::workforce_vpc_config_response::Builder {
        crate::model::workforce_vpc_config_response::Builder::default()
    }
}

/// <p>Your OIDC IdP workforce configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OidcConfigForResponse {
    /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
    #[doc(hidden)]
    pub client_id: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
    #[doc(hidden)]
    pub issuer: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub authorization_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub token_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub user_info_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub logout_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
    #[doc(hidden)]
    pub jwks_uri: std::option::Option<std::string::String>,
}
impl OidcConfigForResponse {
    /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
    pub fn client_id(&self) -> std::option::Option<&str> {
        self.client_id.as_deref()
    }
    /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
    pub fn issuer(&self) -> std::option::Option<&str> {
        self.issuer.as_deref()
    }
    /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
    pub fn authorization_endpoint(&self) -> std::option::Option<&str> {
        self.authorization_endpoint.as_deref()
    }
    /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
    pub fn token_endpoint(&self) -> std::option::Option<&str> {
        self.token_endpoint.as_deref()
    }
    /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
    pub fn user_info_endpoint(&self) -> std::option::Option<&str> {
        self.user_info_endpoint.as_deref()
    }
    /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
    pub fn logout_endpoint(&self) -> std::option::Option<&str> {
        self.logout_endpoint.as_deref()
    }
    /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
    pub fn jwks_uri(&self) -> std::option::Option<&str> {
        self.jwks_uri.as_deref()
    }
}
/// See [`OidcConfigForResponse`](crate::model::OidcConfigForResponse).
pub mod oidc_config_for_response {

    /// A builder for [`OidcConfigForResponse`](crate::model::OidcConfigForResponse).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) client_id: std::option::Option<std::string::String>,
        pub(crate) issuer: std::option::Option<std::string::String>,
        pub(crate) authorization_endpoint: std::option::Option<std::string::String>,
        pub(crate) token_endpoint: std::option::Option<std::string::String>,
        pub(crate) user_info_endpoint: std::option::Option<std::string::String>,
        pub(crate) logout_endpoint: std::option::Option<std::string::String>,
        pub(crate) jwks_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
        pub fn client_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.client_id = Some(input.into());
            self
        }
        /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
        pub fn set_client_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.client_id = input;
            self
        }
        /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
        pub fn issuer(mut self, input: impl Into<std::string::String>) -> Self {
            self.issuer = Some(input.into());
            self
        }
        /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
        pub fn set_issuer(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.issuer = input;
            self
        }
        /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
        pub fn authorization_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.authorization_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
        pub fn set_authorization_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.authorization_endpoint = input;
            self
        }
        /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
        pub fn token_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.token_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
        pub fn set_token_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.token_endpoint = input;
            self
        }
        /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
        pub fn user_info_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_info_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
        pub fn set_user_info_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.user_info_endpoint = input;
            self
        }
        /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
        pub fn logout_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.logout_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
        pub fn set_logout_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.logout_endpoint = input;
            self
        }
        /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
        pub fn jwks_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.jwks_uri = Some(input.into());
            self
        }
        /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
        pub fn set_jwks_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.jwks_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`OidcConfigForResponse`](crate::model::OidcConfigForResponse).
        pub fn build(self) -> crate::model::OidcConfigForResponse {
            crate::model::OidcConfigForResponse {
                client_id: self.client_id,
                issuer: self.issuer,
                authorization_endpoint: self.authorization_endpoint,
                token_endpoint: self.token_endpoint,
                user_info_endpoint: self.user_info_endpoint,
                logout_endpoint: self.logout_endpoint,
                jwks_uri: self.jwks_uri,
            }
        }
    }
}
impl OidcConfigForResponse {
    /// Creates a new builder-style object to manufacture [`OidcConfigForResponse`](crate::model::OidcConfigForResponse).
    pub fn builder() -> crate::model::oidc_config_for_response::Builder {
        crate::model::oidc_config_for_response::Builder::default()
    }
}

/// <p>Use this parameter to configure your Amazon Cognito workforce. A single Cognito workforce is created using and corresponds to a single <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> Amazon Cognito user pool</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CognitoConfig {
    /// <p>A <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> user pool</a> is a user directory in Amazon Cognito. With a user pool, your users can sign in to your web or mobile app through Amazon Cognito. Your users can also sign in through social identity providers like Google, Facebook, Amazon, or Apple, and through SAML identity providers.</p>
    #[doc(hidden)]
    pub user_pool: std::option::Option<std::string::String>,
    /// <p>The client ID for your Amazon Cognito user pool.</p>
    #[doc(hidden)]
    pub client_id: std::option::Option<std::string::String>,
}
impl CognitoConfig {
    /// <p>A <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> user pool</a> is a user directory in Amazon Cognito. With a user pool, your users can sign in to your web or mobile app through Amazon Cognito. Your users can also sign in through social identity providers like Google, Facebook, Amazon, or Apple, and through SAML identity providers.</p>
    pub fn user_pool(&self) -> std::option::Option<&str> {
        self.user_pool.as_deref()
    }
    /// <p>The client ID for your Amazon Cognito user pool.</p>
    pub fn client_id(&self) -> std::option::Option<&str> {
        self.client_id.as_deref()
    }
}
/// See [`CognitoConfig`](crate::model::CognitoConfig).
pub mod cognito_config {

    /// A builder for [`CognitoConfig`](crate::model::CognitoConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) user_pool: std::option::Option<std::string::String>,
        pub(crate) client_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> user pool</a> is a user directory in Amazon Cognito. With a user pool, your users can sign in to your web or mobile app through Amazon Cognito. Your users can also sign in through social identity providers like Google, Facebook, Amazon, or Apple, and through SAML identity providers.</p>
        pub fn user_pool(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_pool = Some(input.into());
            self
        }
        /// <p>A <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html"> user pool</a> is a user directory in Amazon Cognito. With a user pool, your users can sign in to your web or mobile app through Amazon Cognito. Your users can also sign in through social identity providers like Google, Facebook, Amazon, or Apple, and through SAML identity providers.</p>
        pub fn set_user_pool(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.user_pool = input;
            self
        }
        /// <p>The client ID for your Amazon Cognito user pool.</p>
        pub fn client_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.client_id = Some(input.into());
            self
        }
        /// <p>The client ID for your Amazon Cognito user pool.</p>
        pub fn set_client_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.client_id = input;
            self
        }
        /// Consumes the builder and constructs a [`CognitoConfig`](crate::model::CognitoConfig).
        pub fn build(self) -> crate::model::CognitoConfig {
            crate::model::CognitoConfig {
                user_pool: self.user_pool,
                client_id: self.client_id,
            }
        }
    }
}
impl CognitoConfig {
    /// Creates a new builder-style object to manufacture [`CognitoConfig`](crate::model::CognitoConfig).
    pub fn builder() -> crate::model::cognito_config::Builder {
        crate::model::cognito_config::Builder::default()
    }
}

/// <p>A list of IP address ranges (<a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">CIDRs</a>). Used to create an allow list of IP addresses for a private workforce. Workers will only be able to login to their worker portal from an IP address within this range. By default, a workforce isn't restricted to specific IP addresses.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SourceIpConfig {
    /// <p>A list of one to ten <a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">Classless Inter-Domain Routing</a> (CIDR) values.</p>
    /// <p>Maximum: Ten CIDR values</p> <note>
    /// <p>The following Length Constraints apply to individual CIDR values in the CIDR value list.</p>
    /// </note>
    #[doc(hidden)]
    pub cidrs: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl SourceIpConfig {
    /// <p>A list of one to ten <a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">Classless Inter-Domain Routing</a> (CIDR) values.</p>
    /// <p>Maximum: Ten CIDR values</p> <note>
    /// <p>The following Length Constraints apply to individual CIDR values in the CIDR value list.</p>
    /// </note>
    pub fn cidrs(&self) -> std::option::Option<&[std::string::String]> {
        self.cidrs.as_deref()
    }
}
/// See [`SourceIpConfig`](crate::model::SourceIpConfig).
pub mod source_ip_config {

    /// A builder for [`SourceIpConfig`](crate::model::SourceIpConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cidrs: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `cidrs`.
        ///
        /// To override the contents of this collection use [`set_cidrs`](Self::set_cidrs).
        ///
        /// <p>A list of one to ten <a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">Classless Inter-Domain Routing</a> (CIDR) values.</p>
        /// <p>Maximum: Ten CIDR values</p> <note>
        /// <p>The following Length Constraints apply to individual CIDR values in the CIDR value list.</p>
        /// </note>
        pub fn cidrs(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.cidrs.unwrap_or_default();
            v.push(input.into());
            self.cidrs = Some(v);
            self
        }
        /// <p>A list of one to ten <a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html">Classless Inter-Domain Routing</a> (CIDR) values.</p>
        /// <p>Maximum: Ten CIDR values</p> <note>
        /// <p>The following Length Constraints apply to individual CIDR values in the CIDR value list.</p>
        /// </note>
        pub fn set_cidrs(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.cidrs = input;
            self
        }
        /// Consumes the builder and constructs a [`SourceIpConfig`](crate::model::SourceIpConfig).
        pub fn build(self) -> crate::model::SourceIpConfig {
            crate::model::SourceIpConfig { cidrs: self.cidrs }
        }
    }
}
impl SourceIpConfig {
    /// Creates a new builder-style object to manufacture [`SourceIpConfig`](crate::model::SourceIpConfig).
    pub fn builder() -> crate::model::source_ip_config::Builder {
        crate::model::source_ip_config::Builder::default()
    }
}

/// <p>The VPC object you use to create or update a workforce.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct WorkforceVpcConfigRequest {
    /// <p>The ID of the VPC that the workforce uses for communication.</p>
    #[doc(hidden)]
    pub vpc_id: std::option::Option<std::string::String>,
    /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The ID of the subnets in the VPC that you want to connect.</p>
    #[doc(hidden)]
    pub subnets: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl WorkforceVpcConfigRequest {
    /// <p>The ID of the VPC that the workforce uses for communication.</p>
    pub fn vpc_id(&self) -> std::option::Option<&str> {
        self.vpc_id.as_deref()
    }
    /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
    /// <p>The ID of the subnets in the VPC that you want to connect.</p>
    pub fn subnets(&self) -> std::option::Option<&[std::string::String]> {
        self.subnets.as_deref()
    }
}
/// See [`WorkforceVpcConfigRequest`](crate::model::WorkforceVpcConfigRequest).
pub mod workforce_vpc_config_request {

    /// A builder for [`WorkforceVpcConfigRequest`](crate::model::WorkforceVpcConfigRequest).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) vpc_id: std::option::Option<std::string::String>,
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) subnets: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The ID of the VPC that the workforce uses for communication.</p>
        pub fn vpc_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.vpc_id = Some(input.into());
            self
        }
        /// <p>The ID of the VPC that the workforce uses for communication.</p>
        pub fn set_vpc_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.vpc_id = input;
            self
        }
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// Appends an item to `subnets`.
        ///
        /// To override the contents of this collection use [`set_subnets`](Self::set_subnets).
        ///
        /// <p>The ID of the subnets in the VPC that you want to connect.</p>
        pub fn subnets(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.subnets.unwrap_or_default();
            v.push(input.into());
            self.subnets = Some(v);
            self
        }
        /// <p>The ID of the subnets in the VPC that you want to connect.</p>
        pub fn set_subnets(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.subnets = input;
            self
        }
        /// Consumes the builder and constructs a [`WorkforceVpcConfigRequest`](crate::model::WorkforceVpcConfigRequest).
        pub fn build(self) -> crate::model::WorkforceVpcConfigRequest {
            crate::model::WorkforceVpcConfigRequest {
                vpc_id: self.vpc_id,
                security_group_ids: self.security_group_ids,
                subnets: self.subnets,
            }
        }
    }
}
impl WorkforceVpcConfigRequest {
    /// Creates a new builder-style object to manufacture [`WorkforceVpcConfigRequest`](crate::model::WorkforceVpcConfigRequest).
    pub fn builder() -> crate::model::workforce_vpc_config_request::Builder {
        crate::model::workforce_vpc_config_request::Builder::default()
    }
}

/// <p>Use this parameter to configure your OIDC Identity Provider (IdP).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq)]
pub struct OidcConfig {
    /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
    #[doc(hidden)]
    pub client_id: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP client secret used to configure your private workforce.</p>
    #[doc(hidden)]
    pub client_secret: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
    #[doc(hidden)]
    pub issuer: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub authorization_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub token_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub user_info_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
    #[doc(hidden)]
    pub logout_endpoint: std::option::Option<std::string::String>,
    /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
    #[doc(hidden)]
    pub jwks_uri: std::option::Option<std::string::String>,
}
impl OidcConfig {
    /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
    pub fn client_id(&self) -> std::option::Option<&str> {
        self.client_id.as_deref()
    }
    /// <p>The OIDC IdP client secret used to configure your private workforce.</p>
    pub fn client_secret(&self) -> std::option::Option<&str> {
        self.client_secret.as_deref()
    }
    /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
    pub fn issuer(&self) -> std::option::Option<&str> {
        self.issuer.as_deref()
    }
    /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
    pub fn authorization_endpoint(&self) -> std::option::Option<&str> {
        self.authorization_endpoint.as_deref()
    }
    /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
    pub fn token_endpoint(&self) -> std::option::Option<&str> {
        self.token_endpoint.as_deref()
    }
    /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
    pub fn user_info_endpoint(&self) -> std::option::Option<&str> {
        self.user_info_endpoint.as_deref()
    }
    /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
    pub fn logout_endpoint(&self) -> std::option::Option<&str> {
        self.logout_endpoint.as_deref()
    }
    /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
    pub fn jwks_uri(&self) -> std::option::Option<&str> {
        self.jwks_uri.as_deref()
    }
}
impl std::fmt::Debug for OidcConfig {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let mut formatter = f.debug_struct("OidcConfig");
        formatter.field("client_id", &self.client_id);
        formatter.field("client_secret", &"*** Sensitive Data Redacted ***");
        formatter.field("issuer", &self.issuer);
        formatter.field("authorization_endpoint", &self.authorization_endpoint);
        formatter.field("token_endpoint", &self.token_endpoint);
        formatter.field("user_info_endpoint", &self.user_info_endpoint);
        formatter.field("logout_endpoint", &self.logout_endpoint);
        formatter.field("jwks_uri", &self.jwks_uri);
        formatter.finish()
    }
}
/// See [`OidcConfig`](crate::model::OidcConfig).
pub mod oidc_config {

    /// A builder for [`OidcConfig`](crate::model::OidcConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default)]
    pub struct Builder {
        pub(crate) client_id: std::option::Option<std::string::String>,
        pub(crate) client_secret: std::option::Option<std::string::String>,
        pub(crate) issuer: std::option::Option<std::string::String>,
        pub(crate) authorization_endpoint: std::option::Option<std::string::String>,
        pub(crate) token_endpoint: std::option::Option<std::string::String>,
        pub(crate) user_info_endpoint: std::option::Option<std::string::String>,
        pub(crate) logout_endpoint: std::option::Option<std::string::String>,
        pub(crate) jwks_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
        pub fn client_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.client_id = Some(input.into());
            self
        }
        /// <p>The OIDC IdP client ID used to configure your private workforce.</p>
        pub fn set_client_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.client_id = input;
            self
        }
        /// <p>The OIDC IdP client secret used to configure your private workforce.</p>
        pub fn client_secret(mut self, input: impl Into<std::string::String>) -> Self {
            self.client_secret = Some(input.into());
            self
        }
        /// <p>The OIDC IdP client secret used to configure your private workforce.</p>
        pub fn set_client_secret(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.client_secret = input;
            self
        }
        /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
        pub fn issuer(mut self, input: impl Into<std::string::String>) -> Self {
            self.issuer = Some(input.into());
            self
        }
        /// <p>The OIDC IdP issuer used to configure your private workforce.</p>
        pub fn set_issuer(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.issuer = input;
            self
        }
        /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
        pub fn authorization_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.authorization_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP authorization endpoint used to configure your private workforce.</p>
        pub fn set_authorization_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.authorization_endpoint = input;
            self
        }
        /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
        pub fn token_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.token_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP token endpoint used to configure your private workforce.</p>
        pub fn set_token_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.token_endpoint = input;
            self
        }
        /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
        pub fn user_info_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_info_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP user information endpoint used to configure your private workforce.</p>
        pub fn set_user_info_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.user_info_endpoint = input;
            self
        }
        /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
        pub fn logout_endpoint(mut self, input: impl Into<std::string::String>) -> Self {
            self.logout_endpoint = Some(input.into());
            self
        }
        /// <p>The OIDC IdP logout endpoint used to configure your private workforce.</p>
        pub fn set_logout_endpoint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.logout_endpoint = input;
            self
        }
        /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
        pub fn jwks_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.jwks_uri = Some(input.into());
            self
        }
        /// <p>The OIDC IdP JSON Web Key Set (Jwks) URI used to configure your private workforce.</p>
        pub fn set_jwks_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.jwks_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`OidcConfig`](crate::model::OidcConfig).
        pub fn build(self) -> crate::model::OidcConfig {
            crate::model::OidcConfig {
                client_id: self.client_id,
                client_secret: self.client_secret,
                issuer: self.issuer,
                authorization_endpoint: self.authorization_endpoint,
                token_endpoint: self.token_endpoint,
                user_info_endpoint: self.user_info_endpoint,
                logout_endpoint: self.logout_endpoint,
                jwks_uri: self.jwks_uri,
            }
        }
    }
    impl std::fmt::Debug for Builder {
        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
            let mut formatter = f.debug_struct("Builder");
            formatter.field("client_id", &self.client_id);
            formatter.field("client_secret", &"*** Sensitive Data Redacted ***");
            formatter.field("issuer", &self.issuer);
            formatter.field("authorization_endpoint", &self.authorization_endpoint);
            formatter.field("token_endpoint", &self.token_endpoint);
            formatter.field("user_info_endpoint", &self.user_info_endpoint);
            formatter.field("logout_endpoint", &self.logout_endpoint);
            formatter.field("jwks_uri", &self.jwks_uri);
            formatter.finish()
        }
    }
}
impl OidcConfig {
    /// Creates a new builder-style object to manufacture [`OidcConfig`](crate::model::OidcConfig).
    pub fn builder() -> crate::model::oidc_config::Builder {
        crate::model::oidc_config::Builder::default()
    }
}

/// <p>A collection of settings that apply to users of Amazon SageMaker Studio. These settings are specified when the <code>CreateUserProfile</code> API is called, and as <code>DefaultUserSettings</code> when the <code>CreateDomain</code> API is called.</p>
/// <p> <code>SecurityGroups</code> is aggregated when specified in both calls. For all other settings in <code>UserSettings</code>, the values specified in <code>CreateUserProfile</code> take precedence over those specified in <code>CreateDomain</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct UserSettings {
    /// <p>The execution role for the user.</p>
    #[doc(hidden)]
    pub execution_role: std::option::Option<std::string::String>,
    /// <p>The security groups for the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.</p>
    /// <p>Optional when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>PublicInternetOnly</code>.</p>
    /// <p>Required when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>VpcOnly</code>.</p>
    /// <p>Amazon SageMaker adds a security group to allow NFS traffic from SageMaker Studio. Therefore, the number of security groups that you can specify is one less than the maximum number shown.</p>
    #[doc(hidden)]
    pub security_groups: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>Specifies options for sharing SageMaker Studio notebooks.</p>
    #[doc(hidden)]
    pub sharing_settings: std::option::Option<crate::model::SharingSettings>,
    /// <p>The Jupyter server's app settings.</p>
    #[doc(hidden)]
    pub jupyter_server_app_settings: std::option::Option<crate::model::JupyterServerAppSettings>,
    /// <p>The kernel gateway app settings.</p>
    #[doc(hidden)]
    pub kernel_gateway_app_settings: std::option::Option<crate::model::KernelGatewayAppSettings>,
    /// <p>The TensorBoard app settings.</p>
    #[doc(hidden)]
    pub tensor_board_app_settings: std::option::Option<crate::model::TensorBoardAppSettings>,
    /// <p>A collection of settings that configure user interaction with the <code>RStudioServerPro</code> app.</p>
    #[doc(hidden)]
    pub r_studio_server_pro_app_settings:
        std::option::Option<crate::model::RStudioServerProAppSettings>,
    /// <p>A collection of settings that configure the <code>RSessionGateway</code> app.</p>
    #[doc(hidden)]
    pub r_session_app_settings: std::option::Option<crate::model::RSessionAppSettings>,
    /// <p>The Canvas app settings.</p>
    #[doc(hidden)]
    pub canvas_app_settings: std::option::Option<crate::model::CanvasAppSettings>,
}
impl UserSettings {
    /// <p>The execution role for the user.</p>
    pub fn execution_role(&self) -> std::option::Option<&str> {
        self.execution_role.as_deref()
    }
    /// <p>The security groups for the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.</p>
    /// <p>Optional when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>PublicInternetOnly</code>.</p>
    /// <p>Required when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>VpcOnly</code>.</p>
    /// <p>Amazon SageMaker adds a security group to allow NFS traffic from SageMaker Studio. Therefore, the number of security groups that you can specify is one less than the maximum number shown.</p>
    pub fn security_groups(&self) -> std::option::Option<&[std::string::String]> {
        self.security_groups.as_deref()
    }
    /// <p>Specifies options for sharing SageMaker Studio notebooks.</p>
    pub fn sharing_settings(&self) -> std::option::Option<&crate::model::SharingSettings> {
        self.sharing_settings.as_ref()
    }
    /// <p>The Jupyter server's app settings.</p>
    pub fn jupyter_server_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::JupyterServerAppSettings> {
        self.jupyter_server_app_settings.as_ref()
    }
    /// <p>The kernel gateway app settings.</p>
    pub fn kernel_gateway_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::KernelGatewayAppSettings> {
        self.kernel_gateway_app_settings.as_ref()
    }
    /// <p>The TensorBoard app settings.</p>
    pub fn tensor_board_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::TensorBoardAppSettings> {
        self.tensor_board_app_settings.as_ref()
    }
    /// <p>A collection of settings that configure user interaction with the <code>RStudioServerPro</code> app.</p>
    pub fn r_studio_server_pro_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::RStudioServerProAppSettings> {
        self.r_studio_server_pro_app_settings.as_ref()
    }
    /// <p>A collection of settings that configure the <code>RSessionGateway</code> app.</p>
    pub fn r_session_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::RSessionAppSettings> {
        self.r_session_app_settings.as_ref()
    }
    /// <p>The Canvas app settings.</p>
    pub fn canvas_app_settings(&self) -> std::option::Option<&crate::model::CanvasAppSettings> {
        self.canvas_app_settings.as_ref()
    }
}
/// See [`UserSettings`](crate::model::UserSettings).
pub mod user_settings {

    /// A builder for [`UserSettings`](crate::model::UserSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) execution_role: std::option::Option<std::string::String>,
        pub(crate) security_groups: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) sharing_settings: std::option::Option<crate::model::SharingSettings>,
        pub(crate) jupyter_server_app_settings:
            std::option::Option<crate::model::JupyterServerAppSettings>,
        pub(crate) kernel_gateway_app_settings:
            std::option::Option<crate::model::KernelGatewayAppSettings>,
        pub(crate) tensor_board_app_settings:
            std::option::Option<crate::model::TensorBoardAppSettings>,
        pub(crate) r_studio_server_pro_app_settings:
            std::option::Option<crate::model::RStudioServerProAppSettings>,
        pub(crate) r_session_app_settings: std::option::Option<crate::model::RSessionAppSettings>,
        pub(crate) canvas_app_settings: std::option::Option<crate::model::CanvasAppSettings>,
    }
    impl Builder {
        /// <p>The execution role for the user.</p>
        pub fn execution_role(mut self, input: impl Into<std::string::String>) -> Self {
            self.execution_role = Some(input.into());
            self
        }
        /// <p>The execution role for the user.</p>
        pub fn set_execution_role(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.execution_role = input;
            self
        }
        /// Appends an item to `security_groups`.
        ///
        /// To override the contents of this collection use [`set_security_groups`](Self::set_security_groups).
        ///
        /// <p>The security groups for the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.</p>
        /// <p>Optional when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>PublicInternetOnly</code>.</p>
        /// <p>Required when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>VpcOnly</code>.</p>
        /// <p>Amazon SageMaker adds a security group to allow NFS traffic from SageMaker Studio. Therefore, the number of security groups that you can specify is one less than the maximum number shown.</p>
        pub fn security_groups(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_groups.unwrap_or_default();
            v.push(input.into());
            self.security_groups = Some(v);
            self
        }
        /// <p>The security groups for the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.</p>
        /// <p>Optional when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>PublicInternetOnly</code>.</p>
        /// <p>Required when the <code>CreateDomain.AppNetworkAccessType</code> parameter is set to <code>VpcOnly</code>.</p>
        /// <p>Amazon SageMaker adds a security group to allow NFS traffic from SageMaker Studio. Therefore, the number of security groups that you can specify is one less than the maximum number shown.</p>
        pub fn set_security_groups(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_groups = input;
            self
        }
        /// <p>Specifies options for sharing SageMaker Studio notebooks.</p>
        pub fn sharing_settings(mut self, input: crate::model::SharingSettings) -> Self {
            self.sharing_settings = Some(input);
            self
        }
        /// <p>Specifies options for sharing SageMaker Studio notebooks.</p>
        pub fn set_sharing_settings(
            mut self,
            input: std::option::Option<crate::model::SharingSettings>,
        ) -> Self {
            self.sharing_settings = input;
            self
        }
        /// <p>The Jupyter server's app settings.</p>
        pub fn jupyter_server_app_settings(
            mut self,
            input: crate::model::JupyterServerAppSettings,
        ) -> Self {
            self.jupyter_server_app_settings = Some(input);
            self
        }
        /// <p>The Jupyter server's app settings.</p>
        pub fn set_jupyter_server_app_settings(
            mut self,
            input: std::option::Option<crate::model::JupyterServerAppSettings>,
        ) -> Self {
            self.jupyter_server_app_settings = input;
            self
        }
        /// <p>The kernel gateway app settings.</p>
        pub fn kernel_gateway_app_settings(
            mut self,
            input: crate::model::KernelGatewayAppSettings,
        ) -> Self {
            self.kernel_gateway_app_settings = Some(input);
            self
        }
        /// <p>The kernel gateway app settings.</p>
        pub fn set_kernel_gateway_app_settings(
            mut self,
            input: std::option::Option<crate::model::KernelGatewayAppSettings>,
        ) -> Self {
            self.kernel_gateway_app_settings = input;
            self
        }
        /// <p>The TensorBoard app settings.</p>
        pub fn tensor_board_app_settings(
            mut self,
            input: crate::model::TensorBoardAppSettings,
        ) -> Self {
            self.tensor_board_app_settings = Some(input);
            self
        }
        /// <p>The TensorBoard app settings.</p>
        pub fn set_tensor_board_app_settings(
            mut self,
            input: std::option::Option<crate::model::TensorBoardAppSettings>,
        ) -> Self {
            self.tensor_board_app_settings = input;
            self
        }
        /// <p>A collection of settings that configure user interaction with the <code>RStudioServerPro</code> app.</p>
        pub fn r_studio_server_pro_app_settings(
            mut self,
            input: crate::model::RStudioServerProAppSettings,
        ) -> Self {
            self.r_studio_server_pro_app_settings = Some(input);
            self
        }
        /// <p>A collection of settings that configure user interaction with the <code>RStudioServerPro</code> app.</p>
        pub fn set_r_studio_server_pro_app_settings(
            mut self,
            input: std::option::Option<crate::model::RStudioServerProAppSettings>,
        ) -> Self {
            self.r_studio_server_pro_app_settings = input;
            self
        }
        /// <p>A collection of settings that configure the <code>RSessionGateway</code> app.</p>
        pub fn r_session_app_settings(mut self, input: crate::model::RSessionAppSettings) -> Self {
            self.r_session_app_settings = Some(input);
            self
        }
        /// <p>A collection of settings that configure the <code>RSessionGateway</code> app.</p>
        pub fn set_r_session_app_settings(
            mut self,
            input: std::option::Option<crate::model::RSessionAppSettings>,
        ) -> Self {
            self.r_session_app_settings = input;
            self
        }
        /// <p>The Canvas app settings.</p>
        pub fn canvas_app_settings(mut self, input: crate::model::CanvasAppSettings) -> Self {
            self.canvas_app_settings = Some(input);
            self
        }
        /// <p>The Canvas app settings.</p>
        pub fn set_canvas_app_settings(
            mut self,
            input: std::option::Option<crate::model::CanvasAppSettings>,
        ) -> Self {
            self.canvas_app_settings = input;
            self
        }
        /// Consumes the builder and constructs a [`UserSettings`](crate::model::UserSettings).
        pub fn build(self) -> crate::model::UserSettings {
            crate::model::UserSettings {
                execution_role: self.execution_role,
                security_groups: self.security_groups,
                sharing_settings: self.sharing_settings,
                jupyter_server_app_settings: self.jupyter_server_app_settings,
                kernel_gateway_app_settings: self.kernel_gateway_app_settings,
                tensor_board_app_settings: self.tensor_board_app_settings,
                r_studio_server_pro_app_settings: self.r_studio_server_pro_app_settings,
                r_session_app_settings: self.r_session_app_settings,
                canvas_app_settings: self.canvas_app_settings,
            }
        }
    }
}
impl UserSettings {
    /// Creates a new builder-style object to manufacture [`UserSettings`](crate::model::UserSettings).
    pub fn builder() -> crate::model::user_settings::Builder {
        crate::model::user_settings::Builder::default()
    }
}

/// <p>The SageMaker Canvas app settings.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CanvasAppSettings {
    /// <p>Time series forecast settings for the Canvas app.</p>
    #[doc(hidden)]
    pub time_series_forecasting_settings:
        std::option::Option<crate::model::TimeSeriesForecastingSettings>,
}
impl CanvasAppSettings {
    /// <p>Time series forecast settings for the Canvas app.</p>
    pub fn time_series_forecasting_settings(
        &self,
    ) -> std::option::Option<&crate::model::TimeSeriesForecastingSettings> {
        self.time_series_forecasting_settings.as_ref()
    }
}
/// See [`CanvasAppSettings`](crate::model::CanvasAppSettings).
pub mod canvas_app_settings {

    /// A builder for [`CanvasAppSettings`](crate::model::CanvasAppSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) time_series_forecasting_settings:
            std::option::Option<crate::model::TimeSeriesForecastingSettings>,
    }
    impl Builder {
        /// <p>Time series forecast settings for the Canvas app.</p>
        pub fn time_series_forecasting_settings(
            mut self,
            input: crate::model::TimeSeriesForecastingSettings,
        ) -> Self {
            self.time_series_forecasting_settings = Some(input);
            self
        }
        /// <p>Time series forecast settings for the Canvas app.</p>
        pub fn set_time_series_forecasting_settings(
            mut self,
            input: std::option::Option<crate::model::TimeSeriesForecastingSettings>,
        ) -> Self {
            self.time_series_forecasting_settings = input;
            self
        }
        /// Consumes the builder and constructs a [`CanvasAppSettings`](crate::model::CanvasAppSettings).
        pub fn build(self) -> crate::model::CanvasAppSettings {
            crate::model::CanvasAppSettings {
                time_series_forecasting_settings: self.time_series_forecasting_settings,
            }
        }
    }
}
impl CanvasAppSettings {
    /// Creates a new builder-style object to manufacture [`CanvasAppSettings`](crate::model::CanvasAppSettings).
    pub fn builder() -> crate::model::canvas_app_settings::Builder {
        crate::model::canvas_app_settings::Builder::default()
    }
}

/// <p>Time series forecast settings for the SageMaker Canvas app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TimeSeriesForecastingSettings {
    /// <p>Describes whether time series forecasting is enabled or disabled in the Canvas app.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::FeatureStatus>,
    /// <p>The IAM role that Canvas passes to Amazon Forecast for time series forecasting. By default, Canvas uses the execution role specified in the <code>UserProfile</code> that launches the Canvas app. If an execution role is not specified in the <code>UserProfile</code>, Canvas uses the execution role specified in the Domain that owns the <code>UserProfile</code>. To allow time series forecasting, this IAM role should have the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-canvas.html#security-iam-awsmanpol-AmazonSageMakerCanvasForecastAccess"> AmazonSageMakerCanvasForecastAccess</a> policy attached and <code>forecast.amazonaws.com</code> added in the trust relationship as a service principal.</p>
    #[doc(hidden)]
    pub amazon_forecast_role_arn: std::option::Option<std::string::String>,
}
impl TimeSeriesForecastingSettings {
    /// <p>Describes whether time series forecasting is enabled or disabled in the Canvas app.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::FeatureStatus> {
        self.status.as_ref()
    }
    /// <p>The IAM role that Canvas passes to Amazon Forecast for time series forecasting. By default, Canvas uses the execution role specified in the <code>UserProfile</code> that launches the Canvas app. If an execution role is not specified in the <code>UserProfile</code>, Canvas uses the execution role specified in the Domain that owns the <code>UserProfile</code>. To allow time series forecasting, this IAM role should have the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-canvas.html#security-iam-awsmanpol-AmazonSageMakerCanvasForecastAccess"> AmazonSageMakerCanvasForecastAccess</a> policy attached and <code>forecast.amazonaws.com</code> added in the trust relationship as a service principal.</p>
    pub fn amazon_forecast_role_arn(&self) -> std::option::Option<&str> {
        self.amazon_forecast_role_arn.as_deref()
    }
}
/// See [`TimeSeriesForecastingSettings`](crate::model::TimeSeriesForecastingSettings).
pub mod time_series_forecasting_settings {

    /// A builder for [`TimeSeriesForecastingSettings`](crate::model::TimeSeriesForecastingSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) status: std::option::Option<crate::model::FeatureStatus>,
        pub(crate) amazon_forecast_role_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Describes whether time series forecasting is enabled or disabled in the Canvas app.</p>
        pub fn status(mut self, input: crate::model::FeatureStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>Describes whether time series forecasting is enabled or disabled in the Canvas app.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::FeatureStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The IAM role that Canvas passes to Amazon Forecast for time series forecasting. By default, Canvas uses the execution role specified in the <code>UserProfile</code> that launches the Canvas app. If an execution role is not specified in the <code>UserProfile</code>, Canvas uses the execution role specified in the Domain that owns the <code>UserProfile</code>. To allow time series forecasting, this IAM role should have the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-canvas.html#security-iam-awsmanpol-AmazonSageMakerCanvasForecastAccess"> AmazonSageMakerCanvasForecastAccess</a> policy attached and <code>forecast.amazonaws.com</code> added in the trust relationship as a service principal.</p>
        pub fn amazon_forecast_role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.amazon_forecast_role_arn = Some(input.into());
            self
        }
        /// <p>The IAM role that Canvas passes to Amazon Forecast for time series forecasting. By default, Canvas uses the execution role specified in the <code>UserProfile</code> that launches the Canvas app. If an execution role is not specified in the <code>UserProfile</code>, Canvas uses the execution role specified in the Domain that owns the <code>UserProfile</code>. To allow time series forecasting, this IAM role should have the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-canvas.html#security-iam-awsmanpol-AmazonSageMakerCanvasForecastAccess"> AmazonSageMakerCanvasForecastAccess</a> policy attached and <code>forecast.amazonaws.com</code> added in the trust relationship as a service principal.</p>
        pub fn set_amazon_forecast_role_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.amazon_forecast_role_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`TimeSeriesForecastingSettings`](crate::model::TimeSeriesForecastingSettings).
        pub fn build(self) -> crate::model::TimeSeriesForecastingSettings {
            crate::model::TimeSeriesForecastingSettings {
                status: self.status,
                amazon_forecast_role_arn: self.amazon_forecast_role_arn,
            }
        }
    }
}
impl TimeSeriesForecastingSettings {
    /// Creates a new builder-style object to manufacture [`TimeSeriesForecastingSettings`](crate::model::TimeSeriesForecastingSettings).
    pub fn builder() -> crate::model::time_series_forecasting_settings::Builder {
        crate::model::time_series_forecasting_settings::Builder::default()
    }
}

/// When writing a match expression against `FeatureStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let featurestatus = unimplemented!();
/// match featurestatus {
///     FeatureStatus::Disabled => { /* ... */ },
///     FeatureStatus::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `featurestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FeatureStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FeatureStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FeatureStatus::NewFeature` is defined.
/// Specifically, when `featurestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FeatureStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FeatureStatus {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FeatureStatus {
    fn from(s: &str) -> Self {
        match s {
            "DISABLED" => FeatureStatus::Disabled,
            "ENABLED" => FeatureStatus::Enabled,
            other => FeatureStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for FeatureStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FeatureStatus::from(s))
    }
}
impl FeatureStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FeatureStatus::Disabled => "DISABLED",
            FeatureStatus::Enabled => "ENABLED",
            FeatureStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["DISABLED", "ENABLED"]
    }
}
impl AsRef<str> for FeatureStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A collection of settings that apply to an <code>RSessionGateway</code> app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RSessionAppSettings {
    /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
    #[doc(hidden)]
    pub default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
    /// <p>A list of custom SageMaker images that are configured to run as a RSession app.</p>
    #[doc(hidden)]
    pub custom_images: std::option::Option<std::vec::Vec<crate::model::CustomImage>>,
}
impl RSessionAppSettings {
    /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
    pub fn default_resource_spec(&self) -> std::option::Option<&crate::model::ResourceSpec> {
        self.default_resource_spec.as_ref()
    }
    /// <p>A list of custom SageMaker images that are configured to run as a RSession app.</p>
    pub fn custom_images(&self) -> std::option::Option<&[crate::model::CustomImage]> {
        self.custom_images.as_deref()
    }
}
/// See [`RSessionAppSettings`](crate::model::RSessionAppSettings).
pub mod r_session_app_settings {

    /// A builder for [`RSessionAppSettings`](crate::model::RSessionAppSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
        pub(crate) custom_images: std::option::Option<std::vec::Vec<crate::model::CustomImage>>,
    }
    impl Builder {
        /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
        pub fn default_resource_spec(mut self, input: crate::model::ResourceSpec) -> Self {
            self.default_resource_spec = Some(input);
            self
        }
        /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
        pub fn set_default_resource_spec(
            mut self,
            input: std::option::Option<crate::model::ResourceSpec>,
        ) -> Self {
            self.default_resource_spec = input;
            self
        }
        /// Appends an item to `custom_images`.
        ///
        /// To override the contents of this collection use [`set_custom_images`](Self::set_custom_images).
        ///
        /// <p>A list of custom SageMaker images that are configured to run as a RSession app.</p>
        pub fn custom_images(mut self, input: crate::model::CustomImage) -> Self {
            let mut v = self.custom_images.unwrap_or_default();
            v.push(input);
            self.custom_images = Some(v);
            self
        }
        /// <p>A list of custom SageMaker images that are configured to run as a RSession app.</p>
        pub fn set_custom_images(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CustomImage>>,
        ) -> Self {
            self.custom_images = input;
            self
        }
        /// Consumes the builder and constructs a [`RSessionAppSettings`](crate::model::RSessionAppSettings).
        pub fn build(self) -> crate::model::RSessionAppSettings {
            crate::model::RSessionAppSettings {
                default_resource_spec: self.default_resource_spec,
                custom_images: self.custom_images,
            }
        }
    }
}
impl RSessionAppSettings {
    /// Creates a new builder-style object to manufacture [`RSessionAppSettings`](crate::model::RSessionAppSettings).
    pub fn builder() -> crate::model::r_session_app_settings::Builder {
        crate::model::r_session_app_settings::Builder::default()
    }
}

/// <p>A custom SageMaker image. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/studio-byoi.html">Bring your own SageMaker image</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CustomImage {
    /// <p>The name of the CustomImage. Must be unique to your account.</p>
    #[doc(hidden)]
    pub image_name: std::option::Option<std::string::String>,
    /// <p>The version number of the CustomImage.</p>
    #[doc(hidden)]
    pub image_version_number: std::option::Option<i32>,
    /// <p>The name of the AppImageConfig.</p>
    #[doc(hidden)]
    pub app_image_config_name: std::option::Option<std::string::String>,
}
impl CustomImage {
    /// <p>The name of the CustomImage. Must be unique to your account.</p>
    pub fn image_name(&self) -> std::option::Option<&str> {
        self.image_name.as_deref()
    }
    /// <p>The version number of the CustomImage.</p>
    pub fn image_version_number(&self) -> std::option::Option<i32> {
        self.image_version_number
    }
    /// <p>The name of the AppImageConfig.</p>
    pub fn app_image_config_name(&self) -> std::option::Option<&str> {
        self.app_image_config_name.as_deref()
    }
}
/// See [`CustomImage`](crate::model::CustomImage).
pub mod custom_image {

    /// A builder for [`CustomImage`](crate::model::CustomImage).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_name: std::option::Option<std::string::String>,
        pub(crate) image_version_number: std::option::Option<i32>,
        pub(crate) app_image_config_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the CustomImage. Must be unique to your account.</p>
        pub fn image_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_name = Some(input.into());
            self
        }
        /// <p>The name of the CustomImage. Must be unique to your account.</p>
        pub fn set_image_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_name = input;
            self
        }
        /// <p>The version number of the CustomImage.</p>
        pub fn image_version_number(mut self, input: i32) -> Self {
            self.image_version_number = Some(input);
            self
        }
        /// <p>The version number of the CustomImage.</p>
        pub fn set_image_version_number(mut self, input: std::option::Option<i32>) -> Self {
            self.image_version_number = input;
            self
        }
        /// <p>The name of the AppImageConfig.</p>
        pub fn app_image_config_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.app_image_config_name = Some(input.into());
            self
        }
        /// <p>The name of the AppImageConfig.</p>
        pub fn set_app_image_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.app_image_config_name = input;
            self
        }
        /// Consumes the builder and constructs a [`CustomImage`](crate::model::CustomImage).
        pub fn build(self) -> crate::model::CustomImage {
            crate::model::CustomImage {
                image_name: self.image_name,
                image_version_number: self.image_version_number,
                app_image_config_name: self.app_image_config_name,
            }
        }
    }
}
impl CustomImage {
    /// Creates a new builder-style object to manufacture [`CustomImage`](crate::model::CustomImage).
    pub fn builder() -> crate::model::custom_image::Builder {
        crate::model::custom_image::Builder::default()
    }
}

/// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ResourceSpec {
    /// <p>The ARN of the SageMaker image that the image version belongs to.</p>
    #[doc(hidden)]
    pub sage_maker_image_arn: std::option::Option<std::string::String>,
    /// <p>The ARN of the image version created on the instance.</p>
    #[doc(hidden)]
    pub sage_maker_image_version_arn: std::option::Option<std::string::String>,
    /// <p>The instance type that the image version runs on.</p> <note>
    /// <p> <b>JupyterServer apps</b> only support the <code>system</code> value.</p>
    /// <p>For <b>KernelGateway apps</b>, the <code>system</code> value is translated to <code>ml.t3.medium</code>. KernelGateway apps also support all other values for available instance types.</p>
    /// </note>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::AppInstanceType>,
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration attached to the Resource.</p>
    #[doc(hidden)]
    pub lifecycle_config_arn: std::option::Option<std::string::String>,
}
impl ResourceSpec {
    /// <p>The ARN of the SageMaker image that the image version belongs to.</p>
    pub fn sage_maker_image_arn(&self) -> std::option::Option<&str> {
        self.sage_maker_image_arn.as_deref()
    }
    /// <p>The ARN of the image version created on the instance.</p>
    pub fn sage_maker_image_version_arn(&self) -> std::option::Option<&str> {
        self.sage_maker_image_version_arn.as_deref()
    }
    /// <p>The instance type that the image version runs on.</p> <note>
    /// <p> <b>JupyterServer apps</b> only support the <code>system</code> value.</p>
    /// <p>For <b>KernelGateway apps</b>, the <code>system</code> value is translated to <code>ml.t3.medium</code>. KernelGateway apps also support all other values for available instance types.</p>
    /// </note>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::AppInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration attached to the Resource.</p>
    pub fn lifecycle_config_arn(&self) -> std::option::Option<&str> {
        self.lifecycle_config_arn.as_deref()
    }
}
/// See [`ResourceSpec`](crate::model::ResourceSpec).
pub mod resource_spec {

    /// A builder for [`ResourceSpec`](crate::model::ResourceSpec).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) sage_maker_image_arn: std::option::Option<std::string::String>,
        pub(crate) sage_maker_image_version_arn: std::option::Option<std::string::String>,
        pub(crate) instance_type: std::option::Option<crate::model::AppInstanceType>,
        pub(crate) lifecycle_config_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The ARN of the SageMaker image that the image version belongs to.</p>
        pub fn sage_maker_image_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.sage_maker_image_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the SageMaker image that the image version belongs to.</p>
        pub fn set_sage_maker_image_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sage_maker_image_arn = input;
            self
        }
        /// <p>The ARN of the image version created on the instance.</p>
        pub fn sage_maker_image_version_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.sage_maker_image_version_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the image version created on the instance.</p>
        pub fn set_sage_maker_image_version_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sage_maker_image_version_arn = input;
            self
        }
        /// <p>The instance type that the image version runs on.</p> <note>
        /// <p> <b>JupyterServer apps</b> only support the <code>system</code> value.</p>
        /// <p>For <b>KernelGateway apps</b>, the <code>system</code> value is translated to <code>ml.t3.medium</code>. KernelGateway apps also support all other values for available instance types.</p>
        /// </note>
        pub fn instance_type(mut self, input: crate::model::AppInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type that the image version runs on.</p> <note>
        /// <p> <b>JupyterServer apps</b> only support the <code>system</code> value.</p>
        /// <p>For <b>KernelGateway apps</b>, the <code>system</code> value is translated to <code>ml.t3.medium</code>. KernelGateway apps also support all other values for available instance types.</p>
        /// </note>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::AppInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration attached to the Resource.</p>
        pub fn lifecycle_config_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.lifecycle_config_arn = Some(input.into());
            self
        }
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration attached to the Resource.</p>
        pub fn set_lifecycle_config_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.lifecycle_config_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`ResourceSpec`](crate::model::ResourceSpec).
        pub fn build(self) -> crate::model::ResourceSpec {
            crate::model::ResourceSpec {
                sage_maker_image_arn: self.sage_maker_image_arn,
                sage_maker_image_version_arn: self.sage_maker_image_version_arn,
                instance_type: self.instance_type,
                lifecycle_config_arn: self.lifecycle_config_arn,
            }
        }
    }
}
impl ResourceSpec {
    /// Creates a new builder-style object to manufacture [`ResourceSpec`](crate::model::ResourceSpec).
    pub fn builder() -> crate::model::resource_spec::Builder {
        crate::model::resource_spec::Builder::default()
    }
}

/// When writing a match expression against `AppInstanceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let appinstancetype = unimplemented!();
/// match appinstancetype {
///     AppInstanceType::MlC512Xlarge => { /* ... */ },
///     AppInstanceType::MlC518Xlarge => { /* ... */ },
///     AppInstanceType::MlC524Xlarge => { /* ... */ },
///     AppInstanceType::MlC52Xlarge => { /* ... */ },
///     AppInstanceType::MlC54Xlarge => { /* ... */ },
///     AppInstanceType::MlC59Xlarge => { /* ... */ },
///     AppInstanceType::MlC5Large => { /* ... */ },
///     AppInstanceType::MlC5Xlarge => { /* ... */ },
///     AppInstanceType::MlG4Dn12Xlarge => { /* ... */ },
///     AppInstanceType::MlG4Dn16Xlarge => { /* ... */ },
///     AppInstanceType::MlG4Dn2Xlarge => { /* ... */ },
///     AppInstanceType::MlG4Dn4Xlarge => { /* ... */ },
///     AppInstanceType::MlG4Dn8Xlarge => { /* ... */ },
///     AppInstanceType::MlG4DnXlarge => { /* ... */ },
///     AppInstanceType::MlG512Xlarge => { /* ... */ },
///     AppInstanceType::MlG516Xlarge => { /* ... */ },
///     AppInstanceType::MlG524Xlarge => { /* ... */ },
///     AppInstanceType::MlG52Xlarge => { /* ... */ },
///     AppInstanceType::MlG548Xlarge => { /* ... */ },
///     AppInstanceType::MlG54Xlarge => { /* ... */ },
///     AppInstanceType::MlG58Xlarge => { /* ... */ },
///     AppInstanceType::MlG5Xlarge => { /* ... */ },
///     AppInstanceType::MlM512Xlarge => { /* ... */ },
///     AppInstanceType::MlM516Xlarge => { /* ... */ },
///     AppInstanceType::MlM524Xlarge => { /* ... */ },
///     AppInstanceType::MlM52Xlarge => { /* ... */ },
///     AppInstanceType::MlM54Xlarge => { /* ... */ },
///     AppInstanceType::MlM58Xlarge => { /* ... */ },
///     AppInstanceType::MlM5Large => { /* ... */ },
///     AppInstanceType::MlM5Xlarge => { /* ... */ },
///     AppInstanceType::MlM5D12Xlarge => { /* ... */ },
///     AppInstanceType::MlM5D16Xlarge => { /* ... */ },
///     AppInstanceType::MlM5D24Xlarge => { /* ... */ },
///     AppInstanceType::MlM5D2Xlarge => { /* ... */ },
///     AppInstanceType::MlM5D4Xlarge => { /* ... */ },
///     AppInstanceType::MlM5D8Xlarge => { /* ... */ },
///     AppInstanceType::MlM5DLarge => { /* ... */ },
///     AppInstanceType::MlM5DXlarge => { /* ... */ },
///     AppInstanceType::MlP316Xlarge => { /* ... */ },
///     AppInstanceType::MlP32Xlarge => { /* ... */ },
///     AppInstanceType::MlP38Xlarge => { /* ... */ },
///     AppInstanceType::MlP3Dn24Xlarge => { /* ... */ },
///     AppInstanceType::MlR512Xlarge => { /* ... */ },
///     AppInstanceType::MlR516Xlarge => { /* ... */ },
///     AppInstanceType::MlR524Xlarge => { /* ... */ },
///     AppInstanceType::MlR52Xlarge => { /* ... */ },
///     AppInstanceType::MlR54Xlarge => { /* ... */ },
///     AppInstanceType::MlR58Xlarge => { /* ... */ },
///     AppInstanceType::MlR5Large => { /* ... */ },
///     AppInstanceType::MlR5Xlarge => { /* ... */ },
///     AppInstanceType::MlT32Xlarge => { /* ... */ },
///     AppInstanceType::MlT3Large => { /* ... */ },
///     AppInstanceType::MlT3Medium => { /* ... */ },
///     AppInstanceType::MlT3Micro => { /* ... */ },
///     AppInstanceType::MlT3Small => { /* ... */ },
///     AppInstanceType::MlT3Xlarge => { /* ... */ },
///     AppInstanceType::System => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `appinstancetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppInstanceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppInstanceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppInstanceType::NewFeature` is defined.
/// Specifically, when `appinstancetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppInstanceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppInstanceType {
    #[allow(missing_docs)] // documentation missing in model
    MlC512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC518Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC59Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4DnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG548Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5DLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5DXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP316Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP38Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP3Dn24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Large,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Micro,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Small,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    System,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppInstanceType {
    fn from(s: &str) -> Self {
        match s {
            "ml.c5.12xlarge" => AppInstanceType::MlC512Xlarge,
            "ml.c5.18xlarge" => AppInstanceType::MlC518Xlarge,
            "ml.c5.24xlarge" => AppInstanceType::MlC524Xlarge,
            "ml.c5.2xlarge" => AppInstanceType::MlC52Xlarge,
            "ml.c5.4xlarge" => AppInstanceType::MlC54Xlarge,
            "ml.c5.9xlarge" => AppInstanceType::MlC59Xlarge,
            "ml.c5.large" => AppInstanceType::MlC5Large,
            "ml.c5.xlarge" => AppInstanceType::MlC5Xlarge,
            "ml.g4dn.12xlarge" => AppInstanceType::MlG4Dn12Xlarge,
            "ml.g4dn.16xlarge" => AppInstanceType::MlG4Dn16Xlarge,
            "ml.g4dn.2xlarge" => AppInstanceType::MlG4Dn2Xlarge,
            "ml.g4dn.4xlarge" => AppInstanceType::MlG4Dn4Xlarge,
            "ml.g4dn.8xlarge" => AppInstanceType::MlG4Dn8Xlarge,
            "ml.g4dn.xlarge" => AppInstanceType::MlG4DnXlarge,
            "ml.g5.12xlarge" => AppInstanceType::MlG512Xlarge,
            "ml.g5.16xlarge" => AppInstanceType::MlG516Xlarge,
            "ml.g5.24xlarge" => AppInstanceType::MlG524Xlarge,
            "ml.g5.2xlarge" => AppInstanceType::MlG52Xlarge,
            "ml.g5.48xlarge" => AppInstanceType::MlG548Xlarge,
            "ml.g5.4xlarge" => AppInstanceType::MlG54Xlarge,
            "ml.g5.8xlarge" => AppInstanceType::MlG58Xlarge,
            "ml.g5.xlarge" => AppInstanceType::MlG5Xlarge,
            "ml.m5.12xlarge" => AppInstanceType::MlM512Xlarge,
            "ml.m5.16xlarge" => AppInstanceType::MlM516Xlarge,
            "ml.m5.24xlarge" => AppInstanceType::MlM524Xlarge,
            "ml.m5.2xlarge" => AppInstanceType::MlM52Xlarge,
            "ml.m5.4xlarge" => AppInstanceType::MlM54Xlarge,
            "ml.m5.8xlarge" => AppInstanceType::MlM58Xlarge,
            "ml.m5.large" => AppInstanceType::MlM5Large,
            "ml.m5.xlarge" => AppInstanceType::MlM5Xlarge,
            "ml.m5d.12xlarge" => AppInstanceType::MlM5D12Xlarge,
            "ml.m5d.16xlarge" => AppInstanceType::MlM5D16Xlarge,
            "ml.m5d.24xlarge" => AppInstanceType::MlM5D24Xlarge,
            "ml.m5d.2xlarge" => AppInstanceType::MlM5D2Xlarge,
            "ml.m5d.4xlarge" => AppInstanceType::MlM5D4Xlarge,
            "ml.m5d.8xlarge" => AppInstanceType::MlM5D8Xlarge,
            "ml.m5d.large" => AppInstanceType::MlM5DLarge,
            "ml.m5d.xlarge" => AppInstanceType::MlM5DXlarge,
            "ml.p3.16xlarge" => AppInstanceType::MlP316Xlarge,
            "ml.p3.2xlarge" => AppInstanceType::MlP32Xlarge,
            "ml.p3.8xlarge" => AppInstanceType::MlP38Xlarge,
            "ml.p3dn.24xlarge" => AppInstanceType::MlP3Dn24Xlarge,
            "ml.r5.12xlarge" => AppInstanceType::MlR512Xlarge,
            "ml.r5.16xlarge" => AppInstanceType::MlR516Xlarge,
            "ml.r5.24xlarge" => AppInstanceType::MlR524Xlarge,
            "ml.r5.2xlarge" => AppInstanceType::MlR52Xlarge,
            "ml.r5.4xlarge" => AppInstanceType::MlR54Xlarge,
            "ml.r5.8xlarge" => AppInstanceType::MlR58Xlarge,
            "ml.r5.large" => AppInstanceType::MlR5Large,
            "ml.r5.xlarge" => AppInstanceType::MlR5Xlarge,
            "ml.t3.2xlarge" => AppInstanceType::MlT32Xlarge,
            "ml.t3.large" => AppInstanceType::MlT3Large,
            "ml.t3.medium" => AppInstanceType::MlT3Medium,
            "ml.t3.micro" => AppInstanceType::MlT3Micro,
            "ml.t3.small" => AppInstanceType::MlT3Small,
            "ml.t3.xlarge" => AppInstanceType::MlT3Xlarge,
            "system" => AppInstanceType::System,
            other => AppInstanceType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AppInstanceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppInstanceType::from(s))
    }
}
impl AppInstanceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppInstanceType::MlC512Xlarge => "ml.c5.12xlarge",
            AppInstanceType::MlC518Xlarge => "ml.c5.18xlarge",
            AppInstanceType::MlC524Xlarge => "ml.c5.24xlarge",
            AppInstanceType::MlC52Xlarge => "ml.c5.2xlarge",
            AppInstanceType::MlC54Xlarge => "ml.c5.4xlarge",
            AppInstanceType::MlC59Xlarge => "ml.c5.9xlarge",
            AppInstanceType::MlC5Large => "ml.c5.large",
            AppInstanceType::MlC5Xlarge => "ml.c5.xlarge",
            AppInstanceType::MlG4Dn12Xlarge => "ml.g4dn.12xlarge",
            AppInstanceType::MlG4Dn16Xlarge => "ml.g4dn.16xlarge",
            AppInstanceType::MlG4Dn2Xlarge => "ml.g4dn.2xlarge",
            AppInstanceType::MlG4Dn4Xlarge => "ml.g4dn.4xlarge",
            AppInstanceType::MlG4Dn8Xlarge => "ml.g4dn.8xlarge",
            AppInstanceType::MlG4DnXlarge => "ml.g4dn.xlarge",
            AppInstanceType::MlG512Xlarge => "ml.g5.12xlarge",
            AppInstanceType::MlG516Xlarge => "ml.g5.16xlarge",
            AppInstanceType::MlG524Xlarge => "ml.g5.24xlarge",
            AppInstanceType::MlG52Xlarge => "ml.g5.2xlarge",
            AppInstanceType::MlG548Xlarge => "ml.g5.48xlarge",
            AppInstanceType::MlG54Xlarge => "ml.g5.4xlarge",
            AppInstanceType::MlG58Xlarge => "ml.g5.8xlarge",
            AppInstanceType::MlG5Xlarge => "ml.g5.xlarge",
            AppInstanceType::MlM512Xlarge => "ml.m5.12xlarge",
            AppInstanceType::MlM516Xlarge => "ml.m5.16xlarge",
            AppInstanceType::MlM524Xlarge => "ml.m5.24xlarge",
            AppInstanceType::MlM52Xlarge => "ml.m5.2xlarge",
            AppInstanceType::MlM54Xlarge => "ml.m5.4xlarge",
            AppInstanceType::MlM58Xlarge => "ml.m5.8xlarge",
            AppInstanceType::MlM5Large => "ml.m5.large",
            AppInstanceType::MlM5Xlarge => "ml.m5.xlarge",
            AppInstanceType::MlM5D12Xlarge => "ml.m5d.12xlarge",
            AppInstanceType::MlM5D16Xlarge => "ml.m5d.16xlarge",
            AppInstanceType::MlM5D24Xlarge => "ml.m5d.24xlarge",
            AppInstanceType::MlM5D2Xlarge => "ml.m5d.2xlarge",
            AppInstanceType::MlM5D4Xlarge => "ml.m5d.4xlarge",
            AppInstanceType::MlM5D8Xlarge => "ml.m5d.8xlarge",
            AppInstanceType::MlM5DLarge => "ml.m5d.large",
            AppInstanceType::MlM5DXlarge => "ml.m5d.xlarge",
            AppInstanceType::MlP316Xlarge => "ml.p3.16xlarge",
            AppInstanceType::MlP32Xlarge => "ml.p3.2xlarge",
            AppInstanceType::MlP38Xlarge => "ml.p3.8xlarge",
            AppInstanceType::MlP3Dn24Xlarge => "ml.p3dn.24xlarge",
            AppInstanceType::MlR512Xlarge => "ml.r5.12xlarge",
            AppInstanceType::MlR516Xlarge => "ml.r5.16xlarge",
            AppInstanceType::MlR524Xlarge => "ml.r5.24xlarge",
            AppInstanceType::MlR52Xlarge => "ml.r5.2xlarge",
            AppInstanceType::MlR54Xlarge => "ml.r5.4xlarge",
            AppInstanceType::MlR58Xlarge => "ml.r5.8xlarge",
            AppInstanceType::MlR5Large => "ml.r5.large",
            AppInstanceType::MlR5Xlarge => "ml.r5.xlarge",
            AppInstanceType::MlT32Xlarge => "ml.t3.2xlarge",
            AppInstanceType::MlT3Large => "ml.t3.large",
            AppInstanceType::MlT3Medium => "ml.t3.medium",
            AppInstanceType::MlT3Micro => "ml.t3.micro",
            AppInstanceType::MlT3Small => "ml.t3.small",
            AppInstanceType::MlT3Xlarge => "ml.t3.xlarge",
            AppInstanceType::System => "system",
            AppInstanceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.c5.12xlarge",
            "ml.c5.18xlarge",
            "ml.c5.24xlarge",
            "ml.c5.2xlarge",
            "ml.c5.4xlarge",
            "ml.c5.9xlarge",
            "ml.c5.large",
            "ml.c5.xlarge",
            "ml.g4dn.12xlarge",
            "ml.g4dn.16xlarge",
            "ml.g4dn.2xlarge",
            "ml.g4dn.4xlarge",
            "ml.g4dn.8xlarge",
            "ml.g4dn.xlarge",
            "ml.g5.12xlarge",
            "ml.g5.16xlarge",
            "ml.g5.24xlarge",
            "ml.g5.2xlarge",
            "ml.g5.48xlarge",
            "ml.g5.4xlarge",
            "ml.g5.8xlarge",
            "ml.g5.xlarge",
            "ml.m5.12xlarge",
            "ml.m5.16xlarge",
            "ml.m5.24xlarge",
            "ml.m5.2xlarge",
            "ml.m5.4xlarge",
            "ml.m5.8xlarge",
            "ml.m5.large",
            "ml.m5.xlarge",
            "ml.m5d.12xlarge",
            "ml.m5d.16xlarge",
            "ml.m5d.24xlarge",
            "ml.m5d.2xlarge",
            "ml.m5d.4xlarge",
            "ml.m5d.8xlarge",
            "ml.m5d.large",
            "ml.m5d.xlarge",
            "ml.p3.16xlarge",
            "ml.p3.2xlarge",
            "ml.p3.8xlarge",
            "ml.p3dn.24xlarge",
            "ml.r5.12xlarge",
            "ml.r5.16xlarge",
            "ml.r5.24xlarge",
            "ml.r5.2xlarge",
            "ml.r5.4xlarge",
            "ml.r5.8xlarge",
            "ml.r5.large",
            "ml.r5.xlarge",
            "ml.t3.2xlarge",
            "ml.t3.large",
            "ml.t3.medium",
            "ml.t3.micro",
            "ml.t3.small",
            "ml.t3.xlarge",
            "system",
        ]
    }
}
impl AsRef<str> for AppInstanceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A collection of settings that configure user interaction with the <code>RStudioServerPro</code> app. <code>RStudioServerProAppSettings</code> cannot be updated. The <code>RStudioServerPro</code> app must be deleted and a new one created to make any changes.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RStudioServerProAppSettings {
    /// <p>Indicates whether the current user has access to the <code>RStudioServerPro</code> app.</p>
    #[doc(hidden)]
    pub access_status: std::option::Option<crate::model::RStudioServerProAccessStatus>,
    /// <p>The level of permissions that the user has within the <code>RStudioServerPro</code> app. This value defaults to `User`. The `Admin` value allows the user access to the RStudio Administrative Dashboard.</p>
    #[doc(hidden)]
    pub user_group: std::option::Option<crate::model::RStudioServerProUserGroup>,
}
impl RStudioServerProAppSettings {
    /// <p>Indicates whether the current user has access to the <code>RStudioServerPro</code> app.</p>
    pub fn access_status(
        &self,
    ) -> std::option::Option<&crate::model::RStudioServerProAccessStatus> {
        self.access_status.as_ref()
    }
    /// <p>The level of permissions that the user has within the <code>RStudioServerPro</code> app. This value defaults to `User`. The `Admin` value allows the user access to the RStudio Administrative Dashboard.</p>
    pub fn user_group(&self) -> std::option::Option<&crate::model::RStudioServerProUserGroup> {
        self.user_group.as_ref()
    }
}
/// See [`RStudioServerProAppSettings`](crate::model::RStudioServerProAppSettings).
pub mod r_studio_server_pro_app_settings {

    /// A builder for [`RStudioServerProAppSettings`](crate::model::RStudioServerProAppSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) access_status: std::option::Option<crate::model::RStudioServerProAccessStatus>,
        pub(crate) user_group: std::option::Option<crate::model::RStudioServerProUserGroup>,
    }
    impl Builder {
        /// <p>Indicates whether the current user has access to the <code>RStudioServerPro</code> app.</p>
        pub fn access_status(mut self, input: crate::model::RStudioServerProAccessStatus) -> Self {
            self.access_status = Some(input);
            self
        }
        /// <p>Indicates whether the current user has access to the <code>RStudioServerPro</code> app.</p>
        pub fn set_access_status(
            mut self,
            input: std::option::Option<crate::model::RStudioServerProAccessStatus>,
        ) -> Self {
            self.access_status = input;
            self
        }
        /// <p>The level of permissions that the user has within the <code>RStudioServerPro</code> app. This value defaults to `User`. The `Admin` value allows the user access to the RStudio Administrative Dashboard.</p>
        pub fn user_group(mut self, input: crate::model::RStudioServerProUserGroup) -> Self {
            self.user_group = Some(input);
            self
        }
        /// <p>The level of permissions that the user has within the <code>RStudioServerPro</code> app. This value defaults to `User`. The `Admin` value allows the user access to the RStudio Administrative Dashboard.</p>
        pub fn set_user_group(
            mut self,
            input: std::option::Option<crate::model::RStudioServerProUserGroup>,
        ) -> Self {
            self.user_group = input;
            self
        }
        /// Consumes the builder and constructs a [`RStudioServerProAppSettings`](crate::model::RStudioServerProAppSettings).
        pub fn build(self) -> crate::model::RStudioServerProAppSettings {
            crate::model::RStudioServerProAppSettings {
                access_status: self.access_status,
                user_group: self.user_group,
            }
        }
    }
}
impl RStudioServerProAppSettings {
    /// Creates a new builder-style object to manufacture [`RStudioServerProAppSettings`](crate::model::RStudioServerProAppSettings).
    pub fn builder() -> crate::model::r_studio_server_pro_app_settings::Builder {
        crate::model::r_studio_server_pro_app_settings::Builder::default()
    }
}

/// When writing a match expression against `RStudioServerProUserGroup`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let rstudioserverprousergroup = unimplemented!();
/// match rstudioserverprousergroup {
///     RStudioServerProUserGroup::Admin => { /* ... */ },
///     RStudioServerProUserGroup::User => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `rstudioserverprousergroup` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RStudioServerProUserGroup::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RStudioServerProUserGroup::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RStudioServerProUserGroup::NewFeature` is defined.
/// Specifically, when `rstudioserverprousergroup` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RStudioServerProUserGroup::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RStudioServerProUserGroup {
    #[allow(missing_docs)] // documentation missing in model
    Admin,
    #[allow(missing_docs)] // documentation missing in model
    User,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RStudioServerProUserGroup {
    fn from(s: &str) -> Self {
        match s {
            "R_STUDIO_ADMIN" => RStudioServerProUserGroup::Admin,
            "R_STUDIO_USER" => RStudioServerProUserGroup::User,
            other => RStudioServerProUserGroup::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for RStudioServerProUserGroup {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RStudioServerProUserGroup::from(s))
    }
}
impl RStudioServerProUserGroup {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RStudioServerProUserGroup::Admin => "R_STUDIO_ADMIN",
            RStudioServerProUserGroup::User => "R_STUDIO_USER",
            RStudioServerProUserGroup::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["R_STUDIO_ADMIN", "R_STUDIO_USER"]
    }
}
impl AsRef<str> for RStudioServerProUserGroup {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `RStudioServerProAccessStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let rstudioserverproaccessstatus = unimplemented!();
/// match rstudioserverproaccessstatus {
///     RStudioServerProAccessStatus::Disabled => { /* ... */ },
///     RStudioServerProAccessStatus::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `rstudioserverproaccessstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RStudioServerProAccessStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RStudioServerProAccessStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RStudioServerProAccessStatus::NewFeature` is defined.
/// Specifically, when `rstudioserverproaccessstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RStudioServerProAccessStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RStudioServerProAccessStatus {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RStudioServerProAccessStatus {
    fn from(s: &str) -> Self {
        match s {
            "DISABLED" => RStudioServerProAccessStatus::Disabled,
            "ENABLED" => RStudioServerProAccessStatus::Enabled,
            other => RStudioServerProAccessStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for RStudioServerProAccessStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RStudioServerProAccessStatus::from(s))
    }
}
impl RStudioServerProAccessStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RStudioServerProAccessStatus::Disabled => "DISABLED",
            RStudioServerProAccessStatus::Enabled => "ENABLED",
            RStudioServerProAccessStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["DISABLED", "ENABLED"]
    }
}
impl AsRef<str> for RStudioServerProAccessStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The TensorBoard app settings.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TensorBoardAppSettings {
    /// <p>The default instance type and the Amazon Resource Name (ARN) of the SageMaker image created on the instance.</p>
    #[doc(hidden)]
    pub default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
}
impl TensorBoardAppSettings {
    /// <p>The default instance type and the Amazon Resource Name (ARN) of the SageMaker image created on the instance.</p>
    pub fn default_resource_spec(&self) -> std::option::Option<&crate::model::ResourceSpec> {
        self.default_resource_spec.as_ref()
    }
}
/// See [`TensorBoardAppSettings`](crate::model::TensorBoardAppSettings).
pub mod tensor_board_app_settings {

    /// A builder for [`TensorBoardAppSettings`](crate::model::TensorBoardAppSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
    }
    impl Builder {
        /// <p>The default instance type and the Amazon Resource Name (ARN) of the SageMaker image created on the instance.</p>
        pub fn default_resource_spec(mut self, input: crate::model::ResourceSpec) -> Self {
            self.default_resource_spec = Some(input);
            self
        }
        /// <p>The default instance type and the Amazon Resource Name (ARN) of the SageMaker image created on the instance.</p>
        pub fn set_default_resource_spec(
            mut self,
            input: std::option::Option<crate::model::ResourceSpec>,
        ) -> Self {
            self.default_resource_spec = input;
            self
        }
        /// Consumes the builder and constructs a [`TensorBoardAppSettings`](crate::model::TensorBoardAppSettings).
        pub fn build(self) -> crate::model::TensorBoardAppSettings {
            crate::model::TensorBoardAppSettings {
                default_resource_spec: self.default_resource_spec,
            }
        }
    }
}
impl TensorBoardAppSettings {
    /// Creates a new builder-style object to manufacture [`TensorBoardAppSettings`](crate::model::TensorBoardAppSettings).
    pub fn builder() -> crate::model::tensor_board_app_settings::Builder {
        crate::model::tensor_board_app_settings::Builder::default()
    }
}

/// <p>The KernelGateway app settings.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct KernelGatewayAppSettings {
    /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.</p> <note>
    /// <p>The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the Amazon Web Services Command Line Interface or Amazon Web Services CloudFormation and the instance type parameter value is not passed.</p>
    /// </note>
    #[doc(hidden)]
    pub default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
    /// <p>A list of custom SageMaker images that are configured to run as a KernelGateway app.</p>
    #[doc(hidden)]
    pub custom_images: std::option::Option<std::vec::Vec<crate::model::CustomImage>>,
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the the user profile or domain.</p> <note>
    /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
    /// </note>
    #[doc(hidden)]
    pub lifecycle_config_arns: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl KernelGatewayAppSettings {
    /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.</p> <note>
    /// <p>The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the Amazon Web Services Command Line Interface or Amazon Web Services CloudFormation and the instance type parameter value is not passed.</p>
    /// </note>
    pub fn default_resource_spec(&self) -> std::option::Option<&crate::model::ResourceSpec> {
        self.default_resource_spec.as_ref()
    }
    /// <p>A list of custom SageMaker images that are configured to run as a KernelGateway app.</p>
    pub fn custom_images(&self) -> std::option::Option<&[crate::model::CustomImage]> {
        self.custom_images.as_deref()
    }
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the the user profile or domain.</p> <note>
    /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
    /// </note>
    pub fn lifecycle_config_arns(&self) -> std::option::Option<&[std::string::String]> {
        self.lifecycle_config_arns.as_deref()
    }
}
/// See [`KernelGatewayAppSettings`](crate::model::KernelGatewayAppSettings).
pub mod kernel_gateway_app_settings {

    /// A builder for [`KernelGatewayAppSettings`](crate::model::KernelGatewayAppSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
        pub(crate) custom_images: std::option::Option<std::vec::Vec<crate::model::CustomImage>>,
        pub(crate) lifecycle_config_arns: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.</p> <note>
        /// <p>The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the Amazon Web Services Command Line Interface or Amazon Web Services CloudFormation and the instance type parameter value is not passed.</p>
        /// </note>
        pub fn default_resource_spec(mut self, input: crate::model::ResourceSpec) -> Self {
            self.default_resource_spec = Some(input);
            self
        }
        /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.</p> <note>
        /// <p>The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the Amazon Web Services Command Line Interface or Amazon Web Services CloudFormation and the instance type parameter value is not passed.</p>
        /// </note>
        pub fn set_default_resource_spec(
            mut self,
            input: std::option::Option<crate::model::ResourceSpec>,
        ) -> Self {
            self.default_resource_spec = input;
            self
        }
        /// Appends an item to `custom_images`.
        ///
        /// To override the contents of this collection use [`set_custom_images`](Self::set_custom_images).
        ///
        /// <p>A list of custom SageMaker images that are configured to run as a KernelGateway app.</p>
        pub fn custom_images(mut self, input: crate::model::CustomImage) -> Self {
            let mut v = self.custom_images.unwrap_or_default();
            v.push(input);
            self.custom_images = Some(v);
            self
        }
        /// <p>A list of custom SageMaker images that are configured to run as a KernelGateway app.</p>
        pub fn set_custom_images(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CustomImage>>,
        ) -> Self {
            self.custom_images = input;
            self
        }
        /// Appends an item to `lifecycle_config_arns`.
        ///
        /// To override the contents of this collection use [`set_lifecycle_config_arns`](Self::set_lifecycle_config_arns).
        ///
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the the user profile or domain.</p> <note>
        /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
        /// </note>
        pub fn lifecycle_config_arns(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.lifecycle_config_arns.unwrap_or_default();
            v.push(input.into());
            self.lifecycle_config_arns = Some(v);
            self
        }
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the the user profile or domain.</p> <note>
        /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
        /// </note>
        pub fn set_lifecycle_config_arns(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.lifecycle_config_arns = input;
            self
        }
        /// Consumes the builder and constructs a [`KernelGatewayAppSettings`](crate::model::KernelGatewayAppSettings).
        pub fn build(self) -> crate::model::KernelGatewayAppSettings {
            crate::model::KernelGatewayAppSettings {
                default_resource_spec: self.default_resource_spec,
                custom_images: self.custom_images,
                lifecycle_config_arns: self.lifecycle_config_arns,
            }
        }
    }
}
impl KernelGatewayAppSettings {
    /// Creates a new builder-style object to manufacture [`KernelGatewayAppSettings`](crate::model::KernelGatewayAppSettings).
    pub fn builder() -> crate::model::kernel_gateway_app_settings::Builder {
        crate::model::kernel_gateway_app_settings::Builder::default()
    }
}

/// <p>The JupyterServer app settings.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct JupyterServerAppSettings {
    /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app. If you use the <code>LifecycleConfigArns</code> parameter, then this parameter is also required.</p>
    #[doc(hidden)]
    pub default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the JupyterServerApp. If you use this parameter, the <code>DefaultResourceSpec</code> parameter is also required.</p> <note>
    /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
    /// </note>
    #[doc(hidden)]
    pub lifecycle_config_arns: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A list of Git repositories that SageMaker automatically displays to users for cloning in the JupyterServer application.</p>
    #[doc(hidden)]
    pub code_repositories: std::option::Option<std::vec::Vec<crate::model::CodeRepository>>,
}
impl JupyterServerAppSettings {
    /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app. If you use the <code>LifecycleConfigArns</code> parameter, then this parameter is also required.</p>
    pub fn default_resource_spec(&self) -> std::option::Option<&crate::model::ResourceSpec> {
        self.default_resource_spec.as_ref()
    }
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the JupyterServerApp. If you use this parameter, the <code>DefaultResourceSpec</code> parameter is also required.</p> <note>
    /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
    /// </note>
    pub fn lifecycle_config_arns(&self) -> std::option::Option<&[std::string::String]> {
        self.lifecycle_config_arns.as_deref()
    }
    /// <p>A list of Git repositories that SageMaker automatically displays to users for cloning in the JupyterServer application.</p>
    pub fn code_repositories(&self) -> std::option::Option<&[crate::model::CodeRepository]> {
        self.code_repositories.as_deref()
    }
}
/// See [`JupyterServerAppSettings`](crate::model::JupyterServerAppSettings).
pub mod jupyter_server_app_settings {

    /// A builder for [`JupyterServerAppSettings`](crate::model::JupyterServerAppSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
        pub(crate) lifecycle_config_arns: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) code_repositories:
            std::option::Option<std::vec::Vec<crate::model::CodeRepository>>,
    }
    impl Builder {
        /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app. If you use the <code>LifecycleConfigArns</code> parameter, then this parameter is also required.</p>
        pub fn default_resource_spec(mut self, input: crate::model::ResourceSpec) -> Self {
            self.default_resource_spec = Some(input);
            self
        }
        /// <p>The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app. If you use the <code>LifecycleConfigArns</code> parameter, then this parameter is also required.</p>
        pub fn set_default_resource_spec(
            mut self,
            input: std::option::Option<crate::model::ResourceSpec>,
        ) -> Self {
            self.default_resource_spec = input;
            self
        }
        /// Appends an item to `lifecycle_config_arns`.
        ///
        /// To override the contents of this collection use [`set_lifecycle_config_arns`](Self::set_lifecycle_config_arns).
        ///
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the JupyterServerApp. If you use this parameter, the <code>DefaultResourceSpec</code> parameter is also required.</p> <note>
        /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
        /// </note>
        pub fn lifecycle_config_arns(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.lifecycle_config_arns.unwrap_or_default();
            v.push(input.into());
            self.lifecycle_config_arns = Some(v);
            self
        }
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configurations attached to the JupyterServerApp. If you use this parameter, the <code>DefaultResourceSpec</code> parameter is also required.</p> <note>
        /// <p>To remove a Lifecycle Config, you must set <code>LifecycleConfigArns</code> to an empty list.</p>
        /// </note>
        pub fn set_lifecycle_config_arns(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.lifecycle_config_arns = input;
            self
        }
        /// Appends an item to `code_repositories`.
        ///
        /// To override the contents of this collection use [`set_code_repositories`](Self::set_code_repositories).
        ///
        /// <p>A list of Git repositories that SageMaker automatically displays to users for cloning in the JupyterServer application.</p>
        pub fn code_repositories(mut self, input: crate::model::CodeRepository) -> Self {
            let mut v = self.code_repositories.unwrap_or_default();
            v.push(input);
            self.code_repositories = Some(v);
            self
        }
        /// <p>A list of Git repositories that SageMaker automatically displays to users for cloning in the JupyterServer application.</p>
        pub fn set_code_repositories(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CodeRepository>>,
        ) -> Self {
            self.code_repositories = input;
            self
        }
        /// Consumes the builder and constructs a [`JupyterServerAppSettings`](crate::model::JupyterServerAppSettings).
        pub fn build(self) -> crate::model::JupyterServerAppSettings {
            crate::model::JupyterServerAppSettings {
                default_resource_spec: self.default_resource_spec,
                lifecycle_config_arns: self.lifecycle_config_arns,
                code_repositories: self.code_repositories,
            }
        }
    }
}
impl JupyterServerAppSettings {
    /// Creates a new builder-style object to manufacture [`JupyterServerAppSettings`](crate::model::JupyterServerAppSettings).
    pub fn builder() -> crate::model::jupyter_server_app_settings::Builder {
        crate::model::jupyter_server_app_settings::Builder::default()
    }
}

/// <p>A Git repository that SageMaker automatically displays to users for cloning in the JupyterServer application.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CodeRepository {
    /// <p>The URL of the Git repository.</p>
    #[doc(hidden)]
    pub repository_url: std::option::Option<std::string::String>,
}
impl CodeRepository {
    /// <p>The URL of the Git repository.</p>
    pub fn repository_url(&self) -> std::option::Option<&str> {
        self.repository_url.as_deref()
    }
}
/// See [`CodeRepository`](crate::model::CodeRepository).
pub mod code_repository {

    /// A builder for [`CodeRepository`](crate::model::CodeRepository).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) repository_url: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The URL of the Git repository.</p>
        pub fn repository_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.repository_url = Some(input.into());
            self
        }
        /// <p>The URL of the Git repository.</p>
        pub fn set_repository_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.repository_url = input;
            self
        }
        /// Consumes the builder and constructs a [`CodeRepository`](crate::model::CodeRepository).
        pub fn build(self) -> crate::model::CodeRepository {
            crate::model::CodeRepository {
                repository_url: self.repository_url,
            }
        }
    }
}
impl CodeRepository {
    /// Creates a new builder-style object to manufacture [`CodeRepository`](crate::model::CodeRepository).
    pub fn builder() -> crate::model::code_repository::Builder {
        crate::model::code_repository::Builder::default()
    }
}

/// <p>Specifies options for sharing SageMaker Studio notebooks. These settings are specified as part of <code>DefaultUserSettings</code> when the <code>CreateDomain</code> API is called, and as part of <code>UserSettings</code> when the <code>CreateUserProfile</code> API is called. When <code>SharingSettings</code> is not specified, notebook sharing isn't allowed.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SharingSettings {
    /// <p>Whether to include the notebook cell output when sharing the notebook. The default is <code>Disabled</code>.</p>
    #[doc(hidden)]
    pub notebook_output_option: std::option::Option<crate::model::NotebookOutputOption>,
    /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon S3 bucket used to store the shared notebook snapshots.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon Web Services Key Management Service (KMS) encryption key ID used to encrypt the notebook cell output in the Amazon S3 bucket.</p>
    #[doc(hidden)]
    pub s3_kms_key_id: std::option::Option<std::string::String>,
}
impl SharingSettings {
    /// <p>Whether to include the notebook cell output when sharing the notebook. The default is <code>Disabled</code>.</p>
    pub fn notebook_output_option(
        &self,
    ) -> std::option::Option<&crate::model::NotebookOutputOption> {
        self.notebook_output_option.as_ref()
    }
    /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon S3 bucket used to store the shared notebook snapshots.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon Web Services Key Management Service (KMS) encryption key ID used to encrypt the notebook cell output in the Amazon S3 bucket.</p>
    pub fn s3_kms_key_id(&self) -> std::option::Option<&str> {
        self.s3_kms_key_id.as_deref()
    }
}
/// See [`SharingSettings`](crate::model::SharingSettings).
pub mod sharing_settings {

    /// A builder for [`SharingSettings`](crate::model::SharingSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) notebook_output_option: std::option::Option<crate::model::NotebookOutputOption>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) s3_kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Whether to include the notebook cell output when sharing the notebook. The default is <code>Disabled</code>.</p>
        pub fn notebook_output_option(mut self, input: crate::model::NotebookOutputOption) -> Self {
            self.notebook_output_option = Some(input);
            self
        }
        /// <p>Whether to include the notebook cell output when sharing the notebook. The default is <code>Disabled</code>.</p>
        pub fn set_notebook_output_option(
            mut self,
            input: std::option::Option<crate::model::NotebookOutputOption>,
        ) -> Self {
            self.notebook_output_option = input;
            self
        }
        /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon S3 bucket used to store the shared notebook snapshots.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon S3 bucket used to store the shared notebook snapshots.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon Web Services Key Management Service (KMS) encryption key ID used to encrypt the notebook cell output in the Amazon S3 bucket.</p>
        pub fn s3_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_kms_key_id = Some(input.into());
            self
        }
        /// <p>When <code>NotebookOutputOption</code> is <code>Allowed</code>, the Amazon Web Services Key Management Service (KMS) encryption key ID used to encrypt the notebook cell output in the Amazon S3 bucket.</p>
        pub fn set_s3_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`SharingSettings`](crate::model::SharingSettings).
        pub fn build(self) -> crate::model::SharingSettings {
            crate::model::SharingSettings {
                notebook_output_option: self.notebook_output_option,
                s3_output_path: self.s3_output_path,
                s3_kms_key_id: self.s3_kms_key_id,
            }
        }
    }
}
impl SharingSettings {
    /// Creates a new builder-style object to manufacture [`SharingSettings`](crate::model::SharingSettings).
    pub fn builder() -> crate::model::sharing_settings::Builder {
        crate::model::sharing_settings::Builder::default()
    }
}

/// When writing a match expression against `NotebookOutputOption`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookoutputoption = unimplemented!();
/// match notebookoutputoption {
///     NotebookOutputOption::Allowed => { /* ... */ },
///     NotebookOutputOption::Disabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookoutputoption` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookOutputOption::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookOutputOption::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookOutputOption::NewFeature` is defined.
/// Specifically, when `notebookoutputoption` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookOutputOption::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookOutputOption {
    #[allow(missing_docs)] // documentation missing in model
    Allowed,
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookOutputOption {
    fn from(s: &str) -> Self {
        match s {
            "Allowed" => NotebookOutputOption::Allowed,
            "Disabled" => NotebookOutputOption::Disabled,
            other => {
                NotebookOutputOption::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for NotebookOutputOption {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookOutputOption::from(s))
    }
}
impl NotebookOutputOption {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookOutputOption::Allowed => "Allowed",
            NotebookOutputOption::Disabled => "Disabled",
            NotebookOutputOption::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Allowed", "Disabled"]
    }
}
impl AsRef<str> for NotebookOutputOption {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Represents an input or output artifact of a trial component. You specify <code>TrialComponentArtifact</code> as part of the <code>InputArtifacts</code> and <code>OutputArtifacts</code> parameters in the <code>CreateTrialComponent</code> request.</p>
/// <p>Examples of input artifacts are datasets, algorithms, hyperparameters, source code, and instance types. Examples of output artifacts are metrics, snapshots, logs, and images.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentArtifact {
    /// <p>The media type of the artifact, which indicates the type of data in the artifact file. The media type consists of a <i>type</i> and a <i>subtype</i> concatenated with a slash (/) character, for example, text/csv, image/jpeg, and s3/uri. The type specifies the category of the media. The subtype specifies the kind of data.</p>
    #[doc(hidden)]
    pub media_type: std::option::Option<std::string::String>,
    /// <p>The location of the artifact.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl TrialComponentArtifact {
    /// <p>The media type of the artifact, which indicates the type of data in the artifact file. The media type consists of a <i>type</i> and a <i>subtype</i> concatenated with a slash (/) character, for example, text/csv, image/jpeg, and s3/uri. The type specifies the category of the media. The subtype specifies the kind of data.</p>
    pub fn media_type(&self) -> std::option::Option<&str> {
        self.media_type.as_deref()
    }
    /// <p>The location of the artifact.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`TrialComponentArtifact`](crate::model::TrialComponentArtifact).
pub mod trial_component_artifact {

    /// A builder for [`TrialComponentArtifact`](crate::model::TrialComponentArtifact).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) media_type: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The media type of the artifact, which indicates the type of data in the artifact file. The media type consists of a <i>type</i> and a <i>subtype</i> concatenated with a slash (/) character, for example, text/csv, image/jpeg, and s3/uri. The type specifies the category of the media. The subtype specifies the kind of data.</p>
        pub fn media_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.media_type = Some(input.into());
            self
        }
        /// <p>The media type of the artifact, which indicates the type of data in the artifact file. The media type consists of a <i>type</i> and a <i>subtype</i> concatenated with a slash (/) character, for example, text/csv, image/jpeg, and s3/uri. The type specifies the category of the media. The subtype specifies the kind of data.</p>
        pub fn set_media_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.media_type = input;
            self
        }
        /// <p>The location of the artifact.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The location of the artifact.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentArtifact`](crate::model::TrialComponentArtifact).
        pub fn build(self) -> crate::model::TrialComponentArtifact {
            crate::model::TrialComponentArtifact {
                media_type: self.media_type,
                value: self.value,
            }
        }
    }
}
impl TrialComponentArtifact {
    /// Creates a new builder-style object to manufacture [`TrialComponentArtifact`](crate::model::TrialComponentArtifact).
    pub fn builder() -> crate::model::trial_component_artifact::Builder {
        crate::model::trial_component_artifact::Builder::default()
    }
}

/// <p>The value of a hyperparameter. Only one of <code>NumberValue</code> or <code>StringValue</code> can be specified.</p>
/// <p>This object is specified in the <code>CreateTrialComponent</code> request.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub enum TrialComponentParameterValue {
    /// <p>The numeric value of a numeric hyperparameter. If you specify a value for this parameter, you can't specify the <code>StringValue</code> parameter.</p>
    NumberValue(f64),
    /// <p>The string value of a categorical hyperparameter. If you specify a value for this parameter, you can't specify the <code>NumberValue</code> parameter.</p>
    StringValue(std::string::String),
    /// The `Unknown` variant represents cases where new union variant was received. Consider upgrading the SDK to the latest available version.
    /// An unknown enum variant
    ///
    /// _Note: If you encounter this error, consider upgrading your SDK to the latest version._
    /// The `Unknown` variant represents cases where the server sent a value that wasn't recognized
    /// by the client. This can happen when the server adds new functionality, but the client has not been updated.
    /// To investigate this, consider turning on debug logging to print the raw HTTP response.
    #[non_exhaustive]
    Unknown,
}
impl TrialComponentParameterValue {
    /// Tries to convert the enum instance into [`NumberValue`](crate::model::TrialComponentParameterValue::NumberValue), extracting the inner [`f64`](f64).
    /// Returns `Err(&Self)` if it can't be converted.
    pub fn as_number_value(&self) -> std::result::Result<&f64, &Self> {
        if let TrialComponentParameterValue::NumberValue(val) = &self {
            Ok(val)
        } else {
            Err(self)
        }
    }
    /// Returns true if this is a [`NumberValue`](crate::model::TrialComponentParameterValue::NumberValue).
    pub fn is_number_value(&self) -> bool {
        self.as_number_value().is_ok()
    }
    /// Tries to convert the enum instance into [`StringValue`](crate::model::TrialComponentParameterValue::StringValue), extracting the inner [`String`](std::string::String).
    /// Returns `Err(&Self)` if it can't be converted.
    pub fn as_string_value(&self) -> std::result::Result<&std::string::String, &Self> {
        if let TrialComponentParameterValue::StringValue(val) = &self {
            Ok(val)
        } else {
            Err(self)
        }
    }
    /// Returns true if this is a [`StringValue`](crate::model::TrialComponentParameterValue::StringValue).
    pub fn is_string_value(&self) -> bool {
        self.as_string_value().is_ok()
    }
    /// Returns true if the enum instance is the `Unknown` variant.
    pub fn is_unknown(&self) -> bool {
        matches!(self, Self::Unknown)
    }
}

/// <p>The status of the trial component.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentStatus {
    /// <p>The status of the trial component.</p>
    #[doc(hidden)]
    pub primary_status: std::option::Option<crate::model::TrialComponentPrimaryStatus>,
    /// <p>If the component failed, a message describing why.</p>
    #[doc(hidden)]
    pub message: std::option::Option<std::string::String>,
}
impl TrialComponentStatus {
    /// <p>The status of the trial component.</p>
    pub fn primary_status(
        &self,
    ) -> std::option::Option<&crate::model::TrialComponentPrimaryStatus> {
        self.primary_status.as_ref()
    }
    /// <p>If the component failed, a message describing why.</p>
    pub fn message(&self) -> std::option::Option<&str> {
        self.message.as_deref()
    }
}
/// See [`TrialComponentStatus`](crate::model::TrialComponentStatus).
pub mod trial_component_status {

    /// A builder for [`TrialComponentStatus`](crate::model::TrialComponentStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) primary_status: std::option::Option<crate::model::TrialComponentPrimaryStatus>,
        pub(crate) message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The status of the trial component.</p>
        pub fn primary_status(mut self, input: crate::model::TrialComponentPrimaryStatus) -> Self {
            self.primary_status = Some(input);
            self
        }
        /// <p>The status of the trial component.</p>
        pub fn set_primary_status(
            mut self,
            input: std::option::Option<crate::model::TrialComponentPrimaryStatus>,
        ) -> Self {
            self.primary_status = input;
            self
        }
        /// <p>If the component failed, a message describing why.</p>
        pub fn message(mut self, input: impl Into<std::string::String>) -> Self {
            self.message = Some(input.into());
            self
        }
        /// <p>If the component failed, a message describing why.</p>
        pub fn set_message(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.message = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentStatus`](crate::model::TrialComponentStatus).
        pub fn build(self) -> crate::model::TrialComponentStatus {
            crate::model::TrialComponentStatus {
                primary_status: self.primary_status,
                message: self.message,
            }
        }
    }
}
impl TrialComponentStatus {
    /// Creates a new builder-style object to manufacture [`TrialComponentStatus`](crate::model::TrialComponentStatus).
    pub fn builder() -> crate::model::trial_component_status::Builder {
        crate::model::trial_component_status::Builder::default()
    }
}

/// When writing a match expression against `TrialComponentPrimaryStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let trialcomponentprimarystatus = unimplemented!();
/// match trialcomponentprimarystatus {
///     TrialComponentPrimaryStatus::Completed => { /* ... */ },
///     TrialComponentPrimaryStatus::Failed => { /* ... */ },
///     TrialComponentPrimaryStatus::InProgress => { /* ... */ },
///     TrialComponentPrimaryStatus::Stopped => { /* ... */ },
///     TrialComponentPrimaryStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `trialcomponentprimarystatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrialComponentPrimaryStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrialComponentPrimaryStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrialComponentPrimaryStatus::NewFeature` is defined.
/// Specifically, when `trialcomponentprimarystatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrialComponentPrimaryStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrialComponentPrimaryStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrialComponentPrimaryStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => TrialComponentPrimaryStatus::Completed,
            "Failed" => TrialComponentPrimaryStatus::Failed,
            "InProgress" => TrialComponentPrimaryStatus::InProgress,
            "Stopped" => TrialComponentPrimaryStatus::Stopped,
            "Stopping" => TrialComponentPrimaryStatus::Stopping,
            other => TrialComponentPrimaryStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for TrialComponentPrimaryStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrialComponentPrimaryStatus::from(s))
    }
}
impl TrialComponentPrimaryStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrialComponentPrimaryStatus::Completed => "Completed",
            TrialComponentPrimaryStatus::Failed => "Failed",
            TrialComponentPrimaryStatus::InProgress => "InProgress",
            TrialComponentPrimaryStatus::Stopped => "Stopped",
            TrialComponentPrimaryStatus::Stopping => "Stopping",
            TrialComponentPrimaryStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for TrialComponentPrimaryStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The <code>ResourceConfig</code> to update <code>KeepAlivePeriodInSeconds</code>. Other fields in the <code>ResourceConfig</code> cannot be updated.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ResourceConfigForUpdate {
    /// <p>The <code>KeepAlivePeriodInSeconds</code> value specified in the <code>ResourceConfig</code> to update.</p>
    #[doc(hidden)]
    pub keep_alive_period_in_seconds: std::option::Option<i32>,
}
impl ResourceConfigForUpdate {
    /// <p>The <code>KeepAlivePeriodInSeconds</code> value specified in the <code>ResourceConfig</code> to update.</p>
    pub fn keep_alive_period_in_seconds(&self) -> std::option::Option<i32> {
        self.keep_alive_period_in_seconds
    }
}
/// See [`ResourceConfigForUpdate`](crate::model::ResourceConfigForUpdate).
pub mod resource_config_for_update {

    /// A builder for [`ResourceConfigForUpdate`](crate::model::ResourceConfigForUpdate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) keep_alive_period_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The <code>KeepAlivePeriodInSeconds</code> value specified in the <code>ResourceConfig</code> to update.</p>
        pub fn keep_alive_period_in_seconds(mut self, input: i32) -> Self {
            self.keep_alive_period_in_seconds = Some(input);
            self
        }
        /// <p>The <code>KeepAlivePeriodInSeconds</code> value specified in the <code>ResourceConfig</code> to update.</p>
        pub fn set_keep_alive_period_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.keep_alive_period_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`ResourceConfigForUpdate`](crate::model::ResourceConfigForUpdate).
        pub fn build(self) -> crate::model::ResourceConfigForUpdate {
            crate::model::ResourceConfigForUpdate {
                keep_alive_period_in_seconds: self.keep_alive_period_in_seconds,
            }
        }
    }
}
impl ResourceConfigForUpdate {
    /// Creates a new builder-style object to manufacture [`ResourceConfigForUpdate`](crate::model::ResourceConfigForUpdate).
    pub fn builder() -> crate::model::resource_config_for_update::Builder {
        crate::model::resource_config_for_update::Builder::default()
    }
}

/// <p>Configuration information for profiling rules.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProfilerRuleConfiguration {
    /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
    #[doc(hidden)]
    pub rule_configuration_name: std::option::Option<std::string::String>,
    /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>. </p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Path to Amazon S3 storage location for rules.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>The Amazon Elastic Container Registry Image for the managed rule evaluation.</p>
    #[doc(hidden)]
    pub rule_evaluator_image: std::option::Option<std::string::String>,
    /// <p>The instance type to deploy a custom rule for profiling a training job.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
    /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
    #[doc(hidden)]
    pub volume_size_in_gb: i32,
    /// <p>Runtime configuration for rule container.</p>
    #[doc(hidden)]
    pub rule_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl ProfilerRuleConfiguration {
    /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
    pub fn rule_configuration_name(&self) -> std::option::Option<&str> {
        self.rule_configuration_name.as_deref()
    }
    /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>. </p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Path to Amazon S3 storage location for rules.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>The Amazon Elastic Container Registry Image for the managed rule evaluation.</p>
    pub fn rule_evaluator_image(&self) -> std::option::Option<&str> {
        self.rule_evaluator_image.as_deref()
    }
    /// <p>The instance type to deploy a custom rule for profiling a training job.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::ProcessingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
    pub fn volume_size_in_gb(&self) -> i32 {
        self.volume_size_in_gb
    }
    /// <p>Runtime configuration for rule container.</p>
    pub fn rule_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.rule_parameters.as_ref()
    }
}
/// See [`ProfilerRuleConfiguration`](crate::model::ProfilerRuleConfiguration).
pub mod profiler_rule_configuration {

    /// A builder for [`ProfilerRuleConfiguration`](crate::model::ProfilerRuleConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) rule_configuration_name: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) rule_evaluator_image: std::option::Option<std::string::String>,
        pub(crate) instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) rule_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
        pub fn rule_configuration_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_configuration_name = Some(input.into());
            self
        }
        /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
        pub fn set_rule_configuration_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_configuration_name = input;
            self
        }
        /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>. </p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>. </p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Path to Amazon S3 storage location for rules.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Path to Amazon S3 storage location for rules.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>The Amazon Elastic Container Registry Image for the managed rule evaluation.</p>
        pub fn rule_evaluator_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_evaluator_image = Some(input.into());
            self
        }
        /// <p>The Amazon Elastic Container Registry Image for the managed rule evaluation.</p>
        pub fn set_rule_evaluator_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_evaluator_image = input;
            self
        }
        /// <p>The instance type to deploy a custom rule for profiling a training job.</p>
        pub fn instance_type(mut self, input: crate::model::ProcessingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type to deploy a custom rule for profiling a training job.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// Adds a key-value pair to `rule_parameters`.
        ///
        /// To override the contents of this collection use [`set_rule_parameters`](Self::set_rule_parameters).
        ///
        /// <p>Runtime configuration for rule container.</p>
        pub fn rule_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.rule_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.rule_parameters = Some(hash_map);
            self
        }
        /// <p>Runtime configuration for rule container.</p>
        pub fn set_rule_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.rule_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`ProfilerRuleConfiguration`](crate::model::ProfilerRuleConfiguration).
        pub fn build(self) -> crate::model::ProfilerRuleConfiguration {
            crate::model::ProfilerRuleConfiguration {
                rule_configuration_name: self.rule_configuration_name,
                local_path: self.local_path,
                s3_output_path: self.s3_output_path,
                rule_evaluator_image: self.rule_evaluator_image,
                instance_type: self.instance_type,
                volume_size_in_gb: self.volume_size_in_gb.unwrap_or_default(),
                rule_parameters: self.rule_parameters,
            }
        }
    }
}
impl ProfilerRuleConfiguration {
    /// Creates a new builder-style object to manufacture [`ProfilerRuleConfiguration`](crate::model::ProfilerRuleConfiguration).
    pub fn builder() -> crate::model::profiler_rule_configuration::Builder {
        crate::model::profiler_rule_configuration::Builder::default()
    }
}

/// When writing a match expression against `ProcessingInstanceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processinginstancetype = unimplemented!();
/// match processinginstancetype {
///     ProcessingInstanceType::MlC42Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC44Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC48Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC4Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC518Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC52Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC54Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC59Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlC5Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlG4Dn12Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlG4Dn16Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlG4Dn2Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlG4Dn4Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlG4Dn8Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlG4DnXlarge => { /* ... */ },
///     ProcessingInstanceType::MlM410Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM416Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM42Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM44Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM4Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM512Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM524Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM52Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM54Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlM5Large => { /* ... */ },
///     ProcessingInstanceType::MlM5Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlP216Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlP28Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlP2Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlP316Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlP32Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlP38Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR512Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR516Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR524Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR52Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR54Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR58Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlR5Large => { /* ... */ },
///     ProcessingInstanceType::MlR5Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlT32Xlarge => { /* ... */ },
///     ProcessingInstanceType::MlT3Large => { /* ... */ },
///     ProcessingInstanceType::MlT3Medium => { /* ... */ },
///     ProcessingInstanceType::MlT3Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processinginstancetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingInstanceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingInstanceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingInstanceType::NewFeature` is defined.
/// Specifically, when `processinginstancetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingInstanceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingInstanceType {
    #[allow(missing_docs)] // documentation missing in model
    MlC42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC48Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC518Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC59Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4DnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM410Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM416Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP216Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP28Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP316Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP38Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Large,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingInstanceType {
    fn from(s: &str) -> Self {
        match s {
            "ml.c4.2xlarge" => ProcessingInstanceType::MlC42Xlarge,
            "ml.c4.4xlarge" => ProcessingInstanceType::MlC44Xlarge,
            "ml.c4.8xlarge" => ProcessingInstanceType::MlC48Xlarge,
            "ml.c4.xlarge" => ProcessingInstanceType::MlC4Xlarge,
            "ml.c5.18xlarge" => ProcessingInstanceType::MlC518Xlarge,
            "ml.c5.2xlarge" => ProcessingInstanceType::MlC52Xlarge,
            "ml.c5.4xlarge" => ProcessingInstanceType::MlC54Xlarge,
            "ml.c5.9xlarge" => ProcessingInstanceType::MlC59Xlarge,
            "ml.c5.xlarge" => ProcessingInstanceType::MlC5Xlarge,
            "ml.g4dn.12xlarge" => ProcessingInstanceType::MlG4Dn12Xlarge,
            "ml.g4dn.16xlarge" => ProcessingInstanceType::MlG4Dn16Xlarge,
            "ml.g4dn.2xlarge" => ProcessingInstanceType::MlG4Dn2Xlarge,
            "ml.g4dn.4xlarge" => ProcessingInstanceType::MlG4Dn4Xlarge,
            "ml.g4dn.8xlarge" => ProcessingInstanceType::MlG4Dn8Xlarge,
            "ml.g4dn.xlarge" => ProcessingInstanceType::MlG4DnXlarge,
            "ml.m4.10xlarge" => ProcessingInstanceType::MlM410Xlarge,
            "ml.m4.16xlarge" => ProcessingInstanceType::MlM416Xlarge,
            "ml.m4.2xlarge" => ProcessingInstanceType::MlM42Xlarge,
            "ml.m4.4xlarge" => ProcessingInstanceType::MlM44Xlarge,
            "ml.m4.xlarge" => ProcessingInstanceType::MlM4Xlarge,
            "ml.m5.12xlarge" => ProcessingInstanceType::MlM512Xlarge,
            "ml.m5.24xlarge" => ProcessingInstanceType::MlM524Xlarge,
            "ml.m5.2xlarge" => ProcessingInstanceType::MlM52Xlarge,
            "ml.m5.4xlarge" => ProcessingInstanceType::MlM54Xlarge,
            "ml.m5.large" => ProcessingInstanceType::MlM5Large,
            "ml.m5.xlarge" => ProcessingInstanceType::MlM5Xlarge,
            "ml.p2.16xlarge" => ProcessingInstanceType::MlP216Xlarge,
            "ml.p2.8xlarge" => ProcessingInstanceType::MlP28Xlarge,
            "ml.p2.xlarge" => ProcessingInstanceType::MlP2Xlarge,
            "ml.p3.16xlarge" => ProcessingInstanceType::MlP316Xlarge,
            "ml.p3.2xlarge" => ProcessingInstanceType::MlP32Xlarge,
            "ml.p3.8xlarge" => ProcessingInstanceType::MlP38Xlarge,
            "ml.r5.12xlarge" => ProcessingInstanceType::MlR512Xlarge,
            "ml.r5.16xlarge" => ProcessingInstanceType::MlR516Xlarge,
            "ml.r5.24xlarge" => ProcessingInstanceType::MlR524Xlarge,
            "ml.r5.2xlarge" => ProcessingInstanceType::MlR52Xlarge,
            "ml.r5.4xlarge" => ProcessingInstanceType::MlR54Xlarge,
            "ml.r5.8xlarge" => ProcessingInstanceType::MlR58Xlarge,
            "ml.r5.large" => ProcessingInstanceType::MlR5Large,
            "ml.r5.xlarge" => ProcessingInstanceType::MlR5Xlarge,
            "ml.t3.2xlarge" => ProcessingInstanceType::MlT32Xlarge,
            "ml.t3.large" => ProcessingInstanceType::MlT3Large,
            "ml.t3.medium" => ProcessingInstanceType::MlT3Medium,
            "ml.t3.xlarge" => ProcessingInstanceType::MlT3Xlarge,
            other => {
                ProcessingInstanceType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ProcessingInstanceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingInstanceType::from(s))
    }
}
impl ProcessingInstanceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingInstanceType::MlC42Xlarge => "ml.c4.2xlarge",
            ProcessingInstanceType::MlC44Xlarge => "ml.c4.4xlarge",
            ProcessingInstanceType::MlC48Xlarge => "ml.c4.8xlarge",
            ProcessingInstanceType::MlC4Xlarge => "ml.c4.xlarge",
            ProcessingInstanceType::MlC518Xlarge => "ml.c5.18xlarge",
            ProcessingInstanceType::MlC52Xlarge => "ml.c5.2xlarge",
            ProcessingInstanceType::MlC54Xlarge => "ml.c5.4xlarge",
            ProcessingInstanceType::MlC59Xlarge => "ml.c5.9xlarge",
            ProcessingInstanceType::MlC5Xlarge => "ml.c5.xlarge",
            ProcessingInstanceType::MlG4Dn12Xlarge => "ml.g4dn.12xlarge",
            ProcessingInstanceType::MlG4Dn16Xlarge => "ml.g4dn.16xlarge",
            ProcessingInstanceType::MlG4Dn2Xlarge => "ml.g4dn.2xlarge",
            ProcessingInstanceType::MlG4Dn4Xlarge => "ml.g4dn.4xlarge",
            ProcessingInstanceType::MlG4Dn8Xlarge => "ml.g4dn.8xlarge",
            ProcessingInstanceType::MlG4DnXlarge => "ml.g4dn.xlarge",
            ProcessingInstanceType::MlM410Xlarge => "ml.m4.10xlarge",
            ProcessingInstanceType::MlM416Xlarge => "ml.m4.16xlarge",
            ProcessingInstanceType::MlM42Xlarge => "ml.m4.2xlarge",
            ProcessingInstanceType::MlM44Xlarge => "ml.m4.4xlarge",
            ProcessingInstanceType::MlM4Xlarge => "ml.m4.xlarge",
            ProcessingInstanceType::MlM512Xlarge => "ml.m5.12xlarge",
            ProcessingInstanceType::MlM524Xlarge => "ml.m5.24xlarge",
            ProcessingInstanceType::MlM52Xlarge => "ml.m5.2xlarge",
            ProcessingInstanceType::MlM54Xlarge => "ml.m5.4xlarge",
            ProcessingInstanceType::MlM5Large => "ml.m5.large",
            ProcessingInstanceType::MlM5Xlarge => "ml.m5.xlarge",
            ProcessingInstanceType::MlP216Xlarge => "ml.p2.16xlarge",
            ProcessingInstanceType::MlP28Xlarge => "ml.p2.8xlarge",
            ProcessingInstanceType::MlP2Xlarge => "ml.p2.xlarge",
            ProcessingInstanceType::MlP316Xlarge => "ml.p3.16xlarge",
            ProcessingInstanceType::MlP32Xlarge => "ml.p3.2xlarge",
            ProcessingInstanceType::MlP38Xlarge => "ml.p3.8xlarge",
            ProcessingInstanceType::MlR512Xlarge => "ml.r5.12xlarge",
            ProcessingInstanceType::MlR516Xlarge => "ml.r5.16xlarge",
            ProcessingInstanceType::MlR524Xlarge => "ml.r5.24xlarge",
            ProcessingInstanceType::MlR52Xlarge => "ml.r5.2xlarge",
            ProcessingInstanceType::MlR54Xlarge => "ml.r5.4xlarge",
            ProcessingInstanceType::MlR58Xlarge => "ml.r5.8xlarge",
            ProcessingInstanceType::MlR5Large => "ml.r5.large",
            ProcessingInstanceType::MlR5Xlarge => "ml.r5.xlarge",
            ProcessingInstanceType::MlT32Xlarge => "ml.t3.2xlarge",
            ProcessingInstanceType::MlT3Large => "ml.t3.large",
            ProcessingInstanceType::MlT3Medium => "ml.t3.medium",
            ProcessingInstanceType::MlT3Xlarge => "ml.t3.xlarge",
            ProcessingInstanceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.c4.2xlarge",
            "ml.c4.4xlarge",
            "ml.c4.8xlarge",
            "ml.c4.xlarge",
            "ml.c5.18xlarge",
            "ml.c5.2xlarge",
            "ml.c5.4xlarge",
            "ml.c5.9xlarge",
            "ml.c5.xlarge",
            "ml.g4dn.12xlarge",
            "ml.g4dn.16xlarge",
            "ml.g4dn.2xlarge",
            "ml.g4dn.4xlarge",
            "ml.g4dn.8xlarge",
            "ml.g4dn.xlarge",
            "ml.m4.10xlarge",
            "ml.m4.16xlarge",
            "ml.m4.2xlarge",
            "ml.m4.4xlarge",
            "ml.m4.xlarge",
            "ml.m5.12xlarge",
            "ml.m5.24xlarge",
            "ml.m5.2xlarge",
            "ml.m5.4xlarge",
            "ml.m5.large",
            "ml.m5.xlarge",
            "ml.p2.16xlarge",
            "ml.p2.8xlarge",
            "ml.p2.xlarge",
            "ml.p3.16xlarge",
            "ml.p3.2xlarge",
            "ml.p3.8xlarge",
            "ml.r5.12xlarge",
            "ml.r5.16xlarge",
            "ml.r5.24xlarge",
            "ml.r5.2xlarge",
            "ml.r5.4xlarge",
            "ml.r5.8xlarge",
            "ml.r5.large",
            "ml.r5.xlarge",
            "ml.t3.2xlarge",
            "ml.t3.large",
            "ml.t3.medium",
            "ml.t3.xlarge",
        ]
    }
}
impl AsRef<str> for ProcessingInstanceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration information for updating the Amazon SageMaker Debugger profile parameters, system and framework metrics configurations, and storage paths.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProfilerConfigForUpdate {
    /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
    #[doc(hidden)]
    pub profiling_interval_in_milliseconds: std::option::Option<i64>,
    /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
    #[doc(hidden)]
    pub profiling_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>To turn off Amazon SageMaker Debugger monitoring and profiling while a training job is in progress, set to <code>True</code>.</p>
    #[doc(hidden)]
    pub disable_profiler: bool,
}
impl ProfilerConfigForUpdate {
    /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
    pub fn profiling_interval_in_milliseconds(&self) -> std::option::Option<i64> {
        self.profiling_interval_in_milliseconds
    }
    /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
    pub fn profiling_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.profiling_parameters.as_ref()
    }
    /// <p>To turn off Amazon SageMaker Debugger monitoring and profiling while a training job is in progress, set to <code>True</code>.</p>
    pub fn disable_profiler(&self) -> bool {
        self.disable_profiler
    }
}
/// See [`ProfilerConfigForUpdate`](crate::model::ProfilerConfigForUpdate).
pub mod profiler_config_for_update {

    /// A builder for [`ProfilerConfigForUpdate`](crate::model::ProfilerConfigForUpdate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) profiling_interval_in_milliseconds: std::option::Option<i64>,
        pub(crate) profiling_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) disable_profiler: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
        pub fn profiling_interval_in_milliseconds(mut self, input: i64) -> Self {
            self.profiling_interval_in_milliseconds = Some(input);
            self
        }
        /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
        pub fn set_profiling_interval_in_milliseconds(
            mut self,
            input: std::option::Option<i64>,
        ) -> Self {
            self.profiling_interval_in_milliseconds = input;
            self
        }
        /// Adds a key-value pair to `profiling_parameters`.
        ///
        /// To override the contents of this collection use [`set_profiling_parameters`](Self::set_profiling_parameters).
        ///
        /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
        pub fn profiling_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.profiling_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.profiling_parameters = Some(hash_map);
            self
        }
        /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
        pub fn set_profiling_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.profiling_parameters = input;
            self
        }
        /// <p>To turn off Amazon SageMaker Debugger monitoring and profiling while a training job is in progress, set to <code>True</code>.</p>
        pub fn disable_profiler(mut self, input: bool) -> Self {
            self.disable_profiler = Some(input);
            self
        }
        /// <p>To turn off Amazon SageMaker Debugger monitoring and profiling while a training job is in progress, set to <code>True</code>.</p>
        pub fn set_disable_profiler(mut self, input: std::option::Option<bool>) -> Self {
            self.disable_profiler = input;
            self
        }
        /// Consumes the builder and constructs a [`ProfilerConfigForUpdate`](crate::model::ProfilerConfigForUpdate).
        pub fn build(self) -> crate::model::ProfilerConfigForUpdate {
            crate::model::ProfilerConfigForUpdate {
                s3_output_path: self.s3_output_path,
                profiling_interval_in_milliseconds: self.profiling_interval_in_milliseconds,
                profiling_parameters: self.profiling_parameters,
                disable_profiler: self.disable_profiler.unwrap_or_default(),
            }
        }
    }
}
impl ProfilerConfigForUpdate {
    /// Creates a new builder-style object to manufacture [`ProfilerConfigForUpdate`](crate::model::ProfilerConfigForUpdate).
    pub fn builder() -> crate::model::profiler_config_for_update::Builder {
        crate::model::profiler_config_for_update::Builder::default()
    }
}

/// <p>A collection of space settings.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SpaceSettings {
    /// <p>The JupyterServer app settings.</p>
    #[doc(hidden)]
    pub jupyter_server_app_settings: std::option::Option<crate::model::JupyterServerAppSettings>,
    /// <p>The KernelGateway app settings.</p>
    #[doc(hidden)]
    pub kernel_gateway_app_settings: std::option::Option<crate::model::KernelGatewayAppSettings>,
}
impl SpaceSettings {
    /// <p>The JupyterServer app settings.</p>
    pub fn jupyter_server_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::JupyterServerAppSettings> {
        self.jupyter_server_app_settings.as_ref()
    }
    /// <p>The KernelGateway app settings.</p>
    pub fn kernel_gateway_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::KernelGatewayAppSettings> {
        self.kernel_gateway_app_settings.as_ref()
    }
}
/// See [`SpaceSettings`](crate::model::SpaceSettings).
pub mod space_settings {

    /// A builder for [`SpaceSettings`](crate::model::SpaceSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) jupyter_server_app_settings:
            std::option::Option<crate::model::JupyterServerAppSettings>,
        pub(crate) kernel_gateway_app_settings:
            std::option::Option<crate::model::KernelGatewayAppSettings>,
    }
    impl Builder {
        /// <p>The JupyterServer app settings.</p>
        pub fn jupyter_server_app_settings(
            mut self,
            input: crate::model::JupyterServerAppSettings,
        ) -> Self {
            self.jupyter_server_app_settings = Some(input);
            self
        }
        /// <p>The JupyterServer app settings.</p>
        pub fn set_jupyter_server_app_settings(
            mut self,
            input: std::option::Option<crate::model::JupyterServerAppSettings>,
        ) -> Self {
            self.jupyter_server_app_settings = input;
            self
        }
        /// <p>The KernelGateway app settings.</p>
        pub fn kernel_gateway_app_settings(
            mut self,
            input: crate::model::KernelGatewayAppSettings,
        ) -> Self {
            self.kernel_gateway_app_settings = Some(input);
            self
        }
        /// <p>The KernelGateway app settings.</p>
        pub fn set_kernel_gateway_app_settings(
            mut self,
            input: std::option::Option<crate::model::KernelGatewayAppSettings>,
        ) -> Self {
            self.kernel_gateway_app_settings = input;
            self
        }
        /// Consumes the builder and constructs a [`SpaceSettings`](crate::model::SpaceSettings).
        pub fn build(self) -> crate::model::SpaceSettings {
            crate::model::SpaceSettings {
                jupyter_server_app_settings: self.jupyter_server_app_settings,
                kernel_gateway_app_settings: self.kernel_gateway_app_settings,
            }
        }
    }
}
impl SpaceSettings {
    /// Creates a new builder-style object to manufacture [`SpaceSettings`](crate::model::SpaceSettings).
    pub fn builder() -> crate::model::space_settings::Builder {
        crate::model::space_settings::Builder::default()
    }
}

/// <p>A tag object that consists of a key and an optional value, used to manage metadata for SageMaker Amazon Web Services resources.</p>
/// <p>You can add tags to notebook instances, training jobs, hyperparameter tuning jobs, batch transform jobs, models, labeling jobs, work teams, endpoint configurations, and endpoints. For more information on adding tags to SageMaker resources, see <code>AddTags</code>.</p>
/// <p>For more information on adding metadata to your Amazon Web Services resources with tagging, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a>. For advice on best practices for managing Amazon Web Services resources with tagging, see <a href="https://d1.awsstatic.com/whitepapers/aws-tagging-best-practices.pdf">Tagging Best Practices: Implement an Effective Amazon Web Services Resource Tagging Strategy</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Tag {
    /// <p>The tag key. Tag keys must be unique per resource.</p>
    #[doc(hidden)]
    pub key: std::option::Option<std::string::String>,
    /// <p>The tag value.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl Tag {
    /// <p>The tag key. Tag keys must be unique per resource.</p>
    pub fn key(&self) -> std::option::Option<&str> {
        self.key.as_deref()
    }
    /// <p>The tag value.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`Tag`](crate::model::Tag).
pub mod tag {

    /// A builder for [`Tag`](crate::model::Tag).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) key: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The tag key. Tag keys must be unique per resource.</p>
        pub fn key(mut self, input: impl Into<std::string::String>) -> Self {
            self.key = Some(input.into());
            self
        }
        /// <p>The tag key. Tag keys must be unique per resource.</p>
        pub fn set_key(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.key = input;
            self
        }
        /// <p>The tag value.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The tag value.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`Tag`](crate::model::Tag).
        pub fn build(self) -> crate::model::Tag {
            crate::model::Tag {
                key: self.key,
                value: self.value,
            }
        }
    }
}
impl Tag {
    /// Creates a new builder-style object to manufacture [`Tag`](crate::model::Tag).
    pub fn builder() -> crate::model::tag::Builder {
        crate::model::tag::Builder::default()
    }
}

/// <p>Details that you specify to provision a service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ServiceCatalogProvisioningUpdateDetails {
    /// <p>The ID of the provisioning artifact.</p>
    #[doc(hidden)]
    pub provisioning_artifact_id: std::option::Option<std::string::String>,
    /// <p>A list of key value pairs that you specify when you provision a product.</p>
    #[doc(hidden)]
    pub provisioning_parameters:
        std::option::Option<std::vec::Vec<crate::model::ProvisioningParameter>>,
}
impl ServiceCatalogProvisioningUpdateDetails {
    /// <p>The ID of the provisioning artifact.</p>
    pub fn provisioning_artifact_id(&self) -> std::option::Option<&str> {
        self.provisioning_artifact_id.as_deref()
    }
    /// <p>A list of key value pairs that you specify when you provision a product.</p>
    pub fn provisioning_parameters(
        &self,
    ) -> std::option::Option<&[crate::model::ProvisioningParameter]> {
        self.provisioning_parameters.as_deref()
    }
}
/// See [`ServiceCatalogProvisioningUpdateDetails`](crate::model::ServiceCatalogProvisioningUpdateDetails).
pub mod service_catalog_provisioning_update_details {

    /// A builder for [`ServiceCatalogProvisioningUpdateDetails`](crate::model::ServiceCatalogProvisioningUpdateDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) provisioning_artifact_id: std::option::Option<std::string::String>,
        pub(crate) provisioning_parameters:
            std::option::Option<std::vec::Vec<crate::model::ProvisioningParameter>>,
    }
    impl Builder {
        /// <p>The ID of the provisioning artifact.</p>
        pub fn provisioning_artifact_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.provisioning_artifact_id = Some(input.into());
            self
        }
        /// <p>The ID of the provisioning artifact.</p>
        pub fn set_provisioning_artifact_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.provisioning_artifact_id = input;
            self
        }
        /// Appends an item to `provisioning_parameters`.
        ///
        /// To override the contents of this collection use [`set_provisioning_parameters`](Self::set_provisioning_parameters).
        ///
        /// <p>A list of key value pairs that you specify when you provision a product.</p>
        pub fn provisioning_parameters(
            mut self,
            input: crate::model::ProvisioningParameter,
        ) -> Self {
            let mut v = self.provisioning_parameters.unwrap_or_default();
            v.push(input);
            self.provisioning_parameters = Some(v);
            self
        }
        /// <p>A list of key value pairs that you specify when you provision a product.</p>
        pub fn set_provisioning_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProvisioningParameter>>,
        ) -> Self {
            self.provisioning_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`ServiceCatalogProvisioningUpdateDetails`](crate::model::ServiceCatalogProvisioningUpdateDetails).
        pub fn build(self) -> crate::model::ServiceCatalogProvisioningUpdateDetails {
            crate::model::ServiceCatalogProvisioningUpdateDetails {
                provisioning_artifact_id: self.provisioning_artifact_id,
                provisioning_parameters: self.provisioning_parameters,
            }
        }
    }
}
impl ServiceCatalogProvisioningUpdateDetails {
    /// Creates a new builder-style object to manufacture [`ServiceCatalogProvisioningUpdateDetails`](crate::model::ServiceCatalogProvisioningUpdateDetails).
    pub fn builder() -> crate::model::service_catalog_provisioning_update_details::Builder {
        crate::model::service_catalog_provisioning_update_details::Builder::default()
    }
}

/// <p>A key value pair used when you provision a project as a service catalog product. For information, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProvisioningParameter {
    /// <p>The key that identifies a provisioning parameter.</p>
    #[doc(hidden)]
    pub key: std::option::Option<std::string::String>,
    /// <p>The value of the provisioning parameter.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl ProvisioningParameter {
    /// <p>The key that identifies a provisioning parameter.</p>
    pub fn key(&self) -> std::option::Option<&str> {
        self.key.as_deref()
    }
    /// <p>The value of the provisioning parameter.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`ProvisioningParameter`](crate::model::ProvisioningParameter).
pub mod provisioning_parameter {

    /// A builder for [`ProvisioningParameter`](crate::model::ProvisioningParameter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) key: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The key that identifies a provisioning parameter.</p>
        pub fn key(mut self, input: impl Into<std::string::String>) -> Self {
            self.key = Some(input.into());
            self
        }
        /// <p>The key that identifies a provisioning parameter.</p>
        pub fn set_key(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.key = input;
            self
        }
        /// <p>The value of the provisioning parameter.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The value of the provisioning parameter.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`ProvisioningParameter`](crate::model::ProvisioningParameter).
        pub fn build(self) -> crate::model::ProvisioningParameter {
            crate::model::ProvisioningParameter {
                key: self.key,
                value: self.value,
            }
        }
    }
}
impl ProvisioningParameter {
    /// Creates a new builder-style object to manufacture [`ProvisioningParameter`](crate::model::ProvisioningParameter).
    pub fn builder() -> crate::model::provisioning_parameter::Builder {
        crate::model::provisioning_parameter::Builder::default()
    }
}

/// <p>Configuration that controls the parallelism of the pipeline. By default, the parallelism configuration specified applies to all executions of the pipeline unless overridden.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ParallelismConfiguration {
    /// <p>The max number of steps that can be executed in parallel. </p>
    #[doc(hidden)]
    pub max_parallel_execution_steps: i32,
}
impl ParallelismConfiguration {
    /// <p>The max number of steps that can be executed in parallel. </p>
    pub fn max_parallel_execution_steps(&self) -> i32 {
        self.max_parallel_execution_steps
    }
}
/// See [`ParallelismConfiguration`](crate::model::ParallelismConfiguration).
pub mod parallelism_configuration {

    /// A builder for [`ParallelismConfiguration`](crate::model::ParallelismConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_parallel_execution_steps: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The max number of steps that can be executed in parallel. </p>
        pub fn max_parallel_execution_steps(mut self, input: i32) -> Self {
            self.max_parallel_execution_steps = Some(input);
            self
        }
        /// <p>The max number of steps that can be executed in parallel. </p>
        pub fn set_max_parallel_execution_steps(mut self, input: std::option::Option<i32>) -> Self {
            self.max_parallel_execution_steps = input;
            self
        }
        /// Consumes the builder and constructs a [`ParallelismConfiguration`](crate::model::ParallelismConfiguration).
        pub fn build(self) -> crate::model::ParallelismConfiguration {
            crate::model::ParallelismConfiguration {
                max_parallel_execution_steps: self.max_parallel_execution_steps.unwrap_or_default(),
            }
        }
    }
}
impl ParallelismConfiguration {
    /// Creates a new builder-style object to manufacture [`ParallelismConfiguration`](crate::model::ParallelismConfiguration).
    pub fn builder() -> crate::model::parallelism_configuration::Builder {
        crate::model::parallelism_configuration::Builder::default()
    }
}

/// <p>The location of the pipeline definition stored in Amazon S3.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineDefinitionS3Location {
    /// <p>Name of the S3 bucket.</p>
    #[doc(hidden)]
    pub bucket: std::option::Option<std::string::String>,
    /// <p>The object key (or key name) uniquely identifies the object in an S3 bucket. </p>
    #[doc(hidden)]
    pub object_key: std::option::Option<std::string::String>,
    /// <p>Version Id of the pipeline definition file. If not specified, Amazon SageMaker will retrieve the latest version.</p>
    #[doc(hidden)]
    pub version_id: std::option::Option<std::string::String>,
}
impl PipelineDefinitionS3Location {
    /// <p>Name of the S3 bucket.</p>
    pub fn bucket(&self) -> std::option::Option<&str> {
        self.bucket.as_deref()
    }
    /// <p>The object key (or key name) uniquely identifies the object in an S3 bucket. </p>
    pub fn object_key(&self) -> std::option::Option<&str> {
        self.object_key.as_deref()
    }
    /// <p>Version Id of the pipeline definition file. If not specified, Amazon SageMaker will retrieve the latest version.</p>
    pub fn version_id(&self) -> std::option::Option<&str> {
        self.version_id.as_deref()
    }
}
/// See [`PipelineDefinitionS3Location`](crate::model::PipelineDefinitionS3Location).
pub mod pipeline_definition_s3_location {

    /// A builder for [`PipelineDefinitionS3Location`](crate::model::PipelineDefinitionS3Location).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) bucket: std::option::Option<std::string::String>,
        pub(crate) object_key: std::option::Option<std::string::String>,
        pub(crate) version_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Name of the S3 bucket.</p>
        pub fn bucket(mut self, input: impl Into<std::string::String>) -> Self {
            self.bucket = Some(input.into());
            self
        }
        /// <p>Name of the S3 bucket.</p>
        pub fn set_bucket(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.bucket = input;
            self
        }
        /// <p>The object key (or key name) uniquely identifies the object in an S3 bucket. </p>
        pub fn object_key(mut self, input: impl Into<std::string::String>) -> Self {
            self.object_key = Some(input.into());
            self
        }
        /// <p>The object key (or key name) uniquely identifies the object in an S3 bucket. </p>
        pub fn set_object_key(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.object_key = input;
            self
        }
        /// <p>Version Id of the pipeline definition file. If not specified, Amazon SageMaker will retrieve the latest version.</p>
        pub fn version_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.version_id = Some(input.into());
            self
        }
        /// <p>Version Id of the pipeline definition file. If not specified, Amazon SageMaker will retrieve the latest version.</p>
        pub fn set_version_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.version_id = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineDefinitionS3Location`](crate::model::PipelineDefinitionS3Location).
        pub fn build(self) -> crate::model::PipelineDefinitionS3Location {
            crate::model::PipelineDefinitionS3Location {
                bucket: self.bucket,
                object_key: self.object_key,
                version_id: self.version_id,
            }
        }
    }
}
impl PipelineDefinitionS3Location {
    /// Creates a new builder-style object to manufacture [`PipelineDefinitionS3Location`](crate::model::PipelineDefinitionS3Location).
    pub fn builder() -> crate::model::pipeline_definition_s3_location::Builder {
        crate::model::pipeline_definition_s3_location::Builder::default()
    }
}

/// <p>Contains the notebook instance lifecycle configuration script.</p>
/// <p>Each lifecycle configuration script has a limit of 16384 characters.</p>
/// <p>The value of the <code>$PATH</code> environment variable that is available to both scripts is <code>/sbin:bin:/usr/sbin:/usr/bin</code>.</p>
/// <p>View CloudWatch Logs for notebook instance lifecycle configurations in log group <code>/aws/sagemaker/NotebookInstances</code> in log stream <code>[notebook-instance-name]/[LifecycleConfigHook]</code>.</p>
/// <p>Lifecycle configuration scripts cannot run for longer than 5 minutes. If a script runs for longer than 5 minutes, it fails and the notebook instance is not created or started.</p>
/// <p>For information about notebook instance lifestyle configurations, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html">Step 2.1: (Optional) Customize a Notebook Instance</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NotebookInstanceLifecycleHook {
    /// <p>A base64-encoded string that contains a shell script for a notebook instance lifecycle configuration.</p>
    #[doc(hidden)]
    pub content: std::option::Option<std::string::String>,
}
impl NotebookInstanceLifecycleHook {
    /// <p>A base64-encoded string that contains a shell script for a notebook instance lifecycle configuration.</p>
    pub fn content(&self) -> std::option::Option<&str> {
        self.content.as_deref()
    }
}
/// See [`NotebookInstanceLifecycleHook`](crate::model::NotebookInstanceLifecycleHook).
pub mod notebook_instance_lifecycle_hook {

    /// A builder for [`NotebookInstanceLifecycleHook`](crate::model::NotebookInstanceLifecycleHook).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) content: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A base64-encoded string that contains a shell script for a notebook instance lifecycle configuration.</p>
        pub fn content(mut self, input: impl Into<std::string::String>) -> Self {
            self.content = Some(input.into());
            self
        }
        /// <p>A base64-encoded string that contains a shell script for a notebook instance lifecycle configuration.</p>
        pub fn set_content(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content = input;
            self
        }
        /// Consumes the builder and constructs a [`NotebookInstanceLifecycleHook`](crate::model::NotebookInstanceLifecycleHook).
        pub fn build(self) -> crate::model::NotebookInstanceLifecycleHook {
            crate::model::NotebookInstanceLifecycleHook {
                content: self.content,
            }
        }
    }
}
impl NotebookInstanceLifecycleHook {
    /// Creates a new builder-style object to manufacture [`NotebookInstanceLifecycleHook`](crate::model::NotebookInstanceLifecycleHook).
    pub fn builder() -> crate::model::notebook_instance_lifecycle_hook::Builder {
        crate::model::notebook_instance_lifecycle_hook::Builder::default()
    }
}

/// <p>Information on the IMDS configuration of the notebook instance</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InstanceMetadataServiceConfiguration {
    /// <p>Indicates the minimum IMDS version that the notebook instance supports. When passed as part of <code>CreateNotebookInstance</code>, if no value is selected, then it defaults to IMDSv1. This means that both IMDSv1 and IMDSv2 are supported. If passed as part of <code>UpdateNotebookInstance</code>, there is no default.</p>
    #[doc(hidden)]
    pub minimum_instance_metadata_service_version: std::option::Option<std::string::String>,
}
impl InstanceMetadataServiceConfiguration {
    /// <p>Indicates the minimum IMDS version that the notebook instance supports. When passed as part of <code>CreateNotebookInstance</code>, if no value is selected, then it defaults to IMDSv1. This means that both IMDSv1 and IMDSv2 are supported. If passed as part of <code>UpdateNotebookInstance</code>, there is no default.</p>
    pub fn minimum_instance_metadata_service_version(&self) -> std::option::Option<&str> {
        self.minimum_instance_metadata_service_version.as_deref()
    }
}
/// See [`InstanceMetadataServiceConfiguration`](crate::model::InstanceMetadataServiceConfiguration).
pub mod instance_metadata_service_configuration {

    /// A builder for [`InstanceMetadataServiceConfiguration`](crate::model::InstanceMetadataServiceConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) minimum_instance_metadata_service_version:
            std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Indicates the minimum IMDS version that the notebook instance supports. When passed as part of <code>CreateNotebookInstance</code>, if no value is selected, then it defaults to IMDSv1. This means that both IMDSv1 and IMDSv2 are supported. If passed as part of <code>UpdateNotebookInstance</code>, there is no default.</p>
        pub fn minimum_instance_metadata_service_version(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.minimum_instance_metadata_service_version = Some(input.into());
            self
        }
        /// <p>Indicates the minimum IMDS version that the notebook instance supports. When passed as part of <code>CreateNotebookInstance</code>, if no value is selected, then it defaults to IMDSv1. This means that both IMDSv1 and IMDSv2 are supported. If passed as part of <code>UpdateNotebookInstance</code>, there is no default.</p>
        pub fn set_minimum_instance_metadata_service_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.minimum_instance_metadata_service_version = input;
            self
        }
        /// Consumes the builder and constructs a [`InstanceMetadataServiceConfiguration`](crate::model::InstanceMetadataServiceConfiguration).
        pub fn build(self) -> crate::model::InstanceMetadataServiceConfiguration {
            crate::model::InstanceMetadataServiceConfiguration {
                minimum_instance_metadata_service_version: self
                    .minimum_instance_metadata_service_version,
            }
        }
    }
}
impl InstanceMetadataServiceConfiguration {
    /// Creates a new builder-style object to manufacture [`InstanceMetadataServiceConfiguration`](crate::model::InstanceMetadataServiceConfiguration).
    pub fn builder() -> crate::model::instance_metadata_service_configuration::Builder {
        crate::model::instance_metadata_service_configuration::Builder::default()
    }
}

/// When writing a match expression against `RootAccess`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let rootaccess = unimplemented!();
/// match rootaccess {
///     RootAccess::Disabled => { /* ... */ },
///     RootAccess::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `rootaccess` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RootAccess::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RootAccess::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RootAccess::NewFeature` is defined.
/// Specifically, when `rootaccess` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RootAccess::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RootAccess {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RootAccess {
    fn from(s: &str) -> Self {
        match s {
            "Disabled" => RootAccess::Disabled,
            "Enabled" => RootAccess::Enabled,
            other => RootAccess::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for RootAccess {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RootAccess::from(s))
    }
}
impl RootAccess {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RootAccess::Disabled => "Disabled",
            RootAccess::Enabled => "Enabled",
            RootAccess::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Disabled", "Enabled"]
    }
}
impl AsRef<str> for RootAccess {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `NotebookInstanceAcceleratorType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookinstanceacceleratortype = unimplemented!();
/// match notebookinstanceacceleratortype {
///     NotebookInstanceAcceleratorType::MlEia1Large => { /* ... */ },
///     NotebookInstanceAcceleratorType::MlEia1Medium => { /* ... */ },
///     NotebookInstanceAcceleratorType::MlEia1Xlarge => { /* ... */ },
///     NotebookInstanceAcceleratorType::MlEia2Large => { /* ... */ },
///     NotebookInstanceAcceleratorType::MlEia2Medium => { /* ... */ },
///     NotebookInstanceAcceleratorType::MlEia2Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookinstanceacceleratortype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookInstanceAcceleratorType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookInstanceAcceleratorType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookInstanceAcceleratorType::NewFeature` is defined.
/// Specifically, when `notebookinstanceacceleratortype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookInstanceAcceleratorType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookInstanceAcceleratorType {
    #[allow(missing_docs)] // documentation missing in model
    MlEia1Large,
    #[allow(missing_docs)] // documentation missing in model
    MlEia1Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlEia1Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2Large,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookInstanceAcceleratorType {
    fn from(s: &str) -> Self {
        match s {
            "ml.eia1.large" => NotebookInstanceAcceleratorType::MlEia1Large,
            "ml.eia1.medium" => NotebookInstanceAcceleratorType::MlEia1Medium,
            "ml.eia1.xlarge" => NotebookInstanceAcceleratorType::MlEia1Xlarge,
            "ml.eia2.large" => NotebookInstanceAcceleratorType::MlEia2Large,
            "ml.eia2.medium" => NotebookInstanceAcceleratorType::MlEia2Medium,
            "ml.eia2.xlarge" => NotebookInstanceAcceleratorType::MlEia2Xlarge,
            other => NotebookInstanceAcceleratorType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for NotebookInstanceAcceleratorType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookInstanceAcceleratorType::from(s))
    }
}
impl NotebookInstanceAcceleratorType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookInstanceAcceleratorType::MlEia1Large => "ml.eia1.large",
            NotebookInstanceAcceleratorType::MlEia1Medium => "ml.eia1.medium",
            NotebookInstanceAcceleratorType::MlEia1Xlarge => "ml.eia1.xlarge",
            NotebookInstanceAcceleratorType::MlEia2Large => "ml.eia2.large",
            NotebookInstanceAcceleratorType::MlEia2Medium => "ml.eia2.medium",
            NotebookInstanceAcceleratorType::MlEia2Xlarge => "ml.eia2.xlarge",
            NotebookInstanceAcceleratorType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.eia1.large",
            "ml.eia1.medium",
            "ml.eia1.xlarge",
            "ml.eia2.large",
            "ml.eia2.medium",
            "ml.eia2.xlarge",
        ]
    }
}
impl AsRef<str> for NotebookInstanceAcceleratorType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `InstanceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let instancetype = unimplemented!();
/// match instancetype {
///     InstanceType::MlC42Xlarge => { /* ... */ },
///     InstanceType::MlC44Xlarge => { /* ... */ },
///     InstanceType::MlC48Xlarge => { /* ... */ },
///     InstanceType::MlC4Xlarge => { /* ... */ },
///     InstanceType::MlC518Xlarge => { /* ... */ },
///     InstanceType::MlC52Xlarge => { /* ... */ },
///     InstanceType::MlC54Xlarge => { /* ... */ },
///     InstanceType::MlC59Xlarge => { /* ... */ },
///     InstanceType::MlC5Xlarge => { /* ... */ },
///     InstanceType::MlC5D18Xlarge => { /* ... */ },
///     InstanceType::MlC5D2Xlarge => { /* ... */ },
///     InstanceType::MlC5D4Xlarge => { /* ... */ },
///     InstanceType::MlC5D9Xlarge => { /* ... */ },
///     InstanceType::MlC5DXlarge => { /* ... */ },
///     InstanceType::MlG4Dn12Xlarge => { /* ... */ },
///     InstanceType::MlG4Dn16Xlarge => { /* ... */ },
///     InstanceType::MlG4Dn2Xlarge => { /* ... */ },
///     InstanceType::MlG4Dn4Xlarge => { /* ... */ },
///     InstanceType::MlG4Dn8Xlarge => { /* ... */ },
///     InstanceType::MlG4DnXlarge => { /* ... */ },
///     InstanceType::MlG512Xlarge => { /* ... */ },
///     InstanceType::MlG516Xlarge => { /* ... */ },
///     InstanceType::MlG524Xlarge => { /* ... */ },
///     InstanceType::MlG52Xlarge => { /* ... */ },
///     InstanceType::MlG548Xlarge => { /* ... */ },
///     InstanceType::MlG54Xlarge => { /* ... */ },
///     InstanceType::MlG58Xlarge => { /* ... */ },
///     InstanceType::MlG5Xlarge => { /* ... */ },
///     InstanceType::MlM410Xlarge => { /* ... */ },
///     InstanceType::MlM416Xlarge => { /* ... */ },
///     InstanceType::MlM42Xlarge => { /* ... */ },
///     InstanceType::MlM44Xlarge => { /* ... */ },
///     InstanceType::MlM4Xlarge => { /* ... */ },
///     InstanceType::MlM512Xlarge => { /* ... */ },
///     InstanceType::MlM524Xlarge => { /* ... */ },
///     InstanceType::MlM52Xlarge => { /* ... */ },
///     InstanceType::MlM54Xlarge => { /* ... */ },
///     InstanceType::MlM5Xlarge => { /* ... */ },
///     InstanceType::MlM5D12Xlarge => { /* ... */ },
///     InstanceType::MlM5D16Xlarge => { /* ... */ },
///     InstanceType::MlM5D24Xlarge => { /* ... */ },
///     InstanceType::MlM5D2Xlarge => { /* ... */ },
///     InstanceType::MlM5D4Xlarge => { /* ... */ },
///     InstanceType::MlM5D8Xlarge => { /* ... */ },
///     InstanceType::MlM5DLarge => { /* ... */ },
///     InstanceType::MlM5DXlarge => { /* ... */ },
///     InstanceType::MlP216Xlarge => { /* ... */ },
///     InstanceType::MlP28Xlarge => { /* ... */ },
///     InstanceType::MlP2Xlarge => { /* ... */ },
///     InstanceType::MlP316Xlarge => { /* ... */ },
///     InstanceType::MlP32Xlarge => { /* ... */ },
///     InstanceType::MlP38Xlarge => { /* ... */ },
///     InstanceType::MlP3Dn24Xlarge => { /* ... */ },
///     InstanceType::MlR512Xlarge => { /* ... */ },
///     InstanceType::MlR516Xlarge => { /* ... */ },
///     InstanceType::MlR524Xlarge => { /* ... */ },
///     InstanceType::MlR52Xlarge => { /* ... */ },
///     InstanceType::MlR54Xlarge => { /* ... */ },
///     InstanceType::MlR58Xlarge => { /* ... */ },
///     InstanceType::MlR5Large => { /* ... */ },
///     InstanceType::MlR5Xlarge => { /* ... */ },
///     InstanceType::MlT22Xlarge => { /* ... */ },
///     InstanceType::MlT2Large => { /* ... */ },
///     InstanceType::MlT2Medium => { /* ... */ },
///     InstanceType::MlT2Xlarge => { /* ... */ },
///     InstanceType::MlT32Xlarge => { /* ... */ },
///     InstanceType::MlT3Large => { /* ... */ },
///     InstanceType::MlT3Medium => { /* ... */ },
///     InstanceType::MlT3Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `instancetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `InstanceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `InstanceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `InstanceType::NewFeature` is defined.
/// Specifically, when `instancetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `InstanceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum InstanceType {
    #[allow(missing_docs)] // documentation missing in model
    MlC42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC48Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC518Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC59Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D18Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D9Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5DXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4DnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG548Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM410Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM416Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5DLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5DXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP216Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP28Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP316Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP38Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP3Dn24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT22Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT2Large,
    #[allow(missing_docs)] // documentation missing in model
    MlT2Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlT2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Large,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlT3Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for InstanceType {
    fn from(s: &str) -> Self {
        match s {
            "ml.c4.2xlarge" => InstanceType::MlC42Xlarge,
            "ml.c4.4xlarge" => InstanceType::MlC44Xlarge,
            "ml.c4.8xlarge" => InstanceType::MlC48Xlarge,
            "ml.c4.xlarge" => InstanceType::MlC4Xlarge,
            "ml.c5.18xlarge" => InstanceType::MlC518Xlarge,
            "ml.c5.2xlarge" => InstanceType::MlC52Xlarge,
            "ml.c5.4xlarge" => InstanceType::MlC54Xlarge,
            "ml.c5.9xlarge" => InstanceType::MlC59Xlarge,
            "ml.c5.xlarge" => InstanceType::MlC5Xlarge,
            "ml.c5d.18xlarge" => InstanceType::MlC5D18Xlarge,
            "ml.c5d.2xlarge" => InstanceType::MlC5D2Xlarge,
            "ml.c5d.4xlarge" => InstanceType::MlC5D4Xlarge,
            "ml.c5d.9xlarge" => InstanceType::MlC5D9Xlarge,
            "ml.c5d.xlarge" => InstanceType::MlC5DXlarge,
            "ml.g4dn.12xlarge" => InstanceType::MlG4Dn12Xlarge,
            "ml.g4dn.16xlarge" => InstanceType::MlG4Dn16Xlarge,
            "ml.g4dn.2xlarge" => InstanceType::MlG4Dn2Xlarge,
            "ml.g4dn.4xlarge" => InstanceType::MlG4Dn4Xlarge,
            "ml.g4dn.8xlarge" => InstanceType::MlG4Dn8Xlarge,
            "ml.g4dn.xlarge" => InstanceType::MlG4DnXlarge,
            "ml.g5.12xlarge" => InstanceType::MlG512Xlarge,
            "ml.g5.16xlarge" => InstanceType::MlG516Xlarge,
            "ml.g5.24xlarge" => InstanceType::MlG524Xlarge,
            "ml.g5.2xlarge" => InstanceType::MlG52Xlarge,
            "ml.g5.48xlarge" => InstanceType::MlG548Xlarge,
            "ml.g5.4xlarge" => InstanceType::MlG54Xlarge,
            "ml.g5.8xlarge" => InstanceType::MlG58Xlarge,
            "ml.g5.xlarge" => InstanceType::MlG5Xlarge,
            "ml.m4.10xlarge" => InstanceType::MlM410Xlarge,
            "ml.m4.16xlarge" => InstanceType::MlM416Xlarge,
            "ml.m4.2xlarge" => InstanceType::MlM42Xlarge,
            "ml.m4.4xlarge" => InstanceType::MlM44Xlarge,
            "ml.m4.xlarge" => InstanceType::MlM4Xlarge,
            "ml.m5.12xlarge" => InstanceType::MlM512Xlarge,
            "ml.m5.24xlarge" => InstanceType::MlM524Xlarge,
            "ml.m5.2xlarge" => InstanceType::MlM52Xlarge,
            "ml.m5.4xlarge" => InstanceType::MlM54Xlarge,
            "ml.m5.xlarge" => InstanceType::MlM5Xlarge,
            "ml.m5d.12xlarge" => InstanceType::MlM5D12Xlarge,
            "ml.m5d.16xlarge" => InstanceType::MlM5D16Xlarge,
            "ml.m5d.24xlarge" => InstanceType::MlM5D24Xlarge,
            "ml.m5d.2xlarge" => InstanceType::MlM5D2Xlarge,
            "ml.m5d.4xlarge" => InstanceType::MlM5D4Xlarge,
            "ml.m5d.8xlarge" => InstanceType::MlM5D8Xlarge,
            "ml.m5d.large" => InstanceType::MlM5DLarge,
            "ml.m5d.xlarge" => InstanceType::MlM5DXlarge,
            "ml.p2.16xlarge" => InstanceType::MlP216Xlarge,
            "ml.p2.8xlarge" => InstanceType::MlP28Xlarge,
            "ml.p2.xlarge" => InstanceType::MlP2Xlarge,
            "ml.p3.16xlarge" => InstanceType::MlP316Xlarge,
            "ml.p3.2xlarge" => InstanceType::MlP32Xlarge,
            "ml.p3.8xlarge" => InstanceType::MlP38Xlarge,
            "ml.p3dn.24xlarge" => InstanceType::MlP3Dn24Xlarge,
            "ml.r5.12xlarge" => InstanceType::MlR512Xlarge,
            "ml.r5.16xlarge" => InstanceType::MlR516Xlarge,
            "ml.r5.24xlarge" => InstanceType::MlR524Xlarge,
            "ml.r5.2xlarge" => InstanceType::MlR52Xlarge,
            "ml.r5.4xlarge" => InstanceType::MlR54Xlarge,
            "ml.r5.8xlarge" => InstanceType::MlR58Xlarge,
            "ml.r5.large" => InstanceType::MlR5Large,
            "ml.r5.xlarge" => InstanceType::MlR5Xlarge,
            "ml.t2.2xlarge" => InstanceType::MlT22Xlarge,
            "ml.t2.large" => InstanceType::MlT2Large,
            "ml.t2.medium" => InstanceType::MlT2Medium,
            "ml.t2.xlarge" => InstanceType::MlT2Xlarge,
            "ml.t3.2xlarge" => InstanceType::MlT32Xlarge,
            "ml.t3.large" => InstanceType::MlT3Large,
            "ml.t3.medium" => InstanceType::MlT3Medium,
            "ml.t3.xlarge" => InstanceType::MlT3Xlarge,
            other => InstanceType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for InstanceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(InstanceType::from(s))
    }
}
impl InstanceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            InstanceType::MlC42Xlarge => "ml.c4.2xlarge",
            InstanceType::MlC44Xlarge => "ml.c4.4xlarge",
            InstanceType::MlC48Xlarge => "ml.c4.8xlarge",
            InstanceType::MlC4Xlarge => "ml.c4.xlarge",
            InstanceType::MlC518Xlarge => "ml.c5.18xlarge",
            InstanceType::MlC52Xlarge => "ml.c5.2xlarge",
            InstanceType::MlC54Xlarge => "ml.c5.4xlarge",
            InstanceType::MlC59Xlarge => "ml.c5.9xlarge",
            InstanceType::MlC5Xlarge => "ml.c5.xlarge",
            InstanceType::MlC5D18Xlarge => "ml.c5d.18xlarge",
            InstanceType::MlC5D2Xlarge => "ml.c5d.2xlarge",
            InstanceType::MlC5D4Xlarge => "ml.c5d.4xlarge",
            InstanceType::MlC5D9Xlarge => "ml.c5d.9xlarge",
            InstanceType::MlC5DXlarge => "ml.c5d.xlarge",
            InstanceType::MlG4Dn12Xlarge => "ml.g4dn.12xlarge",
            InstanceType::MlG4Dn16Xlarge => "ml.g4dn.16xlarge",
            InstanceType::MlG4Dn2Xlarge => "ml.g4dn.2xlarge",
            InstanceType::MlG4Dn4Xlarge => "ml.g4dn.4xlarge",
            InstanceType::MlG4Dn8Xlarge => "ml.g4dn.8xlarge",
            InstanceType::MlG4DnXlarge => "ml.g4dn.xlarge",
            InstanceType::MlG512Xlarge => "ml.g5.12xlarge",
            InstanceType::MlG516Xlarge => "ml.g5.16xlarge",
            InstanceType::MlG524Xlarge => "ml.g5.24xlarge",
            InstanceType::MlG52Xlarge => "ml.g5.2xlarge",
            InstanceType::MlG548Xlarge => "ml.g5.48xlarge",
            InstanceType::MlG54Xlarge => "ml.g5.4xlarge",
            InstanceType::MlG58Xlarge => "ml.g5.8xlarge",
            InstanceType::MlG5Xlarge => "ml.g5.xlarge",
            InstanceType::MlM410Xlarge => "ml.m4.10xlarge",
            InstanceType::MlM416Xlarge => "ml.m4.16xlarge",
            InstanceType::MlM42Xlarge => "ml.m4.2xlarge",
            InstanceType::MlM44Xlarge => "ml.m4.4xlarge",
            InstanceType::MlM4Xlarge => "ml.m4.xlarge",
            InstanceType::MlM512Xlarge => "ml.m5.12xlarge",
            InstanceType::MlM524Xlarge => "ml.m5.24xlarge",
            InstanceType::MlM52Xlarge => "ml.m5.2xlarge",
            InstanceType::MlM54Xlarge => "ml.m5.4xlarge",
            InstanceType::MlM5Xlarge => "ml.m5.xlarge",
            InstanceType::MlM5D12Xlarge => "ml.m5d.12xlarge",
            InstanceType::MlM5D16Xlarge => "ml.m5d.16xlarge",
            InstanceType::MlM5D24Xlarge => "ml.m5d.24xlarge",
            InstanceType::MlM5D2Xlarge => "ml.m5d.2xlarge",
            InstanceType::MlM5D4Xlarge => "ml.m5d.4xlarge",
            InstanceType::MlM5D8Xlarge => "ml.m5d.8xlarge",
            InstanceType::MlM5DLarge => "ml.m5d.large",
            InstanceType::MlM5DXlarge => "ml.m5d.xlarge",
            InstanceType::MlP216Xlarge => "ml.p2.16xlarge",
            InstanceType::MlP28Xlarge => "ml.p2.8xlarge",
            InstanceType::MlP2Xlarge => "ml.p2.xlarge",
            InstanceType::MlP316Xlarge => "ml.p3.16xlarge",
            InstanceType::MlP32Xlarge => "ml.p3.2xlarge",
            InstanceType::MlP38Xlarge => "ml.p3.8xlarge",
            InstanceType::MlP3Dn24Xlarge => "ml.p3dn.24xlarge",
            InstanceType::MlR512Xlarge => "ml.r5.12xlarge",
            InstanceType::MlR516Xlarge => "ml.r5.16xlarge",
            InstanceType::MlR524Xlarge => "ml.r5.24xlarge",
            InstanceType::MlR52Xlarge => "ml.r5.2xlarge",
            InstanceType::MlR54Xlarge => "ml.r5.4xlarge",
            InstanceType::MlR58Xlarge => "ml.r5.8xlarge",
            InstanceType::MlR5Large => "ml.r5.large",
            InstanceType::MlR5Xlarge => "ml.r5.xlarge",
            InstanceType::MlT22Xlarge => "ml.t2.2xlarge",
            InstanceType::MlT2Large => "ml.t2.large",
            InstanceType::MlT2Medium => "ml.t2.medium",
            InstanceType::MlT2Xlarge => "ml.t2.xlarge",
            InstanceType::MlT32Xlarge => "ml.t3.2xlarge",
            InstanceType::MlT3Large => "ml.t3.large",
            InstanceType::MlT3Medium => "ml.t3.medium",
            InstanceType::MlT3Xlarge => "ml.t3.xlarge",
            InstanceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.c4.2xlarge",
            "ml.c4.4xlarge",
            "ml.c4.8xlarge",
            "ml.c4.xlarge",
            "ml.c5.18xlarge",
            "ml.c5.2xlarge",
            "ml.c5.4xlarge",
            "ml.c5.9xlarge",
            "ml.c5.xlarge",
            "ml.c5d.18xlarge",
            "ml.c5d.2xlarge",
            "ml.c5d.4xlarge",
            "ml.c5d.9xlarge",
            "ml.c5d.xlarge",
            "ml.g4dn.12xlarge",
            "ml.g4dn.16xlarge",
            "ml.g4dn.2xlarge",
            "ml.g4dn.4xlarge",
            "ml.g4dn.8xlarge",
            "ml.g4dn.xlarge",
            "ml.g5.12xlarge",
            "ml.g5.16xlarge",
            "ml.g5.24xlarge",
            "ml.g5.2xlarge",
            "ml.g5.48xlarge",
            "ml.g5.4xlarge",
            "ml.g5.8xlarge",
            "ml.g5.xlarge",
            "ml.m4.10xlarge",
            "ml.m4.16xlarge",
            "ml.m4.2xlarge",
            "ml.m4.4xlarge",
            "ml.m4.xlarge",
            "ml.m5.12xlarge",
            "ml.m5.24xlarge",
            "ml.m5.2xlarge",
            "ml.m5.4xlarge",
            "ml.m5.xlarge",
            "ml.m5d.12xlarge",
            "ml.m5d.16xlarge",
            "ml.m5d.24xlarge",
            "ml.m5d.2xlarge",
            "ml.m5d.4xlarge",
            "ml.m5d.8xlarge",
            "ml.m5d.large",
            "ml.m5d.xlarge",
            "ml.p2.16xlarge",
            "ml.p2.8xlarge",
            "ml.p2.xlarge",
            "ml.p3.16xlarge",
            "ml.p3.2xlarge",
            "ml.p3.8xlarge",
            "ml.p3dn.24xlarge",
            "ml.r5.12xlarge",
            "ml.r5.16xlarge",
            "ml.r5.24xlarge",
            "ml.r5.2xlarge",
            "ml.r5.4xlarge",
            "ml.r5.8xlarge",
            "ml.r5.large",
            "ml.r5.xlarge",
            "ml.t2.2xlarge",
            "ml.t2.large",
            "ml.t2.medium",
            "ml.t2.xlarge",
            "ml.t3.2xlarge",
            "ml.t3.large",
            "ml.t3.medium",
            "ml.t3.xlarge",
        ]
    }
}
impl AsRef<str> for InstanceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configures the monitoring schedule and defines the monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringScheduleConfig {
    /// <p>Configures the monitoring schedule.</p>
    #[doc(hidden)]
    pub schedule_config: std::option::Option<crate::model::ScheduleConfig>,
    /// <p>Defines the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_job_definition: std::option::Option<crate::model::MonitoringJobDefinition>,
    /// <p>The name of the monitoring job definition to schedule.</p>
    #[doc(hidden)]
    pub monitoring_job_definition_name: std::option::Option<std::string::String>,
    /// <p>The type of the monitoring job definition to schedule.</p>
    #[doc(hidden)]
    pub monitoring_type: std::option::Option<crate::model::MonitoringType>,
}
impl MonitoringScheduleConfig {
    /// <p>Configures the monitoring schedule.</p>
    pub fn schedule_config(&self) -> std::option::Option<&crate::model::ScheduleConfig> {
        self.schedule_config.as_ref()
    }
    /// <p>Defines the monitoring job.</p>
    pub fn monitoring_job_definition(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringJobDefinition> {
        self.monitoring_job_definition.as_ref()
    }
    /// <p>The name of the monitoring job definition to schedule.</p>
    pub fn monitoring_job_definition_name(&self) -> std::option::Option<&str> {
        self.monitoring_job_definition_name.as_deref()
    }
    /// <p>The type of the monitoring job definition to schedule.</p>
    pub fn monitoring_type(&self) -> std::option::Option<&crate::model::MonitoringType> {
        self.monitoring_type.as_ref()
    }
}
/// See [`MonitoringScheduleConfig`](crate::model::MonitoringScheduleConfig).
pub mod monitoring_schedule_config {

    /// A builder for [`MonitoringScheduleConfig`](crate::model::MonitoringScheduleConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) schedule_config: std::option::Option<crate::model::ScheduleConfig>,
        pub(crate) monitoring_job_definition:
            std::option::Option<crate::model::MonitoringJobDefinition>,
        pub(crate) monitoring_job_definition_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_type: std::option::Option<crate::model::MonitoringType>,
    }
    impl Builder {
        /// <p>Configures the monitoring schedule.</p>
        pub fn schedule_config(mut self, input: crate::model::ScheduleConfig) -> Self {
            self.schedule_config = Some(input);
            self
        }
        /// <p>Configures the monitoring schedule.</p>
        pub fn set_schedule_config(
            mut self,
            input: std::option::Option<crate::model::ScheduleConfig>,
        ) -> Self {
            self.schedule_config = input;
            self
        }
        /// <p>Defines the monitoring job.</p>
        pub fn monitoring_job_definition(
            mut self,
            input: crate::model::MonitoringJobDefinition,
        ) -> Self {
            self.monitoring_job_definition = Some(input);
            self
        }
        /// <p>Defines the monitoring job.</p>
        pub fn set_monitoring_job_definition(
            mut self,
            input: std::option::Option<crate::model::MonitoringJobDefinition>,
        ) -> Self {
            self.monitoring_job_definition = input;
            self
        }
        /// <p>The name of the monitoring job definition to schedule.</p>
        pub fn monitoring_job_definition_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring job definition to schedule.</p>
        pub fn set_monitoring_job_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = input;
            self
        }
        /// <p>The type of the monitoring job definition to schedule.</p>
        pub fn monitoring_type(mut self, input: crate::model::MonitoringType) -> Self {
            self.monitoring_type = Some(input);
            self
        }
        /// <p>The type of the monitoring job definition to schedule.</p>
        pub fn set_monitoring_type(
            mut self,
            input: std::option::Option<crate::model::MonitoringType>,
        ) -> Self {
            self.monitoring_type = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringScheduleConfig`](crate::model::MonitoringScheduleConfig).
        pub fn build(self) -> crate::model::MonitoringScheduleConfig {
            crate::model::MonitoringScheduleConfig {
                schedule_config: self.schedule_config,
                monitoring_job_definition: self.monitoring_job_definition,
                monitoring_job_definition_name: self.monitoring_job_definition_name,
                monitoring_type: self.monitoring_type,
            }
        }
    }
}
impl MonitoringScheduleConfig {
    /// Creates a new builder-style object to manufacture [`MonitoringScheduleConfig`](crate::model::MonitoringScheduleConfig).
    pub fn builder() -> crate::model::monitoring_schedule_config::Builder {
        crate::model::monitoring_schedule_config::Builder::default()
    }
}

/// When writing a match expression against `MonitoringType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringtype = unimplemented!();
/// match monitoringtype {
///     MonitoringType::DataQuality => { /* ... */ },
///     MonitoringType::ModelBias => { /* ... */ },
///     MonitoringType::ModelExplainability => { /* ... */ },
///     MonitoringType::ModelQuality => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringType::NewFeature` is defined.
/// Specifically, when `monitoringtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringType {
    #[allow(missing_docs)] // documentation missing in model
    DataQuality,
    #[allow(missing_docs)] // documentation missing in model
    ModelBias,
    #[allow(missing_docs)] // documentation missing in model
    ModelExplainability,
    #[allow(missing_docs)] // documentation missing in model
    ModelQuality,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringType {
    fn from(s: &str) -> Self {
        match s {
            "DataQuality" => MonitoringType::DataQuality,
            "ModelBias" => MonitoringType::ModelBias,
            "ModelExplainability" => MonitoringType::ModelExplainability,
            "ModelQuality" => MonitoringType::ModelQuality,
            other => MonitoringType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for MonitoringType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringType::from(s))
    }
}
impl MonitoringType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringType::DataQuality => "DataQuality",
            MonitoringType::ModelBias => "ModelBias",
            MonitoringType::ModelExplainability => "ModelExplainability",
            MonitoringType::ModelQuality => "ModelQuality",
            MonitoringType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "DataQuality",
            "ModelBias",
            "ModelExplainability",
            "ModelQuality",
        ]
    }
}
impl AsRef<str> for MonitoringType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Defines the monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringJobDefinition {
    /// <p>Baseline configuration used to validate that the data conforms to the specified constraints and statistics</p>
    #[doc(hidden)]
    pub baseline_config: std::option::Option<crate::model::MonitoringBaselineConfig>,
    /// <p>The array of inputs for the monitoring job. Currently we support monitoring an Amazon SageMaker Endpoint.</p>
    #[doc(hidden)]
    pub monitoring_inputs: std::option::Option<std::vec::Vec<crate::model::MonitoringInput>>,
    /// <p>The array of outputs from the monitoring job to be uploaded to Amazon Simple Storage Service (Amazon S3).</p>
    #[doc(hidden)]
    pub monitoring_output_config: std::option::Option<crate::model::MonitoringOutputConfig>,
    /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a monitoring job. In distributed processing, you specify more than one instance.</p>
    #[doc(hidden)]
    pub monitoring_resources: std::option::Option<crate::model::MonitoringResources>,
    /// <p>Configures the monitoring job to run a specified Docker container image.</p>
    #[doc(hidden)]
    pub monitoring_app_specification: std::option::Option<crate::model::MonitoringAppSpecification>,
    /// <p>Specifies a time limit for how long the monitoring job is allowed to run.</p>
    #[doc(hidden)]
    pub stopping_condition: std::option::Option<crate::model::MonitoringStoppingCondition>,
    /// <p>Sets the environment variables in the Docker container.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Specifies networking options for an monitoring job.</p>
    #[doc(hidden)]
    pub network_config: std::option::Option<crate::model::NetworkConfig>,
    /// <p>The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
}
impl MonitoringJobDefinition {
    /// <p>Baseline configuration used to validate that the data conforms to the specified constraints and statistics</p>
    pub fn baseline_config(&self) -> std::option::Option<&crate::model::MonitoringBaselineConfig> {
        self.baseline_config.as_ref()
    }
    /// <p>The array of inputs for the monitoring job. Currently we support monitoring an Amazon SageMaker Endpoint.</p>
    pub fn monitoring_inputs(&self) -> std::option::Option<&[crate::model::MonitoringInput]> {
        self.monitoring_inputs.as_deref()
    }
    /// <p>The array of outputs from the monitoring job to be uploaded to Amazon Simple Storage Service (Amazon S3).</p>
    pub fn monitoring_output_config(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringOutputConfig> {
        self.monitoring_output_config.as_ref()
    }
    /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a monitoring job. In distributed processing, you specify more than one instance.</p>
    pub fn monitoring_resources(&self) -> std::option::Option<&crate::model::MonitoringResources> {
        self.monitoring_resources.as_ref()
    }
    /// <p>Configures the monitoring job to run a specified Docker container image.</p>
    pub fn monitoring_app_specification(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringAppSpecification> {
        self.monitoring_app_specification.as_ref()
    }
    /// <p>Specifies a time limit for how long the monitoring job is allowed to run.</p>
    pub fn stopping_condition(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringStoppingCondition> {
        self.stopping_condition.as_ref()
    }
    /// <p>Sets the environment variables in the Docker container.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>Specifies networking options for an monitoring job.</p>
    pub fn network_config(&self) -> std::option::Option<&crate::model::NetworkConfig> {
        self.network_config.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
}
/// See [`MonitoringJobDefinition`](crate::model::MonitoringJobDefinition).
pub mod monitoring_job_definition {

    /// A builder for [`MonitoringJobDefinition`](crate::model::MonitoringJobDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) baseline_config: std::option::Option<crate::model::MonitoringBaselineConfig>,
        pub(crate) monitoring_inputs:
            std::option::Option<std::vec::Vec<crate::model::MonitoringInput>>,
        pub(crate) monitoring_output_config:
            std::option::Option<crate::model::MonitoringOutputConfig>,
        pub(crate) monitoring_resources: std::option::Option<crate::model::MonitoringResources>,
        pub(crate) monitoring_app_specification:
            std::option::Option<crate::model::MonitoringAppSpecification>,
        pub(crate) stopping_condition:
            std::option::Option<crate::model::MonitoringStoppingCondition>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) network_config: std::option::Option<crate::model::NetworkConfig>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Baseline configuration used to validate that the data conforms to the specified constraints and statistics</p>
        pub fn baseline_config(mut self, input: crate::model::MonitoringBaselineConfig) -> Self {
            self.baseline_config = Some(input);
            self
        }
        /// <p>Baseline configuration used to validate that the data conforms to the specified constraints and statistics</p>
        pub fn set_baseline_config(
            mut self,
            input: std::option::Option<crate::model::MonitoringBaselineConfig>,
        ) -> Self {
            self.baseline_config = input;
            self
        }
        /// Appends an item to `monitoring_inputs`.
        ///
        /// To override the contents of this collection use [`set_monitoring_inputs`](Self::set_monitoring_inputs).
        ///
        /// <p>The array of inputs for the monitoring job. Currently we support monitoring an Amazon SageMaker Endpoint.</p>
        pub fn monitoring_inputs(mut self, input: crate::model::MonitoringInput) -> Self {
            let mut v = self.monitoring_inputs.unwrap_or_default();
            v.push(input);
            self.monitoring_inputs = Some(v);
            self
        }
        /// <p>The array of inputs for the monitoring job. Currently we support monitoring an Amazon SageMaker Endpoint.</p>
        pub fn set_monitoring_inputs(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MonitoringInput>>,
        ) -> Self {
            self.monitoring_inputs = input;
            self
        }
        /// <p>The array of outputs from the monitoring job to be uploaded to Amazon Simple Storage Service (Amazon S3).</p>
        pub fn monitoring_output_config(
            mut self,
            input: crate::model::MonitoringOutputConfig,
        ) -> Self {
            self.monitoring_output_config = Some(input);
            self
        }
        /// <p>The array of outputs from the monitoring job to be uploaded to Amazon Simple Storage Service (Amazon S3).</p>
        pub fn set_monitoring_output_config(
            mut self,
            input: std::option::Option<crate::model::MonitoringOutputConfig>,
        ) -> Self {
            self.monitoring_output_config = input;
            self
        }
        /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a monitoring job. In distributed processing, you specify more than one instance.</p>
        pub fn monitoring_resources(mut self, input: crate::model::MonitoringResources) -> Self {
            self.monitoring_resources = Some(input);
            self
        }
        /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a monitoring job. In distributed processing, you specify more than one instance.</p>
        pub fn set_monitoring_resources(
            mut self,
            input: std::option::Option<crate::model::MonitoringResources>,
        ) -> Self {
            self.monitoring_resources = input;
            self
        }
        /// <p>Configures the monitoring job to run a specified Docker container image.</p>
        pub fn monitoring_app_specification(
            mut self,
            input: crate::model::MonitoringAppSpecification,
        ) -> Self {
            self.monitoring_app_specification = Some(input);
            self
        }
        /// <p>Configures the monitoring job to run a specified Docker container image.</p>
        pub fn set_monitoring_app_specification(
            mut self,
            input: std::option::Option<crate::model::MonitoringAppSpecification>,
        ) -> Self {
            self.monitoring_app_specification = input;
            self
        }
        /// <p>Specifies a time limit for how long the monitoring job is allowed to run.</p>
        pub fn stopping_condition(
            mut self,
            input: crate::model::MonitoringStoppingCondition,
        ) -> Self {
            self.stopping_condition = Some(input);
            self
        }
        /// <p>Specifies a time limit for how long the monitoring job is allowed to run.</p>
        pub fn set_stopping_condition(
            mut self,
            input: std::option::Option<crate::model::MonitoringStoppingCondition>,
        ) -> Self {
            self.stopping_condition = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>Specifies networking options for an monitoring job.</p>
        pub fn network_config(mut self, input: crate::model::NetworkConfig) -> Self {
            self.network_config = Some(input);
            self
        }
        /// <p>Specifies networking options for an monitoring job.</p>
        pub fn set_network_config(
            mut self,
            input: std::option::Option<crate::model::NetworkConfig>,
        ) -> Self {
            self.network_config = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringJobDefinition`](crate::model::MonitoringJobDefinition).
        pub fn build(self) -> crate::model::MonitoringJobDefinition {
            crate::model::MonitoringJobDefinition {
                baseline_config: self.baseline_config,
                monitoring_inputs: self.monitoring_inputs,
                monitoring_output_config: self.monitoring_output_config,
                monitoring_resources: self.monitoring_resources,
                monitoring_app_specification: self.monitoring_app_specification,
                stopping_condition: self.stopping_condition,
                environment: self.environment,
                network_config: self.network_config,
                role_arn: self.role_arn,
            }
        }
    }
}
impl MonitoringJobDefinition {
    /// Creates a new builder-style object to manufacture [`MonitoringJobDefinition`](crate::model::MonitoringJobDefinition).
    pub fn builder() -> crate::model::monitoring_job_definition::Builder {
        crate::model::monitoring_job_definition::Builder::default()
    }
}

/// <p>Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NetworkConfig {
    /// <p>Whether to encrypt all communications between distributed processing jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.</p>
    #[doc(hidden)]
    pub enable_inter_container_traffic_encryption: bool,
    /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the processing job.</p>
    #[doc(hidden)]
    pub enable_network_isolation: bool,
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
}
impl NetworkConfig {
    /// <p>Whether to encrypt all communications between distributed processing jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.</p>
    pub fn enable_inter_container_traffic_encryption(&self) -> bool {
        self.enable_inter_container_traffic_encryption
    }
    /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the processing job.</p>
    pub fn enable_network_isolation(&self) -> bool {
        self.enable_network_isolation
    }
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
}
/// See [`NetworkConfig`](crate::model::NetworkConfig).
pub mod network_config {

    /// A builder for [`NetworkConfig`](crate::model::NetworkConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) enable_inter_container_traffic_encryption: std::option::Option<bool>,
        pub(crate) enable_network_isolation: std::option::Option<bool>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
    }
    impl Builder {
        /// <p>Whether to encrypt all communications between distributed processing jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.</p>
        pub fn enable_inter_container_traffic_encryption(mut self, input: bool) -> Self {
            self.enable_inter_container_traffic_encryption = Some(input);
            self
        }
        /// <p>Whether to encrypt all communications between distributed processing jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.</p>
        pub fn set_enable_inter_container_traffic_encryption(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_inter_container_traffic_encryption = input;
            self
        }
        /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the processing job.</p>
        pub fn enable_network_isolation(mut self, input: bool) -> Self {
            self.enable_network_isolation = Some(input);
            self
        }
        /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the processing job.</p>
        pub fn set_enable_network_isolation(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_network_isolation = input;
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// Consumes the builder and constructs a [`NetworkConfig`](crate::model::NetworkConfig).
        pub fn build(self) -> crate::model::NetworkConfig {
            crate::model::NetworkConfig {
                enable_inter_container_traffic_encryption: self
                    .enable_inter_container_traffic_encryption
                    .unwrap_or_default(),
                enable_network_isolation: self.enable_network_isolation.unwrap_or_default(),
                vpc_config: self.vpc_config,
            }
        }
    }
}
impl NetworkConfig {
    /// Creates a new builder-style object to manufacture [`NetworkConfig`](crate::model::NetworkConfig).
    pub fn builder() -> crate::model::network_config::Builder {
        crate::model::network_config::Builder::default()
    }
}

/// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct VpcConfig {
    /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html">Supported Instance Types and Availability Zones</a>.</p>
    #[doc(hidden)]
    pub subnets: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl VpcConfig {
    /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
    /// <p>The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html">Supported Instance Types and Availability Zones</a>.</p>
    pub fn subnets(&self) -> std::option::Option<&[std::string::String]> {
        self.subnets.as_deref()
    }
}
/// See [`VpcConfig`](crate::model::VpcConfig).
pub mod vpc_config {

    /// A builder for [`VpcConfig`](crate::model::VpcConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) subnets: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// Appends an item to `subnets`.
        ///
        /// To override the contents of this collection use [`set_subnets`](Self::set_subnets).
        ///
        /// <p>The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html">Supported Instance Types and Availability Zones</a>.</p>
        pub fn subnets(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.subnets.unwrap_or_default();
            v.push(input.into());
            self.subnets = Some(v);
            self
        }
        /// <p>The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html">Supported Instance Types and Availability Zones</a>.</p>
        pub fn set_subnets(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.subnets = input;
            self
        }
        /// Consumes the builder and constructs a [`VpcConfig`](crate::model::VpcConfig).
        pub fn build(self) -> crate::model::VpcConfig {
            crate::model::VpcConfig {
                security_group_ids: self.security_group_ids,
                subnets: self.subnets,
            }
        }
    }
}
impl VpcConfig {
    /// Creates a new builder-style object to manufacture [`VpcConfig`](crate::model::VpcConfig).
    pub fn builder() -> crate::model::vpc_config::Builder {
        crate::model::vpc_config::Builder::default()
    }
}

/// <p>A time limit for how long the monitoring job is allowed to run before stopping.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringStoppingCondition {
    /// <p>The maximum runtime allowed in seconds.</p> <note>
    /// <p>The <code>MaxRuntimeInSeconds</code> cannot exceed the frequency of the job. For data quality and model explainability, this can be up to 3600 seconds for an hourly schedule. For model bias and model quality hourly schedules, this can be up to 1800 seconds.</p>
    /// </note>
    #[doc(hidden)]
    pub max_runtime_in_seconds: i32,
}
impl MonitoringStoppingCondition {
    /// <p>The maximum runtime allowed in seconds.</p> <note>
    /// <p>The <code>MaxRuntimeInSeconds</code> cannot exceed the frequency of the job. For data quality and model explainability, this can be up to 3600 seconds for an hourly schedule. For model bias and model quality hourly schedules, this can be up to 1800 seconds.</p>
    /// </note>
    pub fn max_runtime_in_seconds(&self) -> i32 {
        self.max_runtime_in_seconds
    }
}
/// See [`MonitoringStoppingCondition`](crate::model::MonitoringStoppingCondition).
pub mod monitoring_stopping_condition {

    /// A builder for [`MonitoringStoppingCondition`](crate::model::MonitoringStoppingCondition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_runtime_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The maximum runtime allowed in seconds.</p> <note>
        /// <p>The <code>MaxRuntimeInSeconds</code> cannot exceed the frequency of the job. For data quality and model explainability, this can be up to 3600 seconds for an hourly schedule. For model bias and model quality hourly schedules, this can be up to 1800 seconds.</p>
        /// </note>
        pub fn max_runtime_in_seconds(mut self, input: i32) -> Self {
            self.max_runtime_in_seconds = Some(input);
            self
        }
        /// <p>The maximum runtime allowed in seconds.</p> <note>
        /// <p>The <code>MaxRuntimeInSeconds</code> cannot exceed the frequency of the job. For data quality and model explainability, this can be up to 3600 seconds for an hourly schedule. For model bias and model quality hourly schedules, this can be up to 1800 seconds.</p>
        /// </note>
        pub fn set_max_runtime_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.max_runtime_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringStoppingCondition`](crate::model::MonitoringStoppingCondition).
        pub fn build(self) -> crate::model::MonitoringStoppingCondition {
            crate::model::MonitoringStoppingCondition {
                max_runtime_in_seconds: self.max_runtime_in_seconds.unwrap_or_default(),
            }
        }
    }
}
impl MonitoringStoppingCondition {
    /// Creates a new builder-style object to manufacture [`MonitoringStoppingCondition`](crate::model::MonitoringStoppingCondition).
    pub fn builder() -> crate::model::monitoring_stopping_condition::Builder {
        crate::model::monitoring_stopping_condition::Builder::default()
    }
}

/// <p>Container image configuration object for the monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringAppSpecification {
    /// <p>The container image to be run by the monitoring job.</p>
    #[doc(hidden)]
    pub image_uri: std::option::Option<std::string::String>,
    /// <p>Specifies the entrypoint for a container used to run the monitoring job.</p>
    #[doc(hidden)]
    pub container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>An array of arguments for the container used to run the monitoring job.</p>
    #[doc(hidden)]
    pub container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
    #[doc(hidden)]
    pub record_preprocessor_source_uri: std::option::Option<std::string::String>,
    /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
    #[doc(hidden)]
    pub post_analytics_processor_source_uri: std::option::Option<std::string::String>,
}
impl MonitoringAppSpecification {
    /// <p>The container image to be run by the monitoring job.</p>
    pub fn image_uri(&self) -> std::option::Option<&str> {
        self.image_uri.as_deref()
    }
    /// <p>Specifies the entrypoint for a container used to run the monitoring job.</p>
    pub fn container_entrypoint(&self) -> std::option::Option<&[std::string::String]> {
        self.container_entrypoint.as_deref()
    }
    /// <p>An array of arguments for the container used to run the monitoring job.</p>
    pub fn container_arguments(&self) -> std::option::Option<&[std::string::String]> {
        self.container_arguments.as_deref()
    }
    /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
    pub fn record_preprocessor_source_uri(&self) -> std::option::Option<&str> {
        self.record_preprocessor_source_uri.as_deref()
    }
    /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
    pub fn post_analytics_processor_source_uri(&self) -> std::option::Option<&str> {
        self.post_analytics_processor_source_uri.as_deref()
    }
}
/// See [`MonitoringAppSpecification`](crate::model::MonitoringAppSpecification).
pub mod monitoring_app_specification {

    /// A builder for [`MonitoringAppSpecification`](crate::model::MonitoringAppSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_uri: std::option::Option<std::string::String>,
        pub(crate) container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) record_preprocessor_source_uri: std::option::Option<std::string::String>,
        pub(crate) post_analytics_processor_source_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The container image to be run by the monitoring job.</p>
        pub fn image_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_uri = Some(input.into());
            self
        }
        /// <p>The container image to be run by the monitoring job.</p>
        pub fn set_image_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_uri = input;
            self
        }
        /// Appends an item to `container_entrypoint`.
        ///
        /// To override the contents of this collection use [`set_container_entrypoint`](Self::set_container_entrypoint).
        ///
        /// <p>Specifies the entrypoint for a container used to run the monitoring job.</p>
        pub fn container_entrypoint(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_entrypoint.unwrap_or_default();
            v.push(input.into());
            self.container_entrypoint = Some(v);
            self
        }
        /// <p>Specifies the entrypoint for a container used to run the monitoring job.</p>
        pub fn set_container_entrypoint(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_entrypoint = input;
            self
        }
        /// Appends an item to `container_arguments`.
        ///
        /// To override the contents of this collection use [`set_container_arguments`](Self::set_container_arguments).
        ///
        /// <p>An array of arguments for the container used to run the monitoring job.</p>
        pub fn container_arguments(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_arguments.unwrap_or_default();
            v.push(input.into());
            self.container_arguments = Some(v);
            self
        }
        /// <p>An array of arguments for the container used to run the monitoring job.</p>
        pub fn set_container_arguments(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_arguments = input;
            self
        }
        /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
        pub fn record_preprocessor_source_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.record_preprocessor_source_uri = Some(input.into());
            self
        }
        /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
        pub fn set_record_preprocessor_source_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.record_preprocessor_source_uri = input;
            self
        }
        /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
        pub fn post_analytics_processor_source_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.post_analytics_processor_source_uri = Some(input.into());
            self
        }
        /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
        pub fn set_post_analytics_processor_source_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.post_analytics_processor_source_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringAppSpecification`](crate::model::MonitoringAppSpecification).
        pub fn build(self) -> crate::model::MonitoringAppSpecification {
            crate::model::MonitoringAppSpecification {
                image_uri: self.image_uri,
                container_entrypoint: self.container_entrypoint,
                container_arguments: self.container_arguments,
                record_preprocessor_source_uri: self.record_preprocessor_source_uri,
                post_analytics_processor_source_uri: self.post_analytics_processor_source_uri,
            }
        }
    }
}
impl MonitoringAppSpecification {
    /// Creates a new builder-style object to manufacture [`MonitoringAppSpecification`](crate::model::MonitoringAppSpecification).
    pub fn builder() -> crate::model::monitoring_app_specification::Builder {
        crate::model::monitoring_app_specification::Builder::default()
    }
}

/// <p>Identifies the resources to deploy for a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringResources {
    /// <p>The configuration for the cluster resources used to run the processing job.</p>
    #[doc(hidden)]
    pub cluster_config: std::option::Option<crate::model::MonitoringClusterConfig>,
}
impl MonitoringResources {
    /// <p>The configuration for the cluster resources used to run the processing job.</p>
    pub fn cluster_config(&self) -> std::option::Option<&crate::model::MonitoringClusterConfig> {
        self.cluster_config.as_ref()
    }
}
/// See [`MonitoringResources`](crate::model::MonitoringResources).
pub mod monitoring_resources {

    /// A builder for [`MonitoringResources`](crate::model::MonitoringResources).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cluster_config: std::option::Option<crate::model::MonitoringClusterConfig>,
    }
    impl Builder {
        /// <p>The configuration for the cluster resources used to run the processing job.</p>
        pub fn cluster_config(mut self, input: crate::model::MonitoringClusterConfig) -> Self {
            self.cluster_config = Some(input);
            self
        }
        /// <p>The configuration for the cluster resources used to run the processing job.</p>
        pub fn set_cluster_config(
            mut self,
            input: std::option::Option<crate::model::MonitoringClusterConfig>,
        ) -> Self {
            self.cluster_config = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringResources`](crate::model::MonitoringResources).
        pub fn build(self) -> crate::model::MonitoringResources {
            crate::model::MonitoringResources {
                cluster_config: self.cluster_config,
            }
        }
    }
}
impl MonitoringResources {
    /// Creates a new builder-style object to manufacture [`MonitoringResources`](crate::model::MonitoringResources).
    pub fn builder() -> crate::model::monitoring_resources::Builder {
        crate::model::monitoring_resources::Builder::default()
    }
}

/// <p>Configuration for the cluster used to run model monitoring jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringClusterConfig {
    /// <p>The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
    #[doc(hidden)]
    pub instance_count: std::option::Option<i32>,
    /// <p>The ML compute instance type for the processing job.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
    /// <p>The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario.</p>
    #[doc(hidden)]
    pub volume_size_in_gb: std::option::Option<i32>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.</p>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
}
impl MonitoringClusterConfig {
    /// <p>The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
    pub fn instance_count(&self) -> std::option::Option<i32> {
        self.instance_count
    }
    /// <p>The ML compute instance type for the processing job.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::ProcessingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario.</p>
    pub fn volume_size_in_gb(&self) -> std::option::Option<i32> {
        self.volume_size_in_gb
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.</p>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
}
/// See [`MonitoringClusterConfig`](crate::model::MonitoringClusterConfig).
pub mod monitoring_cluster_config {

    /// A builder for [`MonitoringClusterConfig`](crate::model::MonitoringClusterConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>The ML compute instance type for the processing job.</p>
        pub fn instance_type(mut self, input: crate::model::ProcessingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The ML compute instance type for the processing job.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario.</p>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario.</p>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.</p>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.</p>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringClusterConfig`](crate::model::MonitoringClusterConfig).
        pub fn build(self) -> crate::model::MonitoringClusterConfig {
            crate::model::MonitoringClusterConfig {
                instance_count: self.instance_count,
                instance_type: self.instance_type,
                volume_size_in_gb: self.volume_size_in_gb,
                volume_kms_key_id: self.volume_kms_key_id,
            }
        }
    }
}
impl MonitoringClusterConfig {
    /// Creates a new builder-style object to manufacture [`MonitoringClusterConfig`](crate::model::MonitoringClusterConfig).
    pub fn builder() -> crate::model::monitoring_cluster_config::Builder {
        crate::model::monitoring_cluster_config::Builder::default()
    }
}

/// <p>The output configuration for monitoring jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringOutputConfig {
    /// <p>Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded.</p>
    #[doc(hidden)]
    pub monitoring_outputs: std::option::Option<std::vec::Vec<crate::model::MonitoringOutput>>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl MonitoringOutputConfig {
    /// <p>Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded.</p>
    pub fn monitoring_outputs(&self) -> std::option::Option<&[crate::model::MonitoringOutput]> {
        self.monitoring_outputs.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`MonitoringOutputConfig`](crate::model::MonitoringOutputConfig).
pub mod monitoring_output_config {

    /// A builder for [`MonitoringOutputConfig`](crate::model::MonitoringOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_outputs:
            std::option::Option<std::vec::Vec<crate::model::MonitoringOutput>>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// Appends an item to `monitoring_outputs`.
        ///
        /// To override the contents of this collection use [`set_monitoring_outputs`](Self::set_monitoring_outputs).
        ///
        /// <p>Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded.</p>
        pub fn monitoring_outputs(mut self, input: crate::model::MonitoringOutput) -> Self {
            let mut v = self.monitoring_outputs.unwrap_or_default();
            v.push(input);
            self.monitoring_outputs = Some(v);
            self
        }
        /// <p>Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded.</p>
        pub fn set_monitoring_outputs(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MonitoringOutput>>,
        ) -> Self {
            self.monitoring_outputs = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringOutputConfig`](crate::model::MonitoringOutputConfig).
        pub fn build(self) -> crate::model::MonitoringOutputConfig {
            crate::model::MonitoringOutputConfig {
                monitoring_outputs: self.monitoring_outputs,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl MonitoringOutputConfig {
    /// Creates a new builder-style object to manufacture [`MonitoringOutputConfig`](crate::model::MonitoringOutputConfig).
    pub fn builder() -> crate::model::monitoring_output_config::Builder {
        crate::model::monitoring_output_config::Builder::default()
    }
}

/// <p>The output object for a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringOutput {
    /// <p>The Amazon S3 storage location where the results of a monitoring job are saved.</p>
    #[doc(hidden)]
    pub s3_output: std::option::Option<crate::model::MonitoringS3Output>,
}
impl MonitoringOutput {
    /// <p>The Amazon S3 storage location where the results of a monitoring job are saved.</p>
    pub fn s3_output(&self) -> std::option::Option<&crate::model::MonitoringS3Output> {
        self.s3_output.as_ref()
    }
}
/// See [`MonitoringOutput`](crate::model::MonitoringOutput).
pub mod monitoring_output {

    /// A builder for [`MonitoringOutput`](crate::model::MonitoringOutput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output: std::option::Option<crate::model::MonitoringS3Output>,
    }
    impl Builder {
        /// <p>The Amazon S3 storage location where the results of a monitoring job are saved.</p>
        pub fn s3_output(mut self, input: crate::model::MonitoringS3Output) -> Self {
            self.s3_output = Some(input);
            self
        }
        /// <p>The Amazon S3 storage location where the results of a monitoring job are saved.</p>
        pub fn set_s3_output(
            mut self,
            input: std::option::Option<crate::model::MonitoringS3Output>,
        ) -> Self {
            self.s3_output = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringOutput`](crate::model::MonitoringOutput).
        pub fn build(self) -> crate::model::MonitoringOutput {
            crate::model::MonitoringOutput {
                s3_output: self.s3_output,
            }
        }
    }
}
impl MonitoringOutput {
    /// Creates a new builder-style object to manufacture [`MonitoringOutput`](crate::model::MonitoringOutput).
    pub fn builder() -> crate::model::monitoring_output::Builder {
        crate::model::monitoring_output::Builder::default()
    }
}

/// <p>Information about where and how you want to store the results of a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringS3Output {
    /// <p>A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Whether to upload the results of the monitoring job continuously or after the job completes.</p>
    #[doc(hidden)]
    pub s3_upload_mode: std::option::Option<crate::model::ProcessingS3UploadMode>,
}
impl MonitoringS3Output {
    /// <p>A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Whether to upload the results of the monitoring job continuously or after the job completes.</p>
    pub fn s3_upload_mode(&self) -> std::option::Option<&crate::model::ProcessingS3UploadMode> {
        self.s3_upload_mode.as_ref()
    }
}
/// See [`MonitoringS3Output`](crate::model::MonitoringS3Output).
pub mod monitoring_s3_output {

    /// A builder for [`MonitoringS3Output`](crate::model::MonitoringS3Output).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_upload_mode: std::option::Option<crate::model::ProcessingS3UploadMode>,
    }
    impl Builder {
        /// <p>A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Whether to upload the results of the monitoring job continuously or after the job completes.</p>
        pub fn s3_upload_mode(mut self, input: crate::model::ProcessingS3UploadMode) -> Self {
            self.s3_upload_mode = Some(input);
            self
        }
        /// <p>Whether to upload the results of the monitoring job continuously or after the job completes.</p>
        pub fn set_s3_upload_mode(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3UploadMode>,
        ) -> Self {
            self.s3_upload_mode = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringS3Output`](crate::model::MonitoringS3Output).
        pub fn build(self) -> crate::model::MonitoringS3Output {
            crate::model::MonitoringS3Output {
                s3_uri: self.s3_uri,
                local_path: self.local_path,
                s3_upload_mode: self.s3_upload_mode,
            }
        }
    }
}
impl MonitoringS3Output {
    /// Creates a new builder-style object to manufacture [`MonitoringS3Output`](crate::model::MonitoringS3Output).
    pub fn builder() -> crate::model::monitoring_s3_output::Builder {
        crate::model::monitoring_s3_output::Builder::default()
    }
}

/// When writing a match expression against `ProcessingS3UploadMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processings3uploadmode = unimplemented!();
/// match processings3uploadmode {
///     ProcessingS3UploadMode::Continuous => { /* ... */ },
///     ProcessingS3UploadMode::EndOfJob => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processings3uploadmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingS3UploadMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingS3UploadMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingS3UploadMode::NewFeature` is defined.
/// Specifically, when `processings3uploadmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingS3UploadMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingS3UploadMode {
    #[allow(missing_docs)] // documentation missing in model
    Continuous,
    #[allow(missing_docs)] // documentation missing in model
    EndOfJob,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingS3UploadMode {
    fn from(s: &str) -> Self {
        match s {
            "Continuous" => ProcessingS3UploadMode::Continuous,
            "EndOfJob" => ProcessingS3UploadMode::EndOfJob,
            other => {
                ProcessingS3UploadMode::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ProcessingS3UploadMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingS3UploadMode::from(s))
    }
}
impl ProcessingS3UploadMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingS3UploadMode::Continuous => "Continuous",
            ProcessingS3UploadMode::EndOfJob => "EndOfJob",
            ProcessingS3UploadMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Continuous", "EndOfJob"]
    }
}
impl AsRef<str> for ProcessingS3UploadMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The inputs for a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringInput {
    /// <p>The endpoint for a monitoring job.</p>
    #[doc(hidden)]
    pub endpoint_input: std::option::Option<crate::model::EndpointInput>,
    /// <p>Input object for the batch transform job.</p>
    #[doc(hidden)]
    pub batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
}
impl MonitoringInput {
    /// <p>The endpoint for a monitoring job.</p>
    pub fn endpoint_input(&self) -> std::option::Option<&crate::model::EndpointInput> {
        self.endpoint_input.as_ref()
    }
    /// <p>Input object for the batch transform job.</p>
    pub fn batch_transform_input(&self) -> std::option::Option<&crate::model::BatchTransformInput> {
        self.batch_transform_input.as_ref()
    }
}
/// See [`MonitoringInput`](crate::model::MonitoringInput).
pub mod monitoring_input {

    /// A builder for [`MonitoringInput`](crate::model::MonitoringInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_input: std::option::Option<crate::model::EndpointInput>,
        pub(crate) batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
    }
    impl Builder {
        /// <p>The endpoint for a monitoring job.</p>
        pub fn endpoint_input(mut self, input: crate::model::EndpointInput) -> Self {
            self.endpoint_input = Some(input);
            self
        }
        /// <p>The endpoint for a monitoring job.</p>
        pub fn set_endpoint_input(
            mut self,
            input: std::option::Option<crate::model::EndpointInput>,
        ) -> Self {
            self.endpoint_input = input;
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn batch_transform_input(mut self, input: crate::model::BatchTransformInput) -> Self {
            self.batch_transform_input = Some(input);
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn set_batch_transform_input(
            mut self,
            input: std::option::Option<crate::model::BatchTransformInput>,
        ) -> Self {
            self.batch_transform_input = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringInput`](crate::model::MonitoringInput).
        pub fn build(self) -> crate::model::MonitoringInput {
            crate::model::MonitoringInput {
                endpoint_input: self.endpoint_input,
                batch_transform_input: self.batch_transform_input,
            }
        }
    }
}
impl MonitoringInput {
    /// Creates a new builder-style object to manufacture [`MonitoringInput`](crate::model::MonitoringInput).
    pub fn builder() -> crate::model::monitoring_input::Builder {
        crate::model::monitoring_input::Builder::default()
    }
}

/// <p>Input object for the batch transform job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct BatchTransformInput {
    /// <p>The Amazon S3 location being used to capture the data.</p>
    #[doc(hidden)]
    pub data_captured_destination_s3_uri: std::option::Option<std::string::String>,
    /// <p>The dataset format for your batch transform job.</p>
    #[doc(hidden)]
    pub dataset_format: std::option::Option<crate::model::MonitoringDatasetFormat>,
    /// <p>Path to the filesystem where the batch transform data is available to the container.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
    #[doc(hidden)]
    pub s3_input_mode: std::option::Option<crate::model::ProcessingS3InputMode>,
    /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
    #[doc(hidden)]
    pub s3_data_distribution_type:
        std::option::Option<crate::model::ProcessingS3DataDistributionType>,
    /// <p>The attributes of the input data that are the input features.</p>
    #[doc(hidden)]
    pub features_attribute: std::option::Option<std::string::String>,
    /// <p>The attribute of the input data that represents the ground truth label.</p>
    #[doc(hidden)]
    pub inference_attribute: std::option::Option<std::string::String>,
    /// <p>In a classification problem, the attribute that represents the class probability.</p>
    #[doc(hidden)]
    pub probability_attribute: std::option::Option<std::string::String>,
    /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
    #[doc(hidden)]
    pub probability_threshold_attribute: std::option::Option<f64>,
    /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    #[doc(hidden)]
    pub start_time_offset: std::option::Option<std::string::String>,
    /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    #[doc(hidden)]
    pub end_time_offset: std::option::Option<std::string::String>,
}
impl BatchTransformInput {
    /// <p>The Amazon S3 location being used to capture the data.</p>
    pub fn data_captured_destination_s3_uri(&self) -> std::option::Option<&str> {
        self.data_captured_destination_s3_uri.as_deref()
    }
    /// <p>The dataset format for your batch transform job.</p>
    pub fn dataset_format(&self) -> std::option::Option<&crate::model::MonitoringDatasetFormat> {
        self.dataset_format.as_ref()
    }
    /// <p>Path to the filesystem where the batch transform data is available to the container.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
    pub fn s3_input_mode(&self) -> std::option::Option<&crate::model::ProcessingS3InputMode> {
        self.s3_input_mode.as_ref()
    }
    /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
    pub fn s3_data_distribution_type(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingS3DataDistributionType> {
        self.s3_data_distribution_type.as_ref()
    }
    /// <p>The attributes of the input data that are the input features.</p>
    pub fn features_attribute(&self) -> std::option::Option<&str> {
        self.features_attribute.as_deref()
    }
    /// <p>The attribute of the input data that represents the ground truth label.</p>
    pub fn inference_attribute(&self) -> std::option::Option<&str> {
        self.inference_attribute.as_deref()
    }
    /// <p>In a classification problem, the attribute that represents the class probability.</p>
    pub fn probability_attribute(&self) -> std::option::Option<&str> {
        self.probability_attribute.as_deref()
    }
    /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
    pub fn probability_threshold_attribute(&self) -> std::option::Option<f64> {
        self.probability_threshold_attribute
    }
    /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    pub fn start_time_offset(&self) -> std::option::Option<&str> {
        self.start_time_offset.as_deref()
    }
    /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    pub fn end_time_offset(&self) -> std::option::Option<&str> {
        self.end_time_offset.as_deref()
    }
}
/// See [`BatchTransformInput`](crate::model::BatchTransformInput).
pub mod batch_transform_input {

    /// A builder for [`BatchTransformInput`](crate::model::BatchTransformInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) data_captured_destination_s3_uri: std::option::Option<std::string::String>,
        pub(crate) dataset_format: std::option::Option<crate::model::MonitoringDatasetFormat>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_input_mode: std::option::Option<crate::model::ProcessingS3InputMode>,
        pub(crate) s3_data_distribution_type:
            std::option::Option<crate::model::ProcessingS3DataDistributionType>,
        pub(crate) features_attribute: std::option::Option<std::string::String>,
        pub(crate) inference_attribute: std::option::Option<std::string::String>,
        pub(crate) probability_attribute: std::option::Option<std::string::String>,
        pub(crate) probability_threshold_attribute: std::option::Option<f64>,
        pub(crate) start_time_offset: std::option::Option<std::string::String>,
        pub(crate) end_time_offset: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 location being used to capture the data.</p>
        pub fn data_captured_destination_s3_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.data_captured_destination_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location being used to capture the data.</p>
        pub fn set_data_captured_destination_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.data_captured_destination_s3_uri = input;
            self
        }
        /// <p>The dataset format for your batch transform job.</p>
        pub fn dataset_format(mut self, input: crate::model::MonitoringDatasetFormat) -> Self {
            self.dataset_format = Some(input);
            self
        }
        /// <p>The dataset format for your batch transform job.</p>
        pub fn set_dataset_format(
            mut self,
            input: std::option::Option<crate::model::MonitoringDatasetFormat>,
        ) -> Self {
            self.dataset_format = input;
            self
        }
        /// <p>Path to the filesystem where the batch transform data is available to the container.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>Path to the filesystem where the batch transform data is available to the container.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
        pub fn s3_input_mode(mut self, input: crate::model::ProcessingS3InputMode) -> Self {
            self.s3_input_mode = Some(input);
            self
        }
        /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
        pub fn set_s3_input_mode(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3InputMode>,
        ) -> Self {
            self.s3_input_mode = input;
            self
        }
        /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
        pub fn s3_data_distribution_type(
            mut self,
            input: crate::model::ProcessingS3DataDistributionType,
        ) -> Self {
            self.s3_data_distribution_type = Some(input);
            self
        }
        /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
        pub fn set_s3_data_distribution_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3DataDistributionType>,
        ) -> Self {
            self.s3_data_distribution_type = input;
            self
        }
        /// <p>The attributes of the input data that are the input features.</p>
        pub fn features_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.features_attribute = Some(input.into());
            self
        }
        /// <p>The attributes of the input data that are the input features.</p>
        pub fn set_features_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.features_attribute = input;
            self
        }
        /// <p>The attribute of the input data that represents the ground truth label.</p>
        pub fn inference_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.inference_attribute = Some(input.into());
            self
        }
        /// <p>The attribute of the input data that represents the ground truth label.</p>
        pub fn set_inference_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.inference_attribute = input;
            self
        }
        /// <p>In a classification problem, the attribute that represents the class probability.</p>
        pub fn probability_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.probability_attribute = Some(input.into());
            self
        }
        /// <p>In a classification problem, the attribute that represents the class probability.</p>
        pub fn set_probability_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.probability_attribute = input;
            self
        }
        /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
        pub fn probability_threshold_attribute(mut self, input: f64) -> Self {
            self.probability_threshold_attribute = Some(input);
            self
        }
        /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
        pub fn set_probability_threshold_attribute(
            mut self,
            input: std::option::Option<f64>,
        ) -> Self {
            self.probability_threshold_attribute = input;
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn start_time_offset(mut self, input: impl Into<std::string::String>) -> Self {
            self.start_time_offset = Some(input.into());
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn set_start_time_offset(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.start_time_offset = input;
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn end_time_offset(mut self, input: impl Into<std::string::String>) -> Self {
            self.end_time_offset = Some(input.into());
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn set_end_time_offset(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.end_time_offset = input;
            self
        }
        /// Consumes the builder and constructs a [`BatchTransformInput`](crate::model::BatchTransformInput).
        pub fn build(self) -> crate::model::BatchTransformInput {
            crate::model::BatchTransformInput {
                data_captured_destination_s3_uri: self.data_captured_destination_s3_uri,
                dataset_format: self.dataset_format,
                local_path: self.local_path,
                s3_input_mode: self.s3_input_mode,
                s3_data_distribution_type: self.s3_data_distribution_type,
                features_attribute: self.features_attribute,
                inference_attribute: self.inference_attribute,
                probability_attribute: self.probability_attribute,
                probability_threshold_attribute: self.probability_threshold_attribute,
                start_time_offset: self.start_time_offset,
                end_time_offset: self.end_time_offset,
            }
        }
    }
}
impl BatchTransformInput {
    /// Creates a new builder-style object to manufacture [`BatchTransformInput`](crate::model::BatchTransformInput).
    pub fn builder() -> crate::model::batch_transform_input::Builder {
        crate::model::batch_transform_input::Builder::default()
    }
}

/// When writing a match expression against `ProcessingS3DataDistributionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processings3datadistributiontype = unimplemented!();
/// match processings3datadistributiontype {
///     ProcessingS3DataDistributionType::Fullyreplicated => { /* ... */ },
///     ProcessingS3DataDistributionType::Shardedbys3Key => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processings3datadistributiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingS3DataDistributionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingS3DataDistributionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingS3DataDistributionType::NewFeature` is defined.
/// Specifically, when `processings3datadistributiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingS3DataDistributionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingS3DataDistributionType {
    #[allow(missing_docs)] // documentation missing in model
    Fullyreplicated,
    #[allow(missing_docs)] // documentation missing in model
    Shardedbys3Key,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingS3DataDistributionType {
    fn from(s: &str) -> Self {
        match s {
            "FullyReplicated" => ProcessingS3DataDistributionType::Fullyreplicated,
            "ShardedByS3Key" => ProcessingS3DataDistributionType::Shardedbys3Key,
            other => ProcessingS3DataDistributionType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ProcessingS3DataDistributionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingS3DataDistributionType::from(s))
    }
}
impl ProcessingS3DataDistributionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingS3DataDistributionType::Fullyreplicated => "FullyReplicated",
            ProcessingS3DataDistributionType::Shardedbys3Key => "ShardedByS3Key",
            ProcessingS3DataDistributionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["FullyReplicated", "ShardedByS3Key"]
    }
}
impl AsRef<str> for ProcessingS3DataDistributionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ProcessingS3InputMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processings3inputmode = unimplemented!();
/// match processings3inputmode {
///     ProcessingS3InputMode::File => { /* ... */ },
///     ProcessingS3InputMode::Pipe => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processings3inputmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingS3InputMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingS3InputMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingS3InputMode::NewFeature` is defined.
/// Specifically, when `processings3inputmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingS3InputMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingS3InputMode {
    #[allow(missing_docs)] // documentation missing in model
    File,
    #[allow(missing_docs)] // documentation missing in model
    Pipe,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingS3InputMode {
    fn from(s: &str) -> Self {
        match s {
            "File" => ProcessingS3InputMode::File,
            "Pipe" => ProcessingS3InputMode::Pipe,
            other => {
                ProcessingS3InputMode::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ProcessingS3InputMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingS3InputMode::from(s))
    }
}
impl ProcessingS3InputMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingS3InputMode::File => "File",
            ProcessingS3InputMode::Pipe => "Pipe",
            ProcessingS3InputMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["File", "Pipe"]
    }
}
impl AsRef<str> for ProcessingS3InputMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Represents the dataset format used when running a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringDatasetFormat {
    /// <p>The CSV dataset used in the monitoring job.</p>
    #[doc(hidden)]
    pub csv: std::option::Option<crate::model::MonitoringCsvDatasetFormat>,
    /// <p>The JSON dataset used in the monitoring job</p>
    #[doc(hidden)]
    pub json: std::option::Option<crate::model::MonitoringJsonDatasetFormat>,
    /// <p>The Parquet dataset used in the monitoring job</p>
    #[doc(hidden)]
    pub parquet: std::option::Option<crate::model::MonitoringParquetDatasetFormat>,
}
impl MonitoringDatasetFormat {
    /// <p>The CSV dataset used in the monitoring job.</p>
    pub fn csv(&self) -> std::option::Option<&crate::model::MonitoringCsvDatasetFormat> {
        self.csv.as_ref()
    }
    /// <p>The JSON dataset used in the monitoring job</p>
    pub fn json(&self) -> std::option::Option<&crate::model::MonitoringJsonDatasetFormat> {
        self.json.as_ref()
    }
    /// <p>The Parquet dataset used in the monitoring job</p>
    pub fn parquet(&self) -> std::option::Option<&crate::model::MonitoringParquetDatasetFormat> {
        self.parquet.as_ref()
    }
}
/// See [`MonitoringDatasetFormat`](crate::model::MonitoringDatasetFormat).
pub mod monitoring_dataset_format {

    /// A builder for [`MonitoringDatasetFormat`](crate::model::MonitoringDatasetFormat).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) csv: std::option::Option<crate::model::MonitoringCsvDatasetFormat>,
        pub(crate) json: std::option::Option<crate::model::MonitoringJsonDatasetFormat>,
        pub(crate) parquet: std::option::Option<crate::model::MonitoringParquetDatasetFormat>,
    }
    impl Builder {
        /// <p>The CSV dataset used in the monitoring job.</p>
        pub fn csv(mut self, input: crate::model::MonitoringCsvDatasetFormat) -> Self {
            self.csv = Some(input);
            self
        }
        /// <p>The CSV dataset used in the monitoring job.</p>
        pub fn set_csv(
            mut self,
            input: std::option::Option<crate::model::MonitoringCsvDatasetFormat>,
        ) -> Self {
            self.csv = input;
            self
        }
        /// <p>The JSON dataset used in the monitoring job</p>
        pub fn json(mut self, input: crate::model::MonitoringJsonDatasetFormat) -> Self {
            self.json = Some(input);
            self
        }
        /// <p>The JSON dataset used in the monitoring job</p>
        pub fn set_json(
            mut self,
            input: std::option::Option<crate::model::MonitoringJsonDatasetFormat>,
        ) -> Self {
            self.json = input;
            self
        }
        /// <p>The Parquet dataset used in the monitoring job</p>
        pub fn parquet(mut self, input: crate::model::MonitoringParquetDatasetFormat) -> Self {
            self.parquet = Some(input);
            self
        }
        /// <p>The Parquet dataset used in the monitoring job</p>
        pub fn set_parquet(
            mut self,
            input: std::option::Option<crate::model::MonitoringParquetDatasetFormat>,
        ) -> Self {
            self.parquet = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringDatasetFormat`](crate::model::MonitoringDatasetFormat).
        pub fn build(self) -> crate::model::MonitoringDatasetFormat {
            crate::model::MonitoringDatasetFormat {
                csv: self.csv,
                json: self.json,
                parquet: self.parquet,
            }
        }
    }
}
impl MonitoringDatasetFormat {
    /// Creates a new builder-style object to manufacture [`MonitoringDatasetFormat`](crate::model::MonitoringDatasetFormat).
    pub fn builder() -> crate::model::monitoring_dataset_format::Builder {
        crate::model::monitoring_dataset_format::Builder::default()
    }
}

/// <p>Represents the Parquet dataset format used when running a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringParquetDatasetFormat {}
/// See [`MonitoringParquetDatasetFormat`](crate::model::MonitoringParquetDatasetFormat).
pub mod monitoring_parquet_dataset_format {

    /// A builder for [`MonitoringParquetDatasetFormat`](crate::model::MonitoringParquetDatasetFormat).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {}
    impl Builder {
        /// Consumes the builder and constructs a [`MonitoringParquetDatasetFormat`](crate::model::MonitoringParquetDatasetFormat).
        pub fn build(self) -> crate::model::MonitoringParquetDatasetFormat {
            crate::model::MonitoringParquetDatasetFormat {}
        }
    }
}
impl MonitoringParquetDatasetFormat {
    /// Creates a new builder-style object to manufacture [`MonitoringParquetDatasetFormat`](crate::model::MonitoringParquetDatasetFormat).
    pub fn builder() -> crate::model::monitoring_parquet_dataset_format::Builder {
        crate::model::monitoring_parquet_dataset_format::Builder::default()
    }
}

/// <p>Represents the JSON dataset format used when running a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringJsonDatasetFormat {
    /// <p>Indicates if the file should be read as a json object per line. </p>
    #[doc(hidden)]
    pub line: bool,
}
impl MonitoringJsonDatasetFormat {
    /// <p>Indicates if the file should be read as a json object per line. </p>
    pub fn line(&self) -> bool {
        self.line
    }
}
/// See [`MonitoringJsonDatasetFormat`](crate::model::MonitoringJsonDatasetFormat).
pub mod monitoring_json_dataset_format {

    /// A builder for [`MonitoringJsonDatasetFormat`](crate::model::MonitoringJsonDatasetFormat).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) line: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>Indicates if the file should be read as a json object per line. </p>
        pub fn line(mut self, input: bool) -> Self {
            self.line = Some(input);
            self
        }
        /// <p>Indicates if the file should be read as a json object per line. </p>
        pub fn set_line(mut self, input: std::option::Option<bool>) -> Self {
            self.line = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringJsonDatasetFormat`](crate::model::MonitoringJsonDatasetFormat).
        pub fn build(self) -> crate::model::MonitoringJsonDatasetFormat {
            crate::model::MonitoringJsonDatasetFormat {
                line: self.line.unwrap_or_default(),
            }
        }
    }
}
impl MonitoringJsonDatasetFormat {
    /// Creates a new builder-style object to manufacture [`MonitoringJsonDatasetFormat`](crate::model::MonitoringJsonDatasetFormat).
    pub fn builder() -> crate::model::monitoring_json_dataset_format::Builder {
        crate::model::monitoring_json_dataset_format::Builder::default()
    }
}

/// <p>Represents the CSV dataset format used when running a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringCsvDatasetFormat {
    /// <p>Indicates if the CSV data has a header.</p>
    #[doc(hidden)]
    pub header: bool,
}
impl MonitoringCsvDatasetFormat {
    /// <p>Indicates if the CSV data has a header.</p>
    pub fn header(&self) -> bool {
        self.header
    }
}
/// See [`MonitoringCsvDatasetFormat`](crate::model::MonitoringCsvDatasetFormat).
pub mod monitoring_csv_dataset_format {

    /// A builder for [`MonitoringCsvDatasetFormat`](crate::model::MonitoringCsvDatasetFormat).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) header: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>Indicates if the CSV data has a header.</p>
        pub fn header(mut self, input: bool) -> Self {
            self.header = Some(input);
            self
        }
        /// <p>Indicates if the CSV data has a header.</p>
        pub fn set_header(mut self, input: std::option::Option<bool>) -> Self {
            self.header = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringCsvDatasetFormat`](crate::model::MonitoringCsvDatasetFormat).
        pub fn build(self) -> crate::model::MonitoringCsvDatasetFormat {
            crate::model::MonitoringCsvDatasetFormat {
                header: self.header.unwrap_or_default(),
            }
        }
    }
}
impl MonitoringCsvDatasetFormat {
    /// Creates a new builder-style object to manufacture [`MonitoringCsvDatasetFormat`](crate::model::MonitoringCsvDatasetFormat).
    pub fn builder() -> crate::model::monitoring_csv_dataset_format::Builder {
        crate::model::monitoring_csv_dataset_format::Builder::default()
    }
}

/// <p>Input object for the endpoint</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointInput {
    /// <p>An endpoint in customer's account which has enabled <code>DataCaptureConfig</code> enabled.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>Path to the filesystem where the endpoint data is available to the container.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
    #[doc(hidden)]
    pub s3_input_mode: std::option::Option<crate::model::ProcessingS3InputMode>,
    /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
    #[doc(hidden)]
    pub s3_data_distribution_type:
        std::option::Option<crate::model::ProcessingS3DataDistributionType>,
    /// <p>The attributes of the input data that are the input features.</p>
    #[doc(hidden)]
    pub features_attribute: std::option::Option<std::string::String>,
    /// <p>The attribute of the input data that represents the ground truth label.</p>
    #[doc(hidden)]
    pub inference_attribute: std::option::Option<std::string::String>,
    /// <p>In a classification problem, the attribute that represents the class probability.</p>
    #[doc(hidden)]
    pub probability_attribute: std::option::Option<std::string::String>,
    /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
    #[doc(hidden)]
    pub probability_threshold_attribute: std::option::Option<f64>,
    /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    #[doc(hidden)]
    pub start_time_offset: std::option::Option<std::string::String>,
    /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    #[doc(hidden)]
    pub end_time_offset: std::option::Option<std::string::String>,
}
impl EndpointInput {
    /// <p>An endpoint in customer's account which has enabled <code>DataCaptureConfig</code> enabled.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>Path to the filesystem where the endpoint data is available to the container.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
    pub fn s3_input_mode(&self) -> std::option::Option<&crate::model::ProcessingS3InputMode> {
        self.s3_input_mode.as_ref()
    }
    /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
    pub fn s3_data_distribution_type(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingS3DataDistributionType> {
        self.s3_data_distribution_type.as_ref()
    }
    /// <p>The attributes of the input data that are the input features.</p>
    pub fn features_attribute(&self) -> std::option::Option<&str> {
        self.features_attribute.as_deref()
    }
    /// <p>The attribute of the input data that represents the ground truth label.</p>
    pub fn inference_attribute(&self) -> std::option::Option<&str> {
        self.inference_attribute.as_deref()
    }
    /// <p>In a classification problem, the attribute that represents the class probability.</p>
    pub fn probability_attribute(&self) -> std::option::Option<&str> {
        self.probability_attribute.as_deref()
    }
    /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
    pub fn probability_threshold_attribute(&self) -> std::option::Option<f64> {
        self.probability_threshold_attribute
    }
    /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    pub fn start_time_offset(&self) -> std::option::Option<&str> {
        self.start_time_offset.as_deref()
    }
    /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
    pub fn end_time_offset(&self) -> std::option::Option<&str> {
        self.end_time_offset.as_deref()
    }
}
/// See [`EndpointInput`](crate::model::EndpointInput).
pub mod endpoint_input {

    /// A builder for [`EndpointInput`](crate::model::EndpointInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_input_mode: std::option::Option<crate::model::ProcessingS3InputMode>,
        pub(crate) s3_data_distribution_type:
            std::option::Option<crate::model::ProcessingS3DataDistributionType>,
        pub(crate) features_attribute: std::option::Option<std::string::String>,
        pub(crate) inference_attribute: std::option::Option<std::string::String>,
        pub(crate) probability_attribute: std::option::Option<std::string::String>,
        pub(crate) probability_threshold_attribute: std::option::Option<f64>,
        pub(crate) start_time_offset: std::option::Option<std::string::String>,
        pub(crate) end_time_offset: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>An endpoint in customer's account which has enabled <code>DataCaptureConfig</code> enabled.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>An endpoint in customer's account which has enabled <code>DataCaptureConfig</code> enabled.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>Path to the filesystem where the endpoint data is available to the container.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>Path to the filesystem where the endpoint data is available to the container.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
        pub fn s3_input_mode(mut self, input: crate::model::ProcessingS3InputMode) -> Self {
            self.s3_input_mode = Some(input);
            self
        }
        /// <p>Whether the <code>Pipe</code> or <code>File</code> is used as the input mode for transferring data for the monitoring job. <code>Pipe</code> mode is recommended for large datasets. <code>File</code> mode is useful for small files that fit in memory. Defaults to <code>File</code>.</p>
        pub fn set_s3_input_mode(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3InputMode>,
        ) -> Self {
            self.s3_input_mode = input;
            self
        }
        /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
        pub fn s3_data_distribution_type(
            mut self,
            input: crate::model::ProcessingS3DataDistributionType,
        ) -> Self {
            self.s3_data_distribution_type = Some(input);
            self
        }
        /// <p>Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to <code>FullyReplicated</code> </p>
        pub fn set_s3_data_distribution_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3DataDistributionType>,
        ) -> Self {
            self.s3_data_distribution_type = input;
            self
        }
        /// <p>The attributes of the input data that are the input features.</p>
        pub fn features_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.features_attribute = Some(input.into());
            self
        }
        /// <p>The attributes of the input data that are the input features.</p>
        pub fn set_features_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.features_attribute = input;
            self
        }
        /// <p>The attribute of the input data that represents the ground truth label.</p>
        pub fn inference_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.inference_attribute = Some(input.into());
            self
        }
        /// <p>The attribute of the input data that represents the ground truth label.</p>
        pub fn set_inference_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.inference_attribute = input;
            self
        }
        /// <p>In a classification problem, the attribute that represents the class probability.</p>
        pub fn probability_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.probability_attribute = Some(input.into());
            self
        }
        /// <p>In a classification problem, the attribute that represents the class probability.</p>
        pub fn set_probability_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.probability_attribute = input;
            self
        }
        /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
        pub fn probability_threshold_attribute(mut self, input: f64) -> Self {
            self.probability_threshold_attribute = Some(input);
            self
        }
        /// <p>The threshold for the class probability to be evaluated as a positive result.</p>
        pub fn set_probability_threshold_attribute(
            mut self,
            input: std::option::Option<f64>,
        ) -> Self {
            self.probability_threshold_attribute = input;
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn start_time_offset(mut self, input: impl Into<std::string::String>) -> Self {
            self.start_time_offset = Some(input.into());
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn set_start_time_offset(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.start_time_offset = input;
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn end_time_offset(mut self, input: impl Into<std::string::String>) -> Self {
            self.end_time_offset = Some(input.into());
            self
        }
        /// <p>If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html">Schedule Model Quality Monitoring Jobs</a>.</p>
        pub fn set_end_time_offset(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.end_time_offset = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointInput`](crate::model::EndpointInput).
        pub fn build(self) -> crate::model::EndpointInput {
            crate::model::EndpointInput {
                endpoint_name: self.endpoint_name,
                local_path: self.local_path,
                s3_input_mode: self.s3_input_mode,
                s3_data_distribution_type: self.s3_data_distribution_type,
                features_attribute: self.features_attribute,
                inference_attribute: self.inference_attribute,
                probability_attribute: self.probability_attribute,
                probability_threshold_attribute: self.probability_threshold_attribute,
                start_time_offset: self.start_time_offset,
                end_time_offset: self.end_time_offset,
            }
        }
    }
}
impl EndpointInput {
    /// Creates a new builder-style object to manufacture [`EndpointInput`](crate::model::EndpointInput).
    pub fn builder() -> crate::model::endpoint_input::Builder {
        crate::model::endpoint_input::Builder::default()
    }
}

/// <p>Configuration for monitoring constraints and monitoring statistics. These baseline resources are compared against the results of the current job from the series of jobs scheduled to collect data periodically.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringBaselineConfig {
    /// <p>The name of the job that performs baselining for the monitoring job.</p>
    #[doc(hidden)]
    pub baselining_job_name: std::option::Option<std::string::String>,
    /// <p>The baseline constraint file in Amazon S3 that the current monitoring job should validated against.</p>
    #[doc(hidden)]
    pub constraints_resource: std::option::Option<crate::model::MonitoringConstraintsResource>,
    /// <p>The baseline statistics file in Amazon S3 that the current monitoring job should be validated against.</p>
    #[doc(hidden)]
    pub statistics_resource: std::option::Option<crate::model::MonitoringStatisticsResource>,
}
impl MonitoringBaselineConfig {
    /// <p>The name of the job that performs baselining for the monitoring job.</p>
    pub fn baselining_job_name(&self) -> std::option::Option<&str> {
        self.baselining_job_name.as_deref()
    }
    /// <p>The baseline constraint file in Amazon S3 that the current monitoring job should validated against.</p>
    pub fn constraints_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringConstraintsResource> {
        self.constraints_resource.as_ref()
    }
    /// <p>The baseline statistics file in Amazon S3 that the current monitoring job should be validated against.</p>
    pub fn statistics_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringStatisticsResource> {
        self.statistics_resource.as_ref()
    }
}
/// See [`MonitoringBaselineConfig`](crate::model::MonitoringBaselineConfig).
pub mod monitoring_baseline_config {

    /// A builder for [`MonitoringBaselineConfig`](crate::model::MonitoringBaselineConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) baselining_job_name: std::option::Option<std::string::String>,
        pub(crate) constraints_resource:
            std::option::Option<crate::model::MonitoringConstraintsResource>,
        pub(crate) statistics_resource:
            std::option::Option<crate::model::MonitoringStatisticsResource>,
    }
    impl Builder {
        /// <p>The name of the job that performs baselining for the monitoring job.</p>
        pub fn baselining_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.baselining_job_name = Some(input.into());
            self
        }
        /// <p>The name of the job that performs baselining for the monitoring job.</p>
        pub fn set_baselining_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baselining_job_name = input;
            self
        }
        /// <p>The baseline constraint file in Amazon S3 that the current monitoring job should validated against.</p>
        pub fn constraints_resource(
            mut self,
            input: crate::model::MonitoringConstraintsResource,
        ) -> Self {
            self.constraints_resource = Some(input);
            self
        }
        /// <p>The baseline constraint file in Amazon S3 that the current monitoring job should validated against.</p>
        pub fn set_constraints_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringConstraintsResource>,
        ) -> Self {
            self.constraints_resource = input;
            self
        }
        /// <p>The baseline statistics file in Amazon S3 that the current monitoring job should be validated against.</p>
        pub fn statistics_resource(
            mut self,
            input: crate::model::MonitoringStatisticsResource,
        ) -> Self {
            self.statistics_resource = Some(input);
            self
        }
        /// <p>The baseline statistics file in Amazon S3 that the current monitoring job should be validated against.</p>
        pub fn set_statistics_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringStatisticsResource>,
        ) -> Self {
            self.statistics_resource = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringBaselineConfig`](crate::model::MonitoringBaselineConfig).
        pub fn build(self) -> crate::model::MonitoringBaselineConfig {
            crate::model::MonitoringBaselineConfig {
                baselining_job_name: self.baselining_job_name,
                constraints_resource: self.constraints_resource,
                statistics_resource: self.statistics_resource,
            }
        }
    }
}
impl MonitoringBaselineConfig {
    /// Creates a new builder-style object to manufacture [`MonitoringBaselineConfig`](crate::model::MonitoringBaselineConfig).
    pub fn builder() -> crate::model::monitoring_baseline_config::Builder {
        crate::model::monitoring_baseline_config::Builder::default()
    }
}

/// <p>The statistics resource for a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringStatisticsResource {
    /// <p>The Amazon S3 URI for the statistics resource.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl MonitoringStatisticsResource {
    /// <p>The Amazon S3 URI for the statistics resource.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`MonitoringStatisticsResource`](crate::model::MonitoringStatisticsResource).
pub mod monitoring_statistics_resource {

    /// A builder for [`MonitoringStatisticsResource`](crate::model::MonitoringStatisticsResource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 URI for the statistics resource.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI for the statistics resource.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringStatisticsResource`](crate::model::MonitoringStatisticsResource).
        pub fn build(self) -> crate::model::MonitoringStatisticsResource {
            crate::model::MonitoringStatisticsResource {
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl MonitoringStatisticsResource {
    /// Creates a new builder-style object to manufacture [`MonitoringStatisticsResource`](crate::model::MonitoringStatisticsResource).
    pub fn builder() -> crate::model::monitoring_statistics_resource::Builder {
        crate::model::monitoring_statistics_resource::Builder::default()
    }
}

/// <p>The constraints resource for a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringConstraintsResource {
    /// <p>The Amazon S3 URI for the constraints resource.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl MonitoringConstraintsResource {
    /// <p>The Amazon S3 URI for the constraints resource.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`MonitoringConstraintsResource`](crate::model::MonitoringConstraintsResource).
pub mod monitoring_constraints_resource {

    /// A builder for [`MonitoringConstraintsResource`](crate::model::MonitoringConstraintsResource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 URI for the constraints resource.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI for the constraints resource.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringConstraintsResource`](crate::model::MonitoringConstraintsResource).
        pub fn build(self) -> crate::model::MonitoringConstraintsResource {
            crate::model::MonitoringConstraintsResource {
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl MonitoringConstraintsResource {
    /// Creates a new builder-style object to manufacture [`MonitoringConstraintsResource`](crate::model::MonitoringConstraintsResource).
    pub fn builder() -> crate::model::monitoring_constraints_resource::Builder {
        crate::model::monitoring_constraints_resource::Builder::default()
    }
}

/// <p>Configuration details about the monitoring schedule.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ScheduleConfig {
    /// <p>A cron expression that describes details about the monitoring schedule.</p>
    /// <p>Currently the only supported cron expressions are:</p>
    /// <ul>
    /// <li> <p>If you want to set the job to start every hour, please use the following:</p> <p> <code>Hourly: cron(0 * ? * * *)</code> </p> </li>
    /// <li> <p>If you want to start the job daily:</p> <p> <code>cron(0 [00-23] ? * * *)</code> </p> </li>
    /// </ul>
    /// <p>For example, the following are valid cron expressions:</p>
    /// <ul>
    /// <li> <p>Daily at noon UTC: <code>cron(0 12 ? * * *)</code> </p> </li>
    /// <li> <p>Daily at midnight UTC: <code>cron(0 0 ? * * *)</code> </p> </li>
    /// </ul>
    /// <p>To support running every 6, 12 hours, the following are also supported:</p>
    /// <p> <code>cron(0 [00-23]/[01-24] ? * * *)</code> </p>
    /// <p>For example, the following are valid cron expressions:</p>
    /// <ul>
    /// <li> <p>Every 12 hours, starting at 5pm UTC: <code>cron(0 17/12 ? * * *)</code> </p> </li>
    /// <li> <p>Every two hours starting at midnight: <code>cron(0 0/2 ? * * *)</code> </p> </li>
    /// </ul> <note>
    /// <ul>
    /// <li> <p>Even though the cron expression is set to start at 5PM UTC, note that there could be a delay of 0-20 minutes from the actual requested time to run the execution. </p> </li>
    /// <li> <p>We recommend that if you would like a daily schedule, you do not provide this parameter. Amazon SageMaker will pick a time for running every day.</p> </li>
    /// </ul>
    /// </note>
    #[doc(hidden)]
    pub schedule_expression: std::option::Option<std::string::String>,
}
impl ScheduleConfig {
    /// <p>A cron expression that describes details about the monitoring schedule.</p>
    /// <p>Currently the only supported cron expressions are:</p>
    /// <ul>
    /// <li> <p>If you want to set the job to start every hour, please use the following:</p> <p> <code>Hourly: cron(0 * ? * * *)</code> </p> </li>
    /// <li> <p>If you want to start the job daily:</p> <p> <code>cron(0 [00-23] ? * * *)</code> </p> </li>
    /// </ul>
    /// <p>For example, the following are valid cron expressions:</p>
    /// <ul>
    /// <li> <p>Daily at noon UTC: <code>cron(0 12 ? * * *)</code> </p> </li>
    /// <li> <p>Daily at midnight UTC: <code>cron(0 0 ? * * *)</code> </p> </li>
    /// </ul>
    /// <p>To support running every 6, 12 hours, the following are also supported:</p>
    /// <p> <code>cron(0 [00-23]/[01-24] ? * * *)</code> </p>
    /// <p>For example, the following are valid cron expressions:</p>
    /// <ul>
    /// <li> <p>Every 12 hours, starting at 5pm UTC: <code>cron(0 17/12 ? * * *)</code> </p> </li>
    /// <li> <p>Every two hours starting at midnight: <code>cron(0 0/2 ? * * *)</code> </p> </li>
    /// </ul> <note>
    /// <ul>
    /// <li> <p>Even though the cron expression is set to start at 5PM UTC, note that there could be a delay of 0-20 minutes from the actual requested time to run the execution. </p> </li>
    /// <li> <p>We recommend that if you would like a daily schedule, you do not provide this parameter. Amazon SageMaker will pick a time for running every day.</p> </li>
    /// </ul>
    /// </note>
    pub fn schedule_expression(&self) -> std::option::Option<&str> {
        self.schedule_expression.as_deref()
    }
}
/// See [`ScheduleConfig`](crate::model::ScheduleConfig).
pub mod schedule_config {

    /// A builder for [`ScheduleConfig`](crate::model::ScheduleConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) schedule_expression: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A cron expression that describes details about the monitoring schedule.</p>
        /// <p>Currently the only supported cron expressions are:</p>
        /// <ul>
        /// <li> <p>If you want to set the job to start every hour, please use the following:</p> <p> <code>Hourly: cron(0 * ? * * *)</code> </p> </li>
        /// <li> <p>If you want to start the job daily:</p> <p> <code>cron(0 [00-23] ? * * *)</code> </p> </li>
        /// </ul>
        /// <p>For example, the following are valid cron expressions:</p>
        /// <ul>
        /// <li> <p>Daily at noon UTC: <code>cron(0 12 ? * * *)</code> </p> </li>
        /// <li> <p>Daily at midnight UTC: <code>cron(0 0 ? * * *)</code> </p> </li>
        /// </ul>
        /// <p>To support running every 6, 12 hours, the following are also supported:</p>
        /// <p> <code>cron(0 [00-23]/[01-24] ? * * *)</code> </p>
        /// <p>For example, the following are valid cron expressions:</p>
        /// <ul>
        /// <li> <p>Every 12 hours, starting at 5pm UTC: <code>cron(0 17/12 ? * * *)</code> </p> </li>
        /// <li> <p>Every two hours starting at midnight: <code>cron(0 0/2 ? * * *)</code> </p> </li>
        /// </ul> <note>
        /// <ul>
        /// <li> <p>Even though the cron expression is set to start at 5PM UTC, note that there could be a delay of 0-20 minutes from the actual requested time to run the execution. </p> </li>
        /// <li> <p>We recommend that if you would like a daily schedule, you do not provide this parameter. Amazon SageMaker will pick a time for running every day.</p> </li>
        /// </ul>
        /// </note>
        pub fn schedule_expression(mut self, input: impl Into<std::string::String>) -> Self {
            self.schedule_expression = Some(input.into());
            self
        }
        /// <p>A cron expression that describes details about the monitoring schedule.</p>
        /// <p>Currently the only supported cron expressions are:</p>
        /// <ul>
        /// <li> <p>If you want to set the job to start every hour, please use the following:</p> <p> <code>Hourly: cron(0 * ? * * *)</code> </p> </li>
        /// <li> <p>If you want to start the job daily:</p> <p> <code>cron(0 [00-23] ? * * *)</code> </p> </li>
        /// </ul>
        /// <p>For example, the following are valid cron expressions:</p>
        /// <ul>
        /// <li> <p>Daily at noon UTC: <code>cron(0 12 ? * * *)</code> </p> </li>
        /// <li> <p>Daily at midnight UTC: <code>cron(0 0 ? * * *)</code> </p> </li>
        /// </ul>
        /// <p>To support running every 6, 12 hours, the following are also supported:</p>
        /// <p> <code>cron(0 [00-23]/[01-24] ? * * *)</code> </p>
        /// <p>For example, the following are valid cron expressions:</p>
        /// <ul>
        /// <li> <p>Every 12 hours, starting at 5pm UTC: <code>cron(0 17/12 ? * * *)</code> </p> </li>
        /// <li> <p>Every two hours starting at midnight: <code>cron(0 0/2 ? * * *)</code> </p> </li>
        /// </ul> <note>
        /// <ul>
        /// <li> <p>Even though the cron expression is set to start at 5PM UTC, note that there could be a delay of 0-20 minutes from the actual requested time to run the execution. </p> </li>
        /// <li> <p>We recommend that if you would like a daily schedule, you do not provide this parameter. Amazon SageMaker will pick a time for running every day.</p> </li>
        /// </ul>
        /// </note>
        pub fn set_schedule_expression(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.schedule_expression = input;
            self
        }
        /// Consumes the builder and constructs a [`ScheduleConfig`](crate::model::ScheduleConfig).
        pub fn build(self) -> crate::model::ScheduleConfig {
            crate::model::ScheduleConfig {
                schedule_expression: self.schedule_expression,
            }
        }
    }
}
impl ScheduleConfig {
    /// Creates a new builder-style object to manufacture [`ScheduleConfig`](crate::model::ScheduleConfig).
    pub fn builder() -> crate::model::schedule_config::Builder {
        crate::model::schedule_config::Builder::default()
    }
}

/// <p>A structure of additional Inference Specification. Additional Inference Specification specifies details about inference jobs that can be run with models based on this model package</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AdditionalInferenceSpecificationDefinition {
    /// <p>A unique name to identify the additional inference specification. The name must be unique within the list of your additional inference specifications for a particular model package.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>A description of the additional Inference specification</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
    #[doc(hidden)]
    pub containers:
        std::option::Option<std::vec::Vec<crate::model::ModelPackageContainerDefinition>>,
    /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
    #[doc(hidden)]
    pub supported_transform_instance_types:
        std::option::Option<std::vec::Vec<crate::model::TransformInstanceType>>,
    /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
    #[doc(hidden)]
    pub supported_realtime_inference_instance_types:
        std::option::Option<std::vec::Vec<crate::model::ProductionVariantInstanceType>>,
    /// <p>The supported MIME types for the input data.</p>
    #[doc(hidden)]
    pub supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The supported MIME types for the output data.</p>
    #[doc(hidden)]
    pub supported_response_mime_types: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl AdditionalInferenceSpecificationDefinition {
    /// <p>A unique name to identify the additional inference specification. The name must be unique within the list of your additional inference specifications for a particular model package.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>A description of the additional Inference specification</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
    pub fn containers(
        &self,
    ) -> std::option::Option<&[crate::model::ModelPackageContainerDefinition]> {
        self.containers.as_deref()
    }
    /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
    pub fn supported_transform_instance_types(
        &self,
    ) -> std::option::Option<&[crate::model::TransformInstanceType]> {
        self.supported_transform_instance_types.as_deref()
    }
    /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
    pub fn supported_realtime_inference_instance_types(
        &self,
    ) -> std::option::Option<&[crate::model::ProductionVariantInstanceType]> {
        self.supported_realtime_inference_instance_types.as_deref()
    }
    /// <p>The supported MIME types for the input data.</p>
    pub fn supported_content_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_content_types.as_deref()
    }
    /// <p>The supported MIME types for the output data.</p>
    pub fn supported_response_mime_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_response_mime_types.as_deref()
    }
}
/// See [`AdditionalInferenceSpecificationDefinition`](crate::model::AdditionalInferenceSpecificationDefinition).
pub mod additional_inference_specification_definition {

    /// A builder for [`AdditionalInferenceSpecificationDefinition`](crate::model::AdditionalInferenceSpecificationDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) containers:
            std::option::Option<std::vec::Vec<crate::model::ModelPackageContainerDefinition>>,
        pub(crate) supported_transform_instance_types:
            std::option::Option<std::vec::Vec<crate::model::TransformInstanceType>>,
        pub(crate) supported_realtime_inference_instance_types:
            std::option::Option<std::vec::Vec<crate::model::ProductionVariantInstanceType>>,
        pub(crate) supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) supported_response_mime_types:
            std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>A unique name to identify the additional inference specification. The name must be unique within the list of your additional inference specifications for a particular model package.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>A unique name to identify the additional inference specification. The name must be unique within the list of your additional inference specifications for a particular model package.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>A description of the additional Inference specification</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>A description of the additional Inference specification</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// Appends an item to `containers`.
        ///
        /// To override the contents of this collection use [`set_containers`](Self::set_containers).
        ///
        /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
        pub fn containers(mut self, input: crate::model::ModelPackageContainerDefinition) -> Self {
            let mut v = self.containers.unwrap_or_default();
            v.push(input);
            self.containers = Some(v);
            self
        }
        /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
        pub fn set_containers(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::ModelPackageContainerDefinition>,
            >,
        ) -> Self {
            self.containers = input;
            self
        }
        /// Appends an item to `supported_transform_instance_types`.
        ///
        /// To override the contents of this collection use [`set_supported_transform_instance_types`](Self::set_supported_transform_instance_types).
        ///
        /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
        pub fn supported_transform_instance_types(
            mut self,
            input: crate::model::TransformInstanceType,
        ) -> Self {
            let mut v = self.supported_transform_instance_types.unwrap_or_default();
            v.push(input);
            self.supported_transform_instance_types = Some(v);
            self
        }
        /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
        pub fn set_supported_transform_instance_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::TransformInstanceType>>,
        ) -> Self {
            self.supported_transform_instance_types = input;
            self
        }
        /// Appends an item to `supported_realtime_inference_instance_types`.
        ///
        /// To override the contents of this collection use [`set_supported_realtime_inference_instance_types`](Self::set_supported_realtime_inference_instance_types).
        ///
        /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
        pub fn supported_realtime_inference_instance_types(
            mut self,
            input: crate::model::ProductionVariantInstanceType,
        ) -> Self {
            let mut v = self
                .supported_realtime_inference_instance_types
                .unwrap_or_default();
            v.push(input);
            self.supported_realtime_inference_instance_types = Some(v);
            self
        }
        /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
        pub fn set_supported_realtime_inference_instance_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProductionVariantInstanceType>>,
        ) -> Self {
            self.supported_realtime_inference_instance_types = input;
            self
        }
        /// Appends an item to `supported_content_types`.
        ///
        /// To override the contents of this collection use [`set_supported_content_types`](Self::set_supported_content_types).
        ///
        /// <p>The supported MIME types for the input data.</p>
        pub fn supported_content_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.supported_content_types.unwrap_or_default();
            v.push(input.into());
            self.supported_content_types = Some(v);
            self
        }
        /// <p>The supported MIME types for the input data.</p>
        pub fn set_supported_content_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_content_types = input;
            self
        }
        /// Appends an item to `supported_response_mime_types`.
        ///
        /// To override the contents of this collection use [`set_supported_response_mime_types`](Self::set_supported_response_mime_types).
        ///
        /// <p>The supported MIME types for the output data.</p>
        pub fn supported_response_mime_types(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            let mut v = self.supported_response_mime_types.unwrap_or_default();
            v.push(input.into());
            self.supported_response_mime_types = Some(v);
            self
        }
        /// <p>The supported MIME types for the output data.</p>
        pub fn set_supported_response_mime_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_response_mime_types = input;
            self
        }
        /// Consumes the builder and constructs a [`AdditionalInferenceSpecificationDefinition`](crate::model::AdditionalInferenceSpecificationDefinition).
        pub fn build(self) -> crate::model::AdditionalInferenceSpecificationDefinition {
            crate::model::AdditionalInferenceSpecificationDefinition {
                name: self.name,
                description: self.description,
                containers: self.containers,
                supported_transform_instance_types: self.supported_transform_instance_types,
                supported_realtime_inference_instance_types: self
                    .supported_realtime_inference_instance_types,
                supported_content_types: self.supported_content_types,
                supported_response_mime_types: self.supported_response_mime_types,
            }
        }
    }
}
impl AdditionalInferenceSpecificationDefinition {
    /// Creates a new builder-style object to manufacture [`AdditionalInferenceSpecificationDefinition`](crate::model::AdditionalInferenceSpecificationDefinition).
    pub fn builder() -> crate::model::additional_inference_specification_definition::Builder {
        crate::model::additional_inference_specification_definition::Builder::default()
    }
}

/// When writing a match expression against `ProductionVariantInstanceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let productionvariantinstancetype = unimplemented!();
/// match productionvariantinstancetype {
///     ProductionVariantInstanceType::MlC42Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC44Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC48Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC4Large => { /* ... */ },
///     ProductionVariantInstanceType::MlC4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC518Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC52Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC54Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC59Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5Large => { /* ... */ },
///     ProductionVariantInstanceType::MlC5Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5D18Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5D2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5D4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5D9Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5DLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC5DXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6G12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6G16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6G2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6G4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6G8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6GLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6GXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gd12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gd16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gd2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gd4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gd8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6GdLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6GdXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gn12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gn16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gn2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gn4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6Gn8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6GnLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6GnXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I24Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I32Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6I8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6ILarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC6IXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7G12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7G16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7G2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7G4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7G8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7GLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlC7GXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG4Dn12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG4Dn16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG4Dn2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG4Dn4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG4Dn8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG4DnXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG512Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG516Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG524Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG52Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG548Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG54Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG58Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlG5Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlInf124Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlInf12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlInf16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlInf1Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM410Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM416Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM42Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM44Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM512Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM524Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM52Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM54Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5Large => { /* ... */ },
///     ProductionVariantInstanceType::MlM5Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5D12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5D24Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5D2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5D4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5DLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM5DXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6G12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6G16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6G2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6G4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6G8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6GLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6GXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6Gd12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6Gd16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6Gd2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6Gd4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6Gd8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6GdLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlM6GdXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP216Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP28Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP316Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP32Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP38Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP4D24Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlP4De24Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR512Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR524Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR52Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR54Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5Large => { /* ... */ },
///     ProductionVariantInstanceType::MlR5Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5D12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5D24Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5D2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5D4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5DLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR5DXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6G12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6G16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6G2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6G4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6G8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6GLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6GXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6Gd12Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6Gd16Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6Gd2Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6Gd4Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6Gd8Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6GdLarge => { /* ... */ },
///     ProductionVariantInstanceType::MlR6GdXlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlT22Xlarge => { /* ... */ },
///     ProductionVariantInstanceType::MlT2Large => { /* ... */ },
///     ProductionVariantInstanceType::MlT2Medium => { /* ... */ },
///     ProductionVariantInstanceType::MlT2Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `productionvariantinstancetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProductionVariantInstanceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProductionVariantInstanceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProductionVariantInstanceType::NewFeature` is defined.
/// Specifically, when `productionvariantinstancetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProductionVariantInstanceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProductionVariantInstanceType {
    #[allow(missing_docs)] // documentation missing in model
    MlC42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC48Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC4Large,
    #[allow(missing_docs)] // documentation missing in model
    MlC4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC518Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC59Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D18Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5D9Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5DLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5DXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6G12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6G16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6G2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6G4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6G8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6GLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6GXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gd12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gd16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gd2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gd4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gd8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6GdLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6GdXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6Gn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6GnLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6GnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6I8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6ILarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC6IXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7G12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7G16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7G2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7G4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7G8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7GLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC7GXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4DnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG548Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlInf124Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlInf12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlInf16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlInf1Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM410Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM416Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5D4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5DLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5DXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6G12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6G16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6G2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6G4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6G8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6GLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6GXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6Gd12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6Gd16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6Gd2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6Gd4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6Gd8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6GdLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM6GdXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP216Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP28Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP316Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP38Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP4D24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP4De24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlR5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5D12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5D24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5D2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5D4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5DLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR5DXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6G12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6G16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6G2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6G4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6G8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6GLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6GXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6Gd12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6Gd16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6Gd2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6Gd4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6Gd8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6GdLarge,
    #[allow(missing_docs)] // documentation missing in model
    MlR6GdXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT22Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlT2Large,
    #[allow(missing_docs)] // documentation missing in model
    MlT2Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlT2Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProductionVariantInstanceType {
    fn from(s: &str) -> Self {
        match s {
            "ml.c4.2xlarge" => ProductionVariantInstanceType::MlC42Xlarge,
            "ml.c4.4xlarge" => ProductionVariantInstanceType::MlC44Xlarge,
            "ml.c4.8xlarge" => ProductionVariantInstanceType::MlC48Xlarge,
            "ml.c4.large" => ProductionVariantInstanceType::MlC4Large,
            "ml.c4.xlarge" => ProductionVariantInstanceType::MlC4Xlarge,
            "ml.c5.18xlarge" => ProductionVariantInstanceType::MlC518Xlarge,
            "ml.c5.2xlarge" => ProductionVariantInstanceType::MlC52Xlarge,
            "ml.c5.4xlarge" => ProductionVariantInstanceType::MlC54Xlarge,
            "ml.c5.9xlarge" => ProductionVariantInstanceType::MlC59Xlarge,
            "ml.c5.large" => ProductionVariantInstanceType::MlC5Large,
            "ml.c5.xlarge" => ProductionVariantInstanceType::MlC5Xlarge,
            "ml.c5d.18xlarge" => ProductionVariantInstanceType::MlC5D18Xlarge,
            "ml.c5d.2xlarge" => ProductionVariantInstanceType::MlC5D2Xlarge,
            "ml.c5d.4xlarge" => ProductionVariantInstanceType::MlC5D4Xlarge,
            "ml.c5d.9xlarge" => ProductionVariantInstanceType::MlC5D9Xlarge,
            "ml.c5d.large" => ProductionVariantInstanceType::MlC5DLarge,
            "ml.c5d.xlarge" => ProductionVariantInstanceType::MlC5DXlarge,
            "ml.c6g.12xlarge" => ProductionVariantInstanceType::MlC6G12Xlarge,
            "ml.c6g.16xlarge" => ProductionVariantInstanceType::MlC6G16Xlarge,
            "ml.c6g.2xlarge" => ProductionVariantInstanceType::MlC6G2Xlarge,
            "ml.c6g.4xlarge" => ProductionVariantInstanceType::MlC6G4Xlarge,
            "ml.c6g.8xlarge" => ProductionVariantInstanceType::MlC6G8Xlarge,
            "ml.c6g.large" => ProductionVariantInstanceType::MlC6GLarge,
            "ml.c6g.xlarge" => ProductionVariantInstanceType::MlC6GXlarge,
            "ml.c6gd.12xlarge" => ProductionVariantInstanceType::MlC6Gd12Xlarge,
            "ml.c6gd.16xlarge" => ProductionVariantInstanceType::MlC6Gd16Xlarge,
            "ml.c6gd.2xlarge" => ProductionVariantInstanceType::MlC6Gd2Xlarge,
            "ml.c6gd.4xlarge" => ProductionVariantInstanceType::MlC6Gd4Xlarge,
            "ml.c6gd.8xlarge" => ProductionVariantInstanceType::MlC6Gd8Xlarge,
            "ml.c6gd.large" => ProductionVariantInstanceType::MlC6GdLarge,
            "ml.c6gd.xlarge" => ProductionVariantInstanceType::MlC6GdXlarge,
            "ml.c6gn.12xlarge" => ProductionVariantInstanceType::MlC6Gn12Xlarge,
            "ml.c6gn.16xlarge" => ProductionVariantInstanceType::MlC6Gn16Xlarge,
            "ml.c6gn.2xlarge" => ProductionVariantInstanceType::MlC6Gn2Xlarge,
            "ml.c6gn.4xlarge" => ProductionVariantInstanceType::MlC6Gn4Xlarge,
            "ml.c6gn.8xlarge" => ProductionVariantInstanceType::MlC6Gn8Xlarge,
            "ml.c6gn.large" => ProductionVariantInstanceType::MlC6GnLarge,
            "ml.c6gn.xlarge" => ProductionVariantInstanceType::MlC6GnXlarge,
            "ml.c6i.12xlarge" => ProductionVariantInstanceType::MlC6I12Xlarge,
            "ml.c6i.16xlarge" => ProductionVariantInstanceType::MlC6I16Xlarge,
            "ml.c6i.24xlarge" => ProductionVariantInstanceType::MlC6I24Xlarge,
            "ml.c6i.2xlarge" => ProductionVariantInstanceType::MlC6I2Xlarge,
            "ml.c6i.32xlarge" => ProductionVariantInstanceType::MlC6I32Xlarge,
            "ml.c6i.4xlarge" => ProductionVariantInstanceType::MlC6I4Xlarge,
            "ml.c6i.8xlarge" => ProductionVariantInstanceType::MlC6I8Xlarge,
            "ml.c6i.large" => ProductionVariantInstanceType::MlC6ILarge,
            "ml.c6i.xlarge" => ProductionVariantInstanceType::MlC6IXlarge,
            "ml.c7g.12xlarge" => ProductionVariantInstanceType::MlC7G12Xlarge,
            "ml.c7g.16xlarge" => ProductionVariantInstanceType::MlC7G16Xlarge,
            "ml.c7g.2xlarge" => ProductionVariantInstanceType::MlC7G2Xlarge,
            "ml.c7g.4xlarge" => ProductionVariantInstanceType::MlC7G4Xlarge,
            "ml.c7g.8xlarge" => ProductionVariantInstanceType::MlC7G8Xlarge,
            "ml.c7g.large" => ProductionVariantInstanceType::MlC7GLarge,
            "ml.c7g.xlarge" => ProductionVariantInstanceType::MlC7GXlarge,
            "ml.g4dn.12xlarge" => ProductionVariantInstanceType::MlG4Dn12Xlarge,
            "ml.g4dn.16xlarge" => ProductionVariantInstanceType::MlG4Dn16Xlarge,
            "ml.g4dn.2xlarge" => ProductionVariantInstanceType::MlG4Dn2Xlarge,
            "ml.g4dn.4xlarge" => ProductionVariantInstanceType::MlG4Dn4Xlarge,
            "ml.g4dn.8xlarge" => ProductionVariantInstanceType::MlG4Dn8Xlarge,
            "ml.g4dn.xlarge" => ProductionVariantInstanceType::MlG4DnXlarge,
            "ml.g5.12xlarge" => ProductionVariantInstanceType::MlG512Xlarge,
            "ml.g5.16xlarge" => ProductionVariantInstanceType::MlG516Xlarge,
            "ml.g5.24xlarge" => ProductionVariantInstanceType::MlG524Xlarge,
            "ml.g5.2xlarge" => ProductionVariantInstanceType::MlG52Xlarge,
            "ml.g5.48xlarge" => ProductionVariantInstanceType::MlG548Xlarge,
            "ml.g5.4xlarge" => ProductionVariantInstanceType::MlG54Xlarge,
            "ml.g5.8xlarge" => ProductionVariantInstanceType::MlG58Xlarge,
            "ml.g5.xlarge" => ProductionVariantInstanceType::MlG5Xlarge,
            "ml.inf1.24xlarge" => ProductionVariantInstanceType::MlInf124Xlarge,
            "ml.inf1.2xlarge" => ProductionVariantInstanceType::MlInf12Xlarge,
            "ml.inf1.6xlarge" => ProductionVariantInstanceType::MlInf16Xlarge,
            "ml.inf1.xlarge" => ProductionVariantInstanceType::MlInf1Xlarge,
            "ml.m4.10xlarge" => ProductionVariantInstanceType::MlM410Xlarge,
            "ml.m4.16xlarge" => ProductionVariantInstanceType::MlM416Xlarge,
            "ml.m4.2xlarge" => ProductionVariantInstanceType::MlM42Xlarge,
            "ml.m4.4xlarge" => ProductionVariantInstanceType::MlM44Xlarge,
            "ml.m4.xlarge" => ProductionVariantInstanceType::MlM4Xlarge,
            "ml.m5.12xlarge" => ProductionVariantInstanceType::MlM512Xlarge,
            "ml.m5.24xlarge" => ProductionVariantInstanceType::MlM524Xlarge,
            "ml.m5.2xlarge" => ProductionVariantInstanceType::MlM52Xlarge,
            "ml.m5.4xlarge" => ProductionVariantInstanceType::MlM54Xlarge,
            "ml.m5.large" => ProductionVariantInstanceType::MlM5Large,
            "ml.m5.xlarge" => ProductionVariantInstanceType::MlM5Xlarge,
            "ml.m5d.12xlarge" => ProductionVariantInstanceType::MlM5D12Xlarge,
            "ml.m5d.24xlarge" => ProductionVariantInstanceType::MlM5D24Xlarge,
            "ml.m5d.2xlarge" => ProductionVariantInstanceType::MlM5D2Xlarge,
            "ml.m5d.4xlarge" => ProductionVariantInstanceType::MlM5D4Xlarge,
            "ml.m5d.large" => ProductionVariantInstanceType::MlM5DLarge,
            "ml.m5d.xlarge" => ProductionVariantInstanceType::MlM5DXlarge,
            "ml.m6g.12xlarge" => ProductionVariantInstanceType::MlM6G12Xlarge,
            "ml.m6g.16xlarge" => ProductionVariantInstanceType::MlM6G16Xlarge,
            "ml.m6g.2xlarge" => ProductionVariantInstanceType::MlM6G2Xlarge,
            "ml.m6g.4xlarge" => ProductionVariantInstanceType::MlM6G4Xlarge,
            "ml.m6g.8xlarge" => ProductionVariantInstanceType::MlM6G8Xlarge,
            "ml.m6g.large" => ProductionVariantInstanceType::MlM6GLarge,
            "ml.m6g.xlarge" => ProductionVariantInstanceType::MlM6GXlarge,
            "ml.m6gd.12xlarge" => ProductionVariantInstanceType::MlM6Gd12Xlarge,
            "ml.m6gd.16xlarge" => ProductionVariantInstanceType::MlM6Gd16Xlarge,
            "ml.m6gd.2xlarge" => ProductionVariantInstanceType::MlM6Gd2Xlarge,
            "ml.m6gd.4xlarge" => ProductionVariantInstanceType::MlM6Gd4Xlarge,
            "ml.m6gd.8xlarge" => ProductionVariantInstanceType::MlM6Gd8Xlarge,
            "ml.m6gd.large" => ProductionVariantInstanceType::MlM6GdLarge,
            "ml.m6gd.xlarge" => ProductionVariantInstanceType::MlM6GdXlarge,
            "ml.p2.16xlarge" => ProductionVariantInstanceType::MlP216Xlarge,
            "ml.p2.8xlarge" => ProductionVariantInstanceType::MlP28Xlarge,
            "ml.p2.xlarge" => ProductionVariantInstanceType::MlP2Xlarge,
            "ml.p3.16xlarge" => ProductionVariantInstanceType::MlP316Xlarge,
            "ml.p3.2xlarge" => ProductionVariantInstanceType::MlP32Xlarge,
            "ml.p3.8xlarge" => ProductionVariantInstanceType::MlP38Xlarge,
            "ml.p4d.24xlarge" => ProductionVariantInstanceType::MlP4D24Xlarge,
            "ml.p4de.24xlarge" => ProductionVariantInstanceType::MlP4De24Xlarge,
            "ml.r5.12xlarge" => ProductionVariantInstanceType::MlR512Xlarge,
            "ml.r5.24xlarge" => ProductionVariantInstanceType::MlR524Xlarge,
            "ml.r5.2xlarge" => ProductionVariantInstanceType::MlR52Xlarge,
            "ml.r5.4xlarge" => ProductionVariantInstanceType::MlR54Xlarge,
            "ml.r5.large" => ProductionVariantInstanceType::MlR5Large,
            "ml.r5.xlarge" => ProductionVariantInstanceType::MlR5Xlarge,
            "ml.r5d.12xlarge" => ProductionVariantInstanceType::MlR5D12Xlarge,
            "ml.r5d.24xlarge" => ProductionVariantInstanceType::MlR5D24Xlarge,
            "ml.r5d.2xlarge" => ProductionVariantInstanceType::MlR5D2Xlarge,
            "ml.r5d.4xlarge" => ProductionVariantInstanceType::MlR5D4Xlarge,
            "ml.r5d.large" => ProductionVariantInstanceType::MlR5DLarge,
            "ml.r5d.xlarge" => ProductionVariantInstanceType::MlR5DXlarge,
            "ml.r6g.12xlarge" => ProductionVariantInstanceType::MlR6G12Xlarge,
            "ml.r6g.16xlarge" => ProductionVariantInstanceType::MlR6G16Xlarge,
            "ml.r6g.2xlarge" => ProductionVariantInstanceType::MlR6G2Xlarge,
            "ml.r6g.4xlarge" => ProductionVariantInstanceType::MlR6G4Xlarge,
            "ml.r6g.8xlarge" => ProductionVariantInstanceType::MlR6G8Xlarge,
            "ml.r6g.large" => ProductionVariantInstanceType::MlR6GLarge,
            "ml.r6g.xlarge" => ProductionVariantInstanceType::MlR6GXlarge,
            "ml.r6gd.12xlarge" => ProductionVariantInstanceType::MlR6Gd12Xlarge,
            "ml.r6gd.16xlarge" => ProductionVariantInstanceType::MlR6Gd16Xlarge,
            "ml.r6gd.2xlarge" => ProductionVariantInstanceType::MlR6Gd2Xlarge,
            "ml.r6gd.4xlarge" => ProductionVariantInstanceType::MlR6Gd4Xlarge,
            "ml.r6gd.8xlarge" => ProductionVariantInstanceType::MlR6Gd8Xlarge,
            "ml.r6gd.large" => ProductionVariantInstanceType::MlR6GdLarge,
            "ml.r6gd.xlarge" => ProductionVariantInstanceType::MlR6GdXlarge,
            "ml.t2.2xlarge" => ProductionVariantInstanceType::MlT22Xlarge,
            "ml.t2.large" => ProductionVariantInstanceType::MlT2Large,
            "ml.t2.medium" => ProductionVariantInstanceType::MlT2Medium,
            "ml.t2.xlarge" => ProductionVariantInstanceType::MlT2Xlarge,
            other => ProductionVariantInstanceType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ProductionVariantInstanceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProductionVariantInstanceType::from(s))
    }
}
impl ProductionVariantInstanceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProductionVariantInstanceType::MlC42Xlarge => "ml.c4.2xlarge",
            ProductionVariantInstanceType::MlC44Xlarge => "ml.c4.4xlarge",
            ProductionVariantInstanceType::MlC48Xlarge => "ml.c4.8xlarge",
            ProductionVariantInstanceType::MlC4Large => "ml.c4.large",
            ProductionVariantInstanceType::MlC4Xlarge => "ml.c4.xlarge",
            ProductionVariantInstanceType::MlC518Xlarge => "ml.c5.18xlarge",
            ProductionVariantInstanceType::MlC52Xlarge => "ml.c5.2xlarge",
            ProductionVariantInstanceType::MlC54Xlarge => "ml.c5.4xlarge",
            ProductionVariantInstanceType::MlC59Xlarge => "ml.c5.9xlarge",
            ProductionVariantInstanceType::MlC5Large => "ml.c5.large",
            ProductionVariantInstanceType::MlC5Xlarge => "ml.c5.xlarge",
            ProductionVariantInstanceType::MlC5D18Xlarge => "ml.c5d.18xlarge",
            ProductionVariantInstanceType::MlC5D2Xlarge => "ml.c5d.2xlarge",
            ProductionVariantInstanceType::MlC5D4Xlarge => "ml.c5d.4xlarge",
            ProductionVariantInstanceType::MlC5D9Xlarge => "ml.c5d.9xlarge",
            ProductionVariantInstanceType::MlC5DLarge => "ml.c5d.large",
            ProductionVariantInstanceType::MlC5DXlarge => "ml.c5d.xlarge",
            ProductionVariantInstanceType::MlC6G12Xlarge => "ml.c6g.12xlarge",
            ProductionVariantInstanceType::MlC6G16Xlarge => "ml.c6g.16xlarge",
            ProductionVariantInstanceType::MlC6G2Xlarge => "ml.c6g.2xlarge",
            ProductionVariantInstanceType::MlC6G4Xlarge => "ml.c6g.4xlarge",
            ProductionVariantInstanceType::MlC6G8Xlarge => "ml.c6g.8xlarge",
            ProductionVariantInstanceType::MlC6GLarge => "ml.c6g.large",
            ProductionVariantInstanceType::MlC6GXlarge => "ml.c6g.xlarge",
            ProductionVariantInstanceType::MlC6Gd12Xlarge => "ml.c6gd.12xlarge",
            ProductionVariantInstanceType::MlC6Gd16Xlarge => "ml.c6gd.16xlarge",
            ProductionVariantInstanceType::MlC6Gd2Xlarge => "ml.c6gd.2xlarge",
            ProductionVariantInstanceType::MlC6Gd4Xlarge => "ml.c6gd.4xlarge",
            ProductionVariantInstanceType::MlC6Gd8Xlarge => "ml.c6gd.8xlarge",
            ProductionVariantInstanceType::MlC6GdLarge => "ml.c6gd.large",
            ProductionVariantInstanceType::MlC6GdXlarge => "ml.c6gd.xlarge",
            ProductionVariantInstanceType::MlC6Gn12Xlarge => "ml.c6gn.12xlarge",
            ProductionVariantInstanceType::MlC6Gn16Xlarge => "ml.c6gn.16xlarge",
            ProductionVariantInstanceType::MlC6Gn2Xlarge => "ml.c6gn.2xlarge",
            ProductionVariantInstanceType::MlC6Gn4Xlarge => "ml.c6gn.4xlarge",
            ProductionVariantInstanceType::MlC6Gn8Xlarge => "ml.c6gn.8xlarge",
            ProductionVariantInstanceType::MlC6GnLarge => "ml.c6gn.large",
            ProductionVariantInstanceType::MlC6GnXlarge => "ml.c6gn.xlarge",
            ProductionVariantInstanceType::MlC6I12Xlarge => "ml.c6i.12xlarge",
            ProductionVariantInstanceType::MlC6I16Xlarge => "ml.c6i.16xlarge",
            ProductionVariantInstanceType::MlC6I24Xlarge => "ml.c6i.24xlarge",
            ProductionVariantInstanceType::MlC6I2Xlarge => "ml.c6i.2xlarge",
            ProductionVariantInstanceType::MlC6I32Xlarge => "ml.c6i.32xlarge",
            ProductionVariantInstanceType::MlC6I4Xlarge => "ml.c6i.4xlarge",
            ProductionVariantInstanceType::MlC6I8Xlarge => "ml.c6i.8xlarge",
            ProductionVariantInstanceType::MlC6ILarge => "ml.c6i.large",
            ProductionVariantInstanceType::MlC6IXlarge => "ml.c6i.xlarge",
            ProductionVariantInstanceType::MlC7G12Xlarge => "ml.c7g.12xlarge",
            ProductionVariantInstanceType::MlC7G16Xlarge => "ml.c7g.16xlarge",
            ProductionVariantInstanceType::MlC7G2Xlarge => "ml.c7g.2xlarge",
            ProductionVariantInstanceType::MlC7G4Xlarge => "ml.c7g.4xlarge",
            ProductionVariantInstanceType::MlC7G8Xlarge => "ml.c7g.8xlarge",
            ProductionVariantInstanceType::MlC7GLarge => "ml.c7g.large",
            ProductionVariantInstanceType::MlC7GXlarge => "ml.c7g.xlarge",
            ProductionVariantInstanceType::MlG4Dn12Xlarge => "ml.g4dn.12xlarge",
            ProductionVariantInstanceType::MlG4Dn16Xlarge => "ml.g4dn.16xlarge",
            ProductionVariantInstanceType::MlG4Dn2Xlarge => "ml.g4dn.2xlarge",
            ProductionVariantInstanceType::MlG4Dn4Xlarge => "ml.g4dn.4xlarge",
            ProductionVariantInstanceType::MlG4Dn8Xlarge => "ml.g4dn.8xlarge",
            ProductionVariantInstanceType::MlG4DnXlarge => "ml.g4dn.xlarge",
            ProductionVariantInstanceType::MlG512Xlarge => "ml.g5.12xlarge",
            ProductionVariantInstanceType::MlG516Xlarge => "ml.g5.16xlarge",
            ProductionVariantInstanceType::MlG524Xlarge => "ml.g5.24xlarge",
            ProductionVariantInstanceType::MlG52Xlarge => "ml.g5.2xlarge",
            ProductionVariantInstanceType::MlG548Xlarge => "ml.g5.48xlarge",
            ProductionVariantInstanceType::MlG54Xlarge => "ml.g5.4xlarge",
            ProductionVariantInstanceType::MlG58Xlarge => "ml.g5.8xlarge",
            ProductionVariantInstanceType::MlG5Xlarge => "ml.g5.xlarge",
            ProductionVariantInstanceType::MlInf124Xlarge => "ml.inf1.24xlarge",
            ProductionVariantInstanceType::MlInf12Xlarge => "ml.inf1.2xlarge",
            ProductionVariantInstanceType::MlInf16Xlarge => "ml.inf1.6xlarge",
            ProductionVariantInstanceType::MlInf1Xlarge => "ml.inf1.xlarge",
            ProductionVariantInstanceType::MlM410Xlarge => "ml.m4.10xlarge",
            ProductionVariantInstanceType::MlM416Xlarge => "ml.m4.16xlarge",
            ProductionVariantInstanceType::MlM42Xlarge => "ml.m4.2xlarge",
            ProductionVariantInstanceType::MlM44Xlarge => "ml.m4.4xlarge",
            ProductionVariantInstanceType::MlM4Xlarge => "ml.m4.xlarge",
            ProductionVariantInstanceType::MlM512Xlarge => "ml.m5.12xlarge",
            ProductionVariantInstanceType::MlM524Xlarge => "ml.m5.24xlarge",
            ProductionVariantInstanceType::MlM52Xlarge => "ml.m5.2xlarge",
            ProductionVariantInstanceType::MlM54Xlarge => "ml.m5.4xlarge",
            ProductionVariantInstanceType::MlM5Large => "ml.m5.large",
            ProductionVariantInstanceType::MlM5Xlarge => "ml.m5.xlarge",
            ProductionVariantInstanceType::MlM5D12Xlarge => "ml.m5d.12xlarge",
            ProductionVariantInstanceType::MlM5D24Xlarge => "ml.m5d.24xlarge",
            ProductionVariantInstanceType::MlM5D2Xlarge => "ml.m5d.2xlarge",
            ProductionVariantInstanceType::MlM5D4Xlarge => "ml.m5d.4xlarge",
            ProductionVariantInstanceType::MlM5DLarge => "ml.m5d.large",
            ProductionVariantInstanceType::MlM5DXlarge => "ml.m5d.xlarge",
            ProductionVariantInstanceType::MlM6G12Xlarge => "ml.m6g.12xlarge",
            ProductionVariantInstanceType::MlM6G16Xlarge => "ml.m6g.16xlarge",
            ProductionVariantInstanceType::MlM6G2Xlarge => "ml.m6g.2xlarge",
            ProductionVariantInstanceType::MlM6G4Xlarge => "ml.m6g.4xlarge",
            ProductionVariantInstanceType::MlM6G8Xlarge => "ml.m6g.8xlarge",
            ProductionVariantInstanceType::MlM6GLarge => "ml.m6g.large",
            ProductionVariantInstanceType::MlM6GXlarge => "ml.m6g.xlarge",
            ProductionVariantInstanceType::MlM6Gd12Xlarge => "ml.m6gd.12xlarge",
            ProductionVariantInstanceType::MlM6Gd16Xlarge => "ml.m6gd.16xlarge",
            ProductionVariantInstanceType::MlM6Gd2Xlarge => "ml.m6gd.2xlarge",
            ProductionVariantInstanceType::MlM6Gd4Xlarge => "ml.m6gd.4xlarge",
            ProductionVariantInstanceType::MlM6Gd8Xlarge => "ml.m6gd.8xlarge",
            ProductionVariantInstanceType::MlM6GdLarge => "ml.m6gd.large",
            ProductionVariantInstanceType::MlM6GdXlarge => "ml.m6gd.xlarge",
            ProductionVariantInstanceType::MlP216Xlarge => "ml.p2.16xlarge",
            ProductionVariantInstanceType::MlP28Xlarge => "ml.p2.8xlarge",
            ProductionVariantInstanceType::MlP2Xlarge => "ml.p2.xlarge",
            ProductionVariantInstanceType::MlP316Xlarge => "ml.p3.16xlarge",
            ProductionVariantInstanceType::MlP32Xlarge => "ml.p3.2xlarge",
            ProductionVariantInstanceType::MlP38Xlarge => "ml.p3.8xlarge",
            ProductionVariantInstanceType::MlP4D24Xlarge => "ml.p4d.24xlarge",
            ProductionVariantInstanceType::MlP4De24Xlarge => "ml.p4de.24xlarge",
            ProductionVariantInstanceType::MlR512Xlarge => "ml.r5.12xlarge",
            ProductionVariantInstanceType::MlR524Xlarge => "ml.r5.24xlarge",
            ProductionVariantInstanceType::MlR52Xlarge => "ml.r5.2xlarge",
            ProductionVariantInstanceType::MlR54Xlarge => "ml.r5.4xlarge",
            ProductionVariantInstanceType::MlR5Large => "ml.r5.large",
            ProductionVariantInstanceType::MlR5Xlarge => "ml.r5.xlarge",
            ProductionVariantInstanceType::MlR5D12Xlarge => "ml.r5d.12xlarge",
            ProductionVariantInstanceType::MlR5D24Xlarge => "ml.r5d.24xlarge",
            ProductionVariantInstanceType::MlR5D2Xlarge => "ml.r5d.2xlarge",
            ProductionVariantInstanceType::MlR5D4Xlarge => "ml.r5d.4xlarge",
            ProductionVariantInstanceType::MlR5DLarge => "ml.r5d.large",
            ProductionVariantInstanceType::MlR5DXlarge => "ml.r5d.xlarge",
            ProductionVariantInstanceType::MlR6G12Xlarge => "ml.r6g.12xlarge",
            ProductionVariantInstanceType::MlR6G16Xlarge => "ml.r6g.16xlarge",
            ProductionVariantInstanceType::MlR6G2Xlarge => "ml.r6g.2xlarge",
            ProductionVariantInstanceType::MlR6G4Xlarge => "ml.r6g.4xlarge",
            ProductionVariantInstanceType::MlR6G8Xlarge => "ml.r6g.8xlarge",
            ProductionVariantInstanceType::MlR6GLarge => "ml.r6g.large",
            ProductionVariantInstanceType::MlR6GXlarge => "ml.r6g.xlarge",
            ProductionVariantInstanceType::MlR6Gd12Xlarge => "ml.r6gd.12xlarge",
            ProductionVariantInstanceType::MlR6Gd16Xlarge => "ml.r6gd.16xlarge",
            ProductionVariantInstanceType::MlR6Gd2Xlarge => "ml.r6gd.2xlarge",
            ProductionVariantInstanceType::MlR6Gd4Xlarge => "ml.r6gd.4xlarge",
            ProductionVariantInstanceType::MlR6Gd8Xlarge => "ml.r6gd.8xlarge",
            ProductionVariantInstanceType::MlR6GdLarge => "ml.r6gd.large",
            ProductionVariantInstanceType::MlR6GdXlarge => "ml.r6gd.xlarge",
            ProductionVariantInstanceType::MlT22Xlarge => "ml.t2.2xlarge",
            ProductionVariantInstanceType::MlT2Large => "ml.t2.large",
            ProductionVariantInstanceType::MlT2Medium => "ml.t2.medium",
            ProductionVariantInstanceType::MlT2Xlarge => "ml.t2.xlarge",
            ProductionVariantInstanceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.c4.2xlarge",
            "ml.c4.4xlarge",
            "ml.c4.8xlarge",
            "ml.c4.large",
            "ml.c4.xlarge",
            "ml.c5.18xlarge",
            "ml.c5.2xlarge",
            "ml.c5.4xlarge",
            "ml.c5.9xlarge",
            "ml.c5.large",
            "ml.c5.xlarge",
            "ml.c5d.18xlarge",
            "ml.c5d.2xlarge",
            "ml.c5d.4xlarge",
            "ml.c5d.9xlarge",
            "ml.c5d.large",
            "ml.c5d.xlarge",
            "ml.c6g.12xlarge",
            "ml.c6g.16xlarge",
            "ml.c6g.2xlarge",
            "ml.c6g.4xlarge",
            "ml.c6g.8xlarge",
            "ml.c6g.large",
            "ml.c6g.xlarge",
            "ml.c6gd.12xlarge",
            "ml.c6gd.16xlarge",
            "ml.c6gd.2xlarge",
            "ml.c6gd.4xlarge",
            "ml.c6gd.8xlarge",
            "ml.c6gd.large",
            "ml.c6gd.xlarge",
            "ml.c6gn.12xlarge",
            "ml.c6gn.16xlarge",
            "ml.c6gn.2xlarge",
            "ml.c6gn.4xlarge",
            "ml.c6gn.8xlarge",
            "ml.c6gn.large",
            "ml.c6gn.xlarge",
            "ml.c6i.12xlarge",
            "ml.c6i.16xlarge",
            "ml.c6i.24xlarge",
            "ml.c6i.2xlarge",
            "ml.c6i.32xlarge",
            "ml.c6i.4xlarge",
            "ml.c6i.8xlarge",
            "ml.c6i.large",
            "ml.c6i.xlarge",
            "ml.c7g.12xlarge",
            "ml.c7g.16xlarge",
            "ml.c7g.2xlarge",
            "ml.c7g.4xlarge",
            "ml.c7g.8xlarge",
            "ml.c7g.large",
            "ml.c7g.xlarge",
            "ml.g4dn.12xlarge",
            "ml.g4dn.16xlarge",
            "ml.g4dn.2xlarge",
            "ml.g4dn.4xlarge",
            "ml.g4dn.8xlarge",
            "ml.g4dn.xlarge",
            "ml.g5.12xlarge",
            "ml.g5.16xlarge",
            "ml.g5.24xlarge",
            "ml.g5.2xlarge",
            "ml.g5.48xlarge",
            "ml.g5.4xlarge",
            "ml.g5.8xlarge",
            "ml.g5.xlarge",
            "ml.inf1.24xlarge",
            "ml.inf1.2xlarge",
            "ml.inf1.6xlarge",
            "ml.inf1.xlarge",
            "ml.m4.10xlarge",
            "ml.m4.16xlarge",
            "ml.m4.2xlarge",
            "ml.m4.4xlarge",
            "ml.m4.xlarge",
            "ml.m5.12xlarge",
            "ml.m5.24xlarge",
            "ml.m5.2xlarge",
            "ml.m5.4xlarge",
            "ml.m5.large",
            "ml.m5.xlarge",
            "ml.m5d.12xlarge",
            "ml.m5d.24xlarge",
            "ml.m5d.2xlarge",
            "ml.m5d.4xlarge",
            "ml.m5d.large",
            "ml.m5d.xlarge",
            "ml.m6g.12xlarge",
            "ml.m6g.16xlarge",
            "ml.m6g.2xlarge",
            "ml.m6g.4xlarge",
            "ml.m6g.8xlarge",
            "ml.m6g.large",
            "ml.m6g.xlarge",
            "ml.m6gd.12xlarge",
            "ml.m6gd.16xlarge",
            "ml.m6gd.2xlarge",
            "ml.m6gd.4xlarge",
            "ml.m6gd.8xlarge",
            "ml.m6gd.large",
            "ml.m6gd.xlarge",
            "ml.p2.16xlarge",
            "ml.p2.8xlarge",
            "ml.p2.xlarge",
            "ml.p3.16xlarge",
            "ml.p3.2xlarge",
            "ml.p3.8xlarge",
            "ml.p4d.24xlarge",
            "ml.p4de.24xlarge",
            "ml.r5.12xlarge",
            "ml.r5.24xlarge",
            "ml.r5.2xlarge",
            "ml.r5.4xlarge",
            "ml.r5.large",
            "ml.r5.xlarge",
            "ml.r5d.12xlarge",
            "ml.r5d.24xlarge",
            "ml.r5d.2xlarge",
            "ml.r5d.4xlarge",
            "ml.r5d.large",
            "ml.r5d.xlarge",
            "ml.r6g.12xlarge",
            "ml.r6g.16xlarge",
            "ml.r6g.2xlarge",
            "ml.r6g.4xlarge",
            "ml.r6g.8xlarge",
            "ml.r6g.large",
            "ml.r6g.xlarge",
            "ml.r6gd.12xlarge",
            "ml.r6gd.16xlarge",
            "ml.r6gd.2xlarge",
            "ml.r6gd.4xlarge",
            "ml.r6gd.8xlarge",
            "ml.r6gd.large",
            "ml.r6gd.xlarge",
            "ml.t2.2xlarge",
            "ml.t2.large",
            "ml.t2.medium",
            "ml.t2.xlarge",
        ]
    }
}
impl AsRef<str> for ProductionVariantInstanceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TransformInstanceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let transforminstancetype = unimplemented!();
/// match transforminstancetype {
///     TransformInstanceType::MlC42Xlarge => { /* ... */ },
///     TransformInstanceType::MlC44Xlarge => { /* ... */ },
///     TransformInstanceType::MlC48Xlarge => { /* ... */ },
///     TransformInstanceType::MlC4Xlarge => { /* ... */ },
///     TransformInstanceType::MlC518Xlarge => { /* ... */ },
///     TransformInstanceType::MlC52Xlarge => { /* ... */ },
///     TransformInstanceType::MlC54Xlarge => { /* ... */ },
///     TransformInstanceType::MlC59Xlarge => { /* ... */ },
///     TransformInstanceType::MlC5Xlarge => { /* ... */ },
///     TransformInstanceType::MlG4Dn12Xlarge => { /* ... */ },
///     TransformInstanceType::MlG4Dn16Xlarge => { /* ... */ },
///     TransformInstanceType::MlG4Dn2Xlarge => { /* ... */ },
///     TransformInstanceType::MlG4Dn4Xlarge => { /* ... */ },
///     TransformInstanceType::MlG4Dn8Xlarge => { /* ... */ },
///     TransformInstanceType::MlG4DnXlarge => { /* ... */ },
///     TransformInstanceType::MlM410Xlarge => { /* ... */ },
///     TransformInstanceType::MlM416Xlarge => { /* ... */ },
///     TransformInstanceType::MlM42Xlarge => { /* ... */ },
///     TransformInstanceType::MlM44Xlarge => { /* ... */ },
///     TransformInstanceType::MlM4Xlarge => { /* ... */ },
///     TransformInstanceType::MlM512Xlarge => { /* ... */ },
///     TransformInstanceType::MlM524Xlarge => { /* ... */ },
///     TransformInstanceType::MlM52Xlarge => { /* ... */ },
///     TransformInstanceType::MlM54Xlarge => { /* ... */ },
///     TransformInstanceType::MlM5Large => { /* ... */ },
///     TransformInstanceType::MlM5Xlarge => { /* ... */ },
///     TransformInstanceType::MlP216Xlarge => { /* ... */ },
///     TransformInstanceType::MlP28Xlarge => { /* ... */ },
///     TransformInstanceType::MlP2Xlarge => { /* ... */ },
///     TransformInstanceType::MlP316Xlarge => { /* ... */ },
///     TransformInstanceType::MlP32Xlarge => { /* ... */ },
///     TransformInstanceType::MlP38Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `transforminstancetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TransformInstanceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TransformInstanceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TransformInstanceType::NewFeature` is defined.
/// Specifically, when `transforminstancetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TransformInstanceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TransformInstanceType {
    #[allow(missing_docs)] // documentation missing in model
    MlC42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC48Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC518Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC59Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4DnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM410Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM416Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP216Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP28Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP316Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP38Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TransformInstanceType {
    fn from(s: &str) -> Self {
        match s {
            "ml.c4.2xlarge" => TransformInstanceType::MlC42Xlarge,
            "ml.c4.4xlarge" => TransformInstanceType::MlC44Xlarge,
            "ml.c4.8xlarge" => TransformInstanceType::MlC48Xlarge,
            "ml.c4.xlarge" => TransformInstanceType::MlC4Xlarge,
            "ml.c5.18xlarge" => TransformInstanceType::MlC518Xlarge,
            "ml.c5.2xlarge" => TransformInstanceType::MlC52Xlarge,
            "ml.c5.4xlarge" => TransformInstanceType::MlC54Xlarge,
            "ml.c5.9xlarge" => TransformInstanceType::MlC59Xlarge,
            "ml.c5.xlarge" => TransformInstanceType::MlC5Xlarge,
            "ml.g4dn.12xlarge" => TransformInstanceType::MlG4Dn12Xlarge,
            "ml.g4dn.16xlarge" => TransformInstanceType::MlG4Dn16Xlarge,
            "ml.g4dn.2xlarge" => TransformInstanceType::MlG4Dn2Xlarge,
            "ml.g4dn.4xlarge" => TransformInstanceType::MlG4Dn4Xlarge,
            "ml.g4dn.8xlarge" => TransformInstanceType::MlG4Dn8Xlarge,
            "ml.g4dn.xlarge" => TransformInstanceType::MlG4DnXlarge,
            "ml.m4.10xlarge" => TransformInstanceType::MlM410Xlarge,
            "ml.m4.16xlarge" => TransformInstanceType::MlM416Xlarge,
            "ml.m4.2xlarge" => TransformInstanceType::MlM42Xlarge,
            "ml.m4.4xlarge" => TransformInstanceType::MlM44Xlarge,
            "ml.m4.xlarge" => TransformInstanceType::MlM4Xlarge,
            "ml.m5.12xlarge" => TransformInstanceType::MlM512Xlarge,
            "ml.m5.24xlarge" => TransformInstanceType::MlM524Xlarge,
            "ml.m5.2xlarge" => TransformInstanceType::MlM52Xlarge,
            "ml.m5.4xlarge" => TransformInstanceType::MlM54Xlarge,
            "ml.m5.large" => TransformInstanceType::MlM5Large,
            "ml.m5.xlarge" => TransformInstanceType::MlM5Xlarge,
            "ml.p2.16xlarge" => TransformInstanceType::MlP216Xlarge,
            "ml.p2.8xlarge" => TransformInstanceType::MlP28Xlarge,
            "ml.p2.xlarge" => TransformInstanceType::MlP2Xlarge,
            "ml.p3.16xlarge" => TransformInstanceType::MlP316Xlarge,
            "ml.p3.2xlarge" => TransformInstanceType::MlP32Xlarge,
            "ml.p3.8xlarge" => TransformInstanceType::MlP38Xlarge,
            other => {
                TransformInstanceType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for TransformInstanceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TransformInstanceType::from(s))
    }
}
impl TransformInstanceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TransformInstanceType::MlC42Xlarge => "ml.c4.2xlarge",
            TransformInstanceType::MlC44Xlarge => "ml.c4.4xlarge",
            TransformInstanceType::MlC48Xlarge => "ml.c4.8xlarge",
            TransformInstanceType::MlC4Xlarge => "ml.c4.xlarge",
            TransformInstanceType::MlC518Xlarge => "ml.c5.18xlarge",
            TransformInstanceType::MlC52Xlarge => "ml.c5.2xlarge",
            TransformInstanceType::MlC54Xlarge => "ml.c5.4xlarge",
            TransformInstanceType::MlC59Xlarge => "ml.c5.9xlarge",
            TransformInstanceType::MlC5Xlarge => "ml.c5.xlarge",
            TransformInstanceType::MlG4Dn12Xlarge => "ml.g4dn.12xlarge",
            TransformInstanceType::MlG4Dn16Xlarge => "ml.g4dn.16xlarge",
            TransformInstanceType::MlG4Dn2Xlarge => "ml.g4dn.2xlarge",
            TransformInstanceType::MlG4Dn4Xlarge => "ml.g4dn.4xlarge",
            TransformInstanceType::MlG4Dn8Xlarge => "ml.g4dn.8xlarge",
            TransformInstanceType::MlG4DnXlarge => "ml.g4dn.xlarge",
            TransformInstanceType::MlM410Xlarge => "ml.m4.10xlarge",
            TransformInstanceType::MlM416Xlarge => "ml.m4.16xlarge",
            TransformInstanceType::MlM42Xlarge => "ml.m4.2xlarge",
            TransformInstanceType::MlM44Xlarge => "ml.m4.4xlarge",
            TransformInstanceType::MlM4Xlarge => "ml.m4.xlarge",
            TransformInstanceType::MlM512Xlarge => "ml.m5.12xlarge",
            TransformInstanceType::MlM524Xlarge => "ml.m5.24xlarge",
            TransformInstanceType::MlM52Xlarge => "ml.m5.2xlarge",
            TransformInstanceType::MlM54Xlarge => "ml.m5.4xlarge",
            TransformInstanceType::MlM5Large => "ml.m5.large",
            TransformInstanceType::MlM5Xlarge => "ml.m5.xlarge",
            TransformInstanceType::MlP216Xlarge => "ml.p2.16xlarge",
            TransformInstanceType::MlP28Xlarge => "ml.p2.8xlarge",
            TransformInstanceType::MlP2Xlarge => "ml.p2.xlarge",
            TransformInstanceType::MlP316Xlarge => "ml.p3.16xlarge",
            TransformInstanceType::MlP32Xlarge => "ml.p3.2xlarge",
            TransformInstanceType::MlP38Xlarge => "ml.p3.8xlarge",
            TransformInstanceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.c4.2xlarge",
            "ml.c4.4xlarge",
            "ml.c4.8xlarge",
            "ml.c4.xlarge",
            "ml.c5.18xlarge",
            "ml.c5.2xlarge",
            "ml.c5.4xlarge",
            "ml.c5.9xlarge",
            "ml.c5.xlarge",
            "ml.g4dn.12xlarge",
            "ml.g4dn.16xlarge",
            "ml.g4dn.2xlarge",
            "ml.g4dn.4xlarge",
            "ml.g4dn.8xlarge",
            "ml.g4dn.xlarge",
            "ml.m4.10xlarge",
            "ml.m4.16xlarge",
            "ml.m4.2xlarge",
            "ml.m4.4xlarge",
            "ml.m4.xlarge",
            "ml.m5.12xlarge",
            "ml.m5.24xlarge",
            "ml.m5.2xlarge",
            "ml.m5.4xlarge",
            "ml.m5.large",
            "ml.m5.xlarge",
            "ml.p2.16xlarge",
            "ml.p2.8xlarge",
            "ml.p2.xlarge",
            "ml.p3.16xlarge",
            "ml.p3.2xlarge",
            "ml.p3.8xlarge",
        ]
    }
}
impl AsRef<str> for TransformInstanceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the Docker container for the model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageContainerDefinition {
    /// <p>The DNS host name for the Docker container.</p>
    #[doc(hidden)]
    pub container_hostname: std::option::Option<std::string::String>,
    /// <p>The Amazon EC2 Container Registry (Amazon ECR) path where inference code is stored.</p>
    /// <p>If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
    #[doc(hidden)]
    pub image: std::option::Option<std::string::String>,
    /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
    #[doc(hidden)]
    pub image_digest: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
    /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model package.</p>
    /// </note>
    #[doc(hidden)]
    pub model_data_url: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Marketplace product ID of the model package.</p>
    #[doc(hidden)]
    pub product_id: std::option::Option<std::string::String>,
    /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>A structure with Model Input details.</p>
    #[doc(hidden)]
    pub model_input: std::option::Option<crate::model::ModelInput>,
    /// <p>The machine learning framework of the model package container image.</p>
    #[doc(hidden)]
    pub framework: std::option::Option<std::string::String>,
    /// <p>The framework version of the Model Package Container Image.</p>
    #[doc(hidden)]
    pub framework_version: std::option::Option<std::string::String>,
    /// <p>The name of a pre-trained machine learning benchmarked by Amazon SageMaker Inference Recommender model that matches your model. You can find a list of benchmarked models by calling <code>ListModelMetadata</code>.</p>
    #[doc(hidden)]
    pub nearest_model_name: std::option::Option<std::string::String>,
}
impl ModelPackageContainerDefinition {
    /// <p>The DNS host name for the Docker container.</p>
    pub fn container_hostname(&self) -> std::option::Option<&str> {
        self.container_hostname.as_deref()
    }
    /// <p>The Amazon EC2 Container Registry (Amazon ECR) path where inference code is stored.</p>
    /// <p>If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
    pub fn image(&self) -> std::option::Option<&str> {
        self.image.as_deref()
    }
    /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
    pub fn image_digest(&self) -> std::option::Option<&str> {
        self.image_digest.as_deref()
    }
    /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
    /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model package.</p>
    /// </note>
    pub fn model_data_url(&self) -> std::option::Option<&str> {
        self.model_data_url.as_deref()
    }
    /// <p>The Amazon Web Services Marketplace product ID of the model package.</p>
    pub fn product_id(&self) -> std::option::Option<&str> {
        self.product_id.as_deref()
    }
    /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>A structure with Model Input details.</p>
    pub fn model_input(&self) -> std::option::Option<&crate::model::ModelInput> {
        self.model_input.as_ref()
    }
    /// <p>The machine learning framework of the model package container image.</p>
    pub fn framework(&self) -> std::option::Option<&str> {
        self.framework.as_deref()
    }
    /// <p>The framework version of the Model Package Container Image.</p>
    pub fn framework_version(&self) -> std::option::Option<&str> {
        self.framework_version.as_deref()
    }
    /// <p>The name of a pre-trained machine learning benchmarked by Amazon SageMaker Inference Recommender model that matches your model. You can find a list of benchmarked models by calling <code>ListModelMetadata</code>.</p>
    pub fn nearest_model_name(&self) -> std::option::Option<&str> {
        self.nearest_model_name.as_deref()
    }
}
/// See [`ModelPackageContainerDefinition`](crate::model::ModelPackageContainerDefinition).
pub mod model_package_container_definition {

    /// A builder for [`ModelPackageContainerDefinition`](crate::model::ModelPackageContainerDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) container_hostname: std::option::Option<std::string::String>,
        pub(crate) image: std::option::Option<std::string::String>,
        pub(crate) image_digest: std::option::Option<std::string::String>,
        pub(crate) model_data_url: std::option::Option<std::string::String>,
        pub(crate) product_id: std::option::Option<std::string::String>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) model_input: std::option::Option<crate::model::ModelInput>,
        pub(crate) framework: std::option::Option<std::string::String>,
        pub(crate) framework_version: std::option::Option<std::string::String>,
        pub(crate) nearest_model_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The DNS host name for the Docker container.</p>
        pub fn container_hostname(mut self, input: impl Into<std::string::String>) -> Self {
            self.container_hostname = Some(input.into());
            self
        }
        /// <p>The DNS host name for the Docker container.</p>
        pub fn set_container_hostname(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.container_hostname = input;
            self
        }
        /// <p>The Amazon EC2 Container Registry (Amazon ECR) path where inference code is stored.</p>
        /// <p>If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
        pub fn image(mut self, input: impl Into<std::string::String>) -> Self {
            self.image = Some(input.into());
            self
        }
        /// <p>The Amazon EC2 Container Registry (Amazon ECR) path where inference code is stored.</p>
        /// <p>If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
        pub fn set_image(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image = input;
            self
        }
        /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
        pub fn image_digest(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_digest = Some(input.into());
            self
        }
        /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
        pub fn set_image_digest(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_digest = input;
            self
        }
        /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
        /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model package.</p>
        /// </note>
        pub fn model_data_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_data_url = Some(input.into());
            self
        }
        /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
        /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model package.</p>
        /// </note>
        pub fn set_model_data_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_data_url = input;
            self
        }
        /// <p>The Amazon Web Services Marketplace product ID of the model package.</p>
        pub fn product_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.product_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Marketplace product ID of the model package.</p>
        pub fn set_product_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.product_id = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>A structure with Model Input details.</p>
        pub fn model_input(mut self, input: crate::model::ModelInput) -> Self {
            self.model_input = Some(input);
            self
        }
        /// <p>A structure with Model Input details.</p>
        pub fn set_model_input(
            mut self,
            input: std::option::Option<crate::model::ModelInput>,
        ) -> Self {
            self.model_input = input;
            self
        }
        /// <p>The machine learning framework of the model package container image.</p>
        pub fn framework(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework = Some(input.into());
            self
        }
        /// <p>The machine learning framework of the model package container image.</p>
        pub fn set_framework(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.framework = input;
            self
        }
        /// <p>The framework version of the Model Package Container Image.</p>
        pub fn framework_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework_version = Some(input.into());
            self
        }
        /// <p>The framework version of the Model Package Container Image.</p>
        pub fn set_framework_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.framework_version = input;
            self
        }
        /// <p>The name of a pre-trained machine learning benchmarked by Amazon SageMaker Inference Recommender model that matches your model. You can find a list of benchmarked models by calling <code>ListModelMetadata</code>.</p>
        pub fn nearest_model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.nearest_model_name = Some(input.into());
            self
        }
        /// <p>The name of a pre-trained machine learning benchmarked by Amazon SageMaker Inference Recommender model that matches your model. You can find a list of benchmarked models by calling <code>ListModelMetadata</code>.</p>
        pub fn set_nearest_model_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.nearest_model_name = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageContainerDefinition`](crate::model::ModelPackageContainerDefinition).
        pub fn build(self) -> crate::model::ModelPackageContainerDefinition {
            crate::model::ModelPackageContainerDefinition {
                container_hostname: self.container_hostname,
                image: self.image,
                image_digest: self.image_digest,
                model_data_url: self.model_data_url,
                product_id: self.product_id,
                environment: self.environment,
                model_input: self.model_input,
                framework: self.framework,
                framework_version: self.framework_version,
                nearest_model_name: self.nearest_model_name,
            }
        }
    }
}
impl ModelPackageContainerDefinition {
    /// Creates a new builder-style object to manufacture [`ModelPackageContainerDefinition`](crate::model::ModelPackageContainerDefinition).
    pub fn builder() -> crate::model::model_package_container_definition::Builder {
        crate::model::model_package_container_definition::Builder::default()
    }
}

/// <p>Input object for the model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelInput {
    /// <p>The input configuration object for the model.</p>
    #[doc(hidden)]
    pub data_input_config: std::option::Option<std::string::String>,
}
impl ModelInput {
    /// <p>The input configuration object for the model.</p>
    pub fn data_input_config(&self) -> std::option::Option<&str> {
        self.data_input_config.as_deref()
    }
}
/// See [`ModelInput`](crate::model::ModelInput).
pub mod model_input {

    /// A builder for [`ModelInput`](crate::model::ModelInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) data_input_config: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The input configuration object for the model.</p>
        pub fn data_input_config(mut self, input: impl Into<std::string::String>) -> Self {
            self.data_input_config = Some(input.into());
            self
        }
        /// <p>The input configuration object for the model.</p>
        pub fn set_data_input_config(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.data_input_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelInput`](crate::model::ModelInput).
        pub fn build(self) -> crate::model::ModelInput {
            crate::model::ModelInput {
                data_input_config: self.data_input_config,
            }
        }
    }
}
impl ModelInput {
    /// Creates a new builder-style object to manufacture [`ModelInput`](crate::model::ModelInput).
    pub fn builder() -> crate::model::model_input::Builder {
        crate::model::model_input::Builder::default()
    }
}

/// When writing a match expression against `ModelApprovalStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelapprovalstatus = unimplemented!();
/// match modelapprovalstatus {
///     ModelApprovalStatus::Approved => { /* ... */ },
///     ModelApprovalStatus::PendingManualApproval => { /* ... */ },
///     ModelApprovalStatus::Rejected => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelapprovalstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelApprovalStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelApprovalStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelApprovalStatus::NewFeature` is defined.
/// Specifically, when `modelapprovalstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelApprovalStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelApprovalStatus {
    #[allow(missing_docs)] // documentation missing in model
    Approved,
    #[allow(missing_docs)] // documentation missing in model
    PendingManualApproval,
    #[allow(missing_docs)] // documentation missing in model
    Rejected,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelApprovalStatus {
    fn from(s: &str) -> Self {
        match s {
            "Approved" => ModelApprovalStatus::Approved,
            "PendingManualApproval" => ModelApprovalStatus::PendingManualApproval,
            "Rejected" => ModelApprovalStatus::Rejected,
            other => {
                ModelApprovalStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelApprovalStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelApprovalStatus::from(s))
    }
}
impl ModelApprovalStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelApprovalStatus::Approved => "Approved",
            ModelApprovalStatus::PendingManualApproval => "PendingManualApproval",
            ModelApprovalStatus::Rejected => "Rejected",
            ModelApprovalStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Approved", "PendingManualApproval", "Rejected"]
    }
}
impl AsRef<str> for ModelApprovalStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelCardStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardstatus = unimplemented!();
/// match modelcardstatus {
///     ModelCardStatus::Approved => { /* ... */ },
///     ModelCardStatus::Archived => { /* ... */ },
///     ModelCardStatus::Draft => { /* ... */ },
///     ModelCardStatus::Pendingreview => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardStatus::NewFeature` is defined.
/// Specifically, when `modelcardstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardStatus {
    #[allow(missing_docs)] // documentation missing in model
    Approved,
    #[allow(missing_docs)] // documentation missing in model
    Archived,
    #[allow(missing_docs)] // documentation missing in model
    Draft,
    #[allow(missing_docs)] // documentation missing in model
    Pendingreview,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardStatus {
    fn from(s: &str) -> Self {
        match s {
            "Approved" => ModelCardStatus::Approved,
            "Archived" => ModelCardStatus::Archived,
            "Draft" => ModelCardStatus::Draft,
            "PendingReview" => ModelCardStatus::Pendingreview,
            other => ModelCardStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ModelCardStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardStatus::from(s))
    }
}
impl ModelCardStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardStatus::Approved => "Approved",
            ModelCardStatus::Archived => "Archived",
            ModelCardStatus::Draft => "Draft",
            ModelCardStatus::Pendingreview => "PendingReview",
            ModelCardStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Approved", "Archived", "Draft", "PendingReview"]
    }
}
impl AsRef<str> for ModelCardStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p> The configuration of <code>ShadowMode</code> inference experiment type, which specifies a production variant to take all the inference requests, and a shadow variant to which Amazon SageMaker replicates a percentage of the inference requests. For the shadow variant it also specifies the percentage of requests that Amazon SageMaker replicates. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ShadowModeConfig {
    /// <p> The name of the production variant, which takes all the inference requests. </p>
    #[doc(hidden)]
    pub source_model_variant_name: std::option::Option<std::string::String>,
    /// <p>List of shadow variant configurations.</p>
    #[doc(hidden)]
    pub shadow_model_variants:
        std::option::Option<std::vec::Vec<crate::model::ShadowModelVariantConfig>>,
}
impl ShadowModeConfig {
    /// <p> The name of the production variant, which takes all the inference requests. </p>
    pub fn source_model_variant_name(&self) -> std::option::Option<&str> {
        self.source_model_variant_name.as_deref()
    }
    /// <p>List of shadow variant configurations.</p>
    pub fn shadow_model_variants(
        &self,
    ) -> std::option::Option<&[crate::model::ShadowModelVariantConfig]> {
        self.shadow_model_variants.as_deref()
    }
}
/// See [`ShadowModeConfig`](crate::model::ShadowModeConfig).
pub mod shadow_mode_config {

    /// A builder for [`ShadowModeConfig`](crate::model::ShadowModeConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_model_variant_name: std::option::Option<std::string::String>,
        pub(crate) shadow_model_variants:
            std::option::Option<std::vec::Vec<crate::model::ShadowModelVariantConfig>>,
    }
    impl Builder {
        /// <p> The name of the production variant, which takes all the inference requests. </p>
        pub fn source_model_variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_model_variant_name = Some(input.into());
            self
        }
        /// <p> The name of the production variant, which takes all the inference requests. </p>
        pub fn set_source_model_variant_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.source_model_variant_name = input;
            self
        }
        /// Appends an item to `shadow_model_variants`.
        ///
        /// To override the contents of this collection use [`set_shadow_model_variants`](Self::set_shadow_model_variants).
        ///
        /// <p>List of shadow variant configurations.</p>
        pub fn shadow_model_variants(
            mut self,
            input: crate::model::ShadowModelVariantConfig,
        ) -> Self {
            let mut v = self.shadow_model_variants.unwrap_or_default();
            v.push(input);
            self.shadow_model_variants = Some(v);
            self
        }
        /// <p>List of shadow variant configurations.</p>
        pub fn set_shadow_model_variants(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ShadowModelVariantConfig>>,
        ) -> Self {
            self.shadow_model_variants = input;
            self
        }
        /// Consumes the builder and constructs a [`ShadowModeConfig`](crate::model::ShadowModeConfig).
        pub fn build(self) -> crate::model::ShadowModeConfig {
            crate::model::ShadowModeConfig {
                source_model_variant_name: self.source_model_variant_name,
                shadow_model_variants: self.shadow_model_variants,
            }
        }
    }
}
impl ShadowModeConfig {
    /// Creates a new builder-style object to manufacture [`ShadowModeConfig`](crate::model::ShadowModeConfig).
    pub fn builder() -> crate::model::shadow_mode_config::Builder {
        crate::model::shadow_mode_config::Builder::default()
    }
}

/// <p>The name and sampling percentage of a shadow variant.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ShadowModelVariantConfig {
    /// <p>The name of the shadow variant.</p>
    #[doc(hidden)]
    pub shadow_model_variant_name: std::option::Option<std::string::String>,
    /// <p> The percentage of inference requests that Amazon SageMaker replicates from the production variant to the shadow variant. </p>
    #[doc(hidden)]
    pub sampling_percentage: i32,
}
impl ShadowModelVariantConfig {
    /// <p>The name of the shadow variant.</p>
    pub fn shadow_model_variant_name(&self) -> std::option::Option<&str> {
        self.shadow_model_variant_name.as_deref()
    }
    /// <p> The percentage of inference requests that Amazon SageMaker replicates from the production variant to the shadow variant. </p>
    pub fn sampling_percentage(&self) -> i32 {
        self.sampling_percentage
    }
}
/// See [`ShadowModelVariantConfig`](crate::model::ShadowModelVariantConfig).
pub mod shadow_model_variant_config {

    /// A builder for [`ShadowModelVariantConfig`](crate::model::ShadowModelVariantConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) shadow_model_variant_name: std::option::Option<std::string::String>,
        pub(crate) sampling_percentage: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The name of the shadow variant.</p>
        pub fn shadow_model_variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.shadow_model_variant_name = Some(input.into());
            self
        }
        /// <p>The name of the shadow variant.</p>
        pub fn set_shadow_model_variant_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.shadow_model_variant_name = input;
            self
        }
        /// <p> The percentage of inference requests that Amazon SageMaker replicates from the production variant to the shadow variant. </p>
        pub fn sampling_percentage(mut self, input: i32) -> Self {
            self.sampling_percentage = Some(input);
            self
        }
        /// <p> The percentage of inference requests that Amazon SageMaker replicates from the production variant to the shadow variant. </p>
        pub fn set_sampling_percentage(mut self, input: std::option::Option<i32>) -> Self {
            self.sampling_percentage = input;
            self
        }
        /// Consumes the builder and constructs a [`ShadowModelVariantConfig`](crate::model::ShadowModelVariantConfig).
        pub fn build(self) -> crate::model::ShadowModelVariantConfig {
            crate::model::ShadowModelVariantConfig {
                shadow_model_variant_name: self.shadow_model_variant_name,
                sampling_percentage: self.sampling_percentage.unwrap_or_default(),
            }
        }
    }
}
impl ShadowModelVariantConfig {
    /// Creates a new builder-style object to manufacture [`ShadowModelVariantConfig`](crate::model::ShadowModelVariantConfig).
    pub fn builder() -> crate::model::shadow_model_variant_config::Builder {
        crate::model::shadow_model_variant_config::Builder::default()
    }
}

/// <p>The Amazon S3 location and configuration for storing inference request and response data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceExperimentDataStorageConfig {
    /// <p>The Amazon S3 bucket where the inference request and response data is stored. </p>
    #[doc(hidden)]
    pub destination: std::option::Option<std::string::String>,
    /// <p> The Amazon Web Services Key Management Service key that Amazon SageMaker uses to encrypt captured data at rest using Amazon S3 server-side encryption. </p>
    #[doc(hidden)]
    pub kms_key: std::option::Option<std::string::String>,
    /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
    #[doc(hidden)]
    pub content_type: std::option::Option<crate::model::CaptureContentTypeHeader>,
}
impl InferenceExperimentDataStorageConfig {
    /// <p>The Amazon S3 bucket where the inference request and response data is stored. </p>
    pub fn destination(&self) -> std::option::Option<&str> {
        self.destination.as_deref()
    }
    /// <p> The Amazon Web Services Key Management Service key that Amazon SageMaker uses to encrypt captured data at rest using Amazon S3 server-side encryption. </p>
    pub fn kms_key(&self) -> std::option::Option<&str> {
        self.kms_key.as_deref()
    }
    /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
    pub fn content_type(&self) -> std::option::Option<&crate::model::CaptureContentTypeHeader> {
        self.content_type.as_ref()
    }
}
/// See [`InferenceExperimentDataStorageConfig`](crate::model::InferenceExperimentDataStorageConfig).
pub mod inference_experiment_data_storage_config {

    /// A builder for [`InferenceExperimentDataStorageConfig`](crate::model::InferenceExperimentDataStorageConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) destination: std::option::Option<std::string::String>,
        pub(crate) kms_key: std::option::Option<std::string::String>,
        pub(crate) content_type: std::option::Option<crate::model::CaptureContentTypeHeader>,
    }
    impl Builder {
        /// <p>The Amazon S3 bucket where the inference request and response data is stored. </p>
        pub fn destination(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination = Some(input.into());
            self
        }
        /// <p>The Amazon S3 bucket where the inference request and response data is stored. </p>
        pub fn set_destination(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.destination = input;
            self
        }
        /// <p> The Amazon Web Services Key Management Service key that Amazon SageMaker uses to encrypt captured data at rest using Amazon S3 server-side encryption. </p>
        pub fn kms_key(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key = Some(input.into());
            self
        }
        /// <p> The Amazon Web Services Key Management Service key that Amazon SageMaker uses to encrypt captured data at rest using Amazon S3 server-side encryption. </p>
        pub fn set_kms_key(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key = input;
            self
        }
        /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
        pub fn content_type(mut self, input: crate::model::CaptureContentTypeHeader) -> Self {
            self.content_type = Some(input);
            self
        }
        /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
        pub fn set_content_type(
            mut self,
            input: std::option::Option<crate::model::CaptureContentTypeHeader>,
        ) -> Self {
            self.content_type = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceExperimentDataStorageConfig`](crate::model::InferenceExperimentDataStorageConfig).
        pub fn build(self) -> crate::model::InferenceExperimentDataStorageConfig {
            crate::model::InferenceExperimentDataStorageConfig {
                destination: self.destination,
                kms_key: self.kms_key,
                content_type: self.content_type,
            }
        }
    }
}
impl InferenceExperimentDataStorageConfig {
    /// Creates a new builder-style object to manufacture [`InferenceExperimentDataStorageConfig`](crate::model::InferenceExperimentDataStorageConfig).
    pub fn builder() -> crate::model::inference_experiment_data_storage_config::Builder {
        crate::model::inference_experiment_data_storage_config::Builder::default()
    }
}

/// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CaptureContentTypeHeader {
    /// <p>The list of all content type headers that SageMaker will treat as CSV and capture accordingly.</p>
    #[doc(hidden)]
    pub csv_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The list of all content type headers that SageMaker will treat as JSON and capture accordingly.</p>
    #[doc(hidden)]
    pub json_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl CaptureContentTypeHeader {
    /// <p>The list of all content type headers that SageMaker will treat as CSV and capture accordingly.</p>
    pub fn csv_content_types(&self) -> std::option::Option<&[std::string::String]> {
        self.csv_content_types.as_deref()
    }
    /// <p>The list of all content type headers that SageMaker will treat as JSON and capture accordingly.</p>
    pub fn json_content_types(&self) -> std::option::Option<&[std::string::String]> {
        self.json_content_types.as_deref()
    }
}
/// See [`CaptureContentTypeHeader`](crate::model::CaptureContentTypeHeader).
pub mod capture_content_type_header {

    /// A builder for [`CaptureContentTypeHeader`](crate::model::CaptureContentTypeHeader).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) csv_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) json_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `csv_content_types`.
        ///
        /// To override the contents of this collection use [`set_csv_content_types`](Self::set_csv_content_types).
        ///
        /// <p>The list of all content type headers that SageMaker will treat as CSV and capture accordingly.</p>
        pub fn csv_content_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.csv_content_types.unwrap_or_default();
            v.push(input.into());
            self.csv_content_types = Some(v);
            self
        }
        /// <p>The list of all content type headers that SageMaker will treat as CSV and capture accordingly.</p>
        pub fn set_csv_content_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.csv_content_types = input;
            self
        }
        /// Appends an item to `json_content_types`.
        ///
        /// To override the contents of this collection use [`set_json_content_types`](Self::set_json_content_types).
        ///
        /// <p>The list of all content type headers that SageMaker will treat as JSON and capture accordingly.</p>
        pub fn json_content_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.json_content_types.unwrap_or_default();
            v.push(input.into());
            self.json_content_types = Some(v);
            self
        }
        /// <p>The list of all content type headers that SageMaker will treat as JSON and capture accordingly.</p>
        pub fn set_json_content_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.json_content_types = input;
            self
        }
        /// Consumes the builder and constructs a [`CaptureContentTypeHeader`](crate::model::CaptureContentTypeHeader).
        pub fn build(self) -> crate::model::CaptureContentTypeHeader {
            crate::model::CaptureContentTypeHeader {
                csv_content_types: self.csv_content_types,
                json_content_types: self.json_content_types,
            }
        }
    }
}
impl CaptureContentTypeHeader {
    /// Creates a new builder-style object to manufacture [`CaptureContentTypeHeader`](crate::model::CaptureContentTypeHeader).
    pub fn builder() -> crate::model::capture_content_type_header::Builder {
        crate::model::capture_content_type_header::Builder::default()
    }
}

/// <p>Contains information about the deployment options of a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelVariantConfig {
    /// <p>The name of the Amazon SageMaker Model entity.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The name of the variant.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>The configuration for the infrastructure that the model will be deployed to.</p>
    #[doc(hidden)]
    pub infrastructure_config: std::option::Option<crate::model::ModelInfrastructureConfig>,
}
impl ModelVariantConfig {
    /// <p>The name of the Amazon SageMaker Model entity.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The name of the variant.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>The configuration for the infrastructure that the model will be deployed to.</p>
    pub fn infrastructure_config(
        &self,
    ) -> std::option::Option<&crate::model::ModelInfrastructureConfig> {
        self.infrastructure_config.as_ref()
    }
}
/// See [`ModelVariantConfig`](crate::model::ModelVariantConfig).
pub mod model_variant_config {

    /// A builder for [`ModelVariantConfig`](crate::model::ModelVariantConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) infrastructure_config:
            std::option::Option<crate::model::ModelInfrastructureConfig>,
    }
    impl Builder {
        /// <p>The name of the Amazon SageMaker Model entity.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the Amazon SageMaker Model entity.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The name of the variant.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the variant.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// <p>The configuration for the infrastructure that the model will be deployed to.</p>
        pub fn infrastructure_config(
            mut self,
            input: crate::model::ModelInfrastructureConfig,
        ) -> Self {
            self.infrastructure_config = Some(input);
            self
        }
        /// <p>The configuration for the infrastructure that the model will be deployed to.</p>
        pub fn set_infrastructure_config(
            mut self,
            input: std::option::Option<crate::model::ModelInfrastructureConfig>,
        ) -> Self {
            self.infrastructure_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelVariantConfig`](crate::model::ModelVariantConfig).
        pub fn build(self) -> crate::model::ModelVariantConfig {
            crate::model::ModelVariantConfig {
                model_name: self.model_name,
                variant_name: self.variant_name,
                infrastructure_config: self.infrastructure_config,
            }
        }
    }
}
impl ModelVariantConfig {
    /// Creates a new builder-style object to manufacture [`ModelVariantConfig`](crate::model::ModelVariantConfig).
    pub fn builder() -> crate::model::model_variant_config::Builder {
        crate::model::model_variant_config::Builder::default()
    }
}

/// <p>The configuration for the infrastructure that the model will be deployed to.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelInfrastructureConfig {
    /// <p>The inference option to which to deploy your model. Possible values are the following:</p>
    /// <ul>
    /// <li> <p> <code>RealTime</code>: Deploy to real-time inference.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub infrastructure_type: std::option::Option<crate::model::ModelInfrastructureType>,
    /// <p>The infrastructure configuration for deploying the model to real-time inference.</p>
    #[doc(hidden)]
    pub real_time_inference_config: std::option::Option<crate::model::RealTimeInferenceConfig>,
}
impl ModelInfrastructureConfig {
    /// <p>The inference option to which to deploy your model. Possible values are the following:</p>
    /// <ul>
    /// <li> <p> <code>RealTime</code>: Deploy to real-time inference.</p> </li>
    /// </ul>
    pub fn infrastructure_type(
        &self,
    ) -> std::option::Option<&crate::model::ModelInfrastructureType> {
        self.infrastructure_type.as_ref()
    }
    /// <p>The infrastructure configuration for deploying the model to real-time inference.</p>
    pub fn real_time_inference_config(
        &self,
    ) -> std::option::Option<&crate::model::RealTimeInferenceConfig> {
        self.real_time_inference_config.as_ref()
    }
}
/// See [`ModelInfrastructureConfig`](crate::model::ModelInfrastructureConfig).
pub mod model_infrastructure_config {

    /// A builder for [`ModelInfrastructureConfig`](crate::model::ModelInfrastructureConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) infrastructure_type: std::option::Option<crate::model::ModelInfrastructureType>,
        pub(crate) real_time_inference_config:
            std::option::Option<crate::model::RealTimeInferenceConfig>,
    }
    impl Builder {
        /// <p>The inference option to which to deploy your model. Possible values are the following:</p>
        /// <ul>
        /// <li> <p> <code>RealTime</code>: Deploy to real-time inference.</p> </li>
        /// </ul>
        pub fn infrastructure_type(mut self, input: crate::model::ModelInfrastructureType) -> Self {
            self.infrastructure_type = Some(input);
            self
        }
        /// <p>The inference option to which to deploy your model. Possible values are the following:</p>
        /// <ul>
        /// <li> <p> <code>RealTime</code>: Deploy to real-time inference.</p> </li>
        /// </ul>
        pub fn set_infrastructure_type(
            mut self,
            input: std::option::Option<crate::model::ModelInfrastructureType>,
        ) -> Self {
            self.infrastructure_type = input;
            self
        }
        /// <p>The infrastructure configuration for deploying the model to real-time inference.</p>
        pub fn real_time_inference_config(
            mut self,
            input: crate::model::RealTimeInferenceConfig,
        ) -> Self {
            self.real_time_inference_config = Some(input);
            self
        }
        /// <p>The infrastructure configuration for deploying the model to real-time inference.</p>
        pub fn set_real_time_inference_config(
            mut self,
            input: std::option::Option<crate::model::RealTimeInferenceConfig>,
        ) -> Self {
            self.real_time_inference_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelInfrastructureConfig`](crate::model::ModelInfrastructureConfig).
        pub fn build(self) -> crate::model::ModelInfrastructureConfig {
            crate::model::ModelInfrastructureConfig {
                infrastructure_type: self.infrastructure_type,
                real_time_inference_config: self.real_time_inference_config,
            }
        }
    }
}
impl ModelInfrastructureConfig {
    /// Creates a new builder-style object to manufacture [`ModelInfrastructureConfig`](crate::model::ModelInfrastructureConfig).
    pub fn builder() -> crate::model::model_infrastructure_config::Builder {
        crate::model::model_infrastructure_config::Builder::default()
    }
}

/// <p>The infrastructure configuration for deploying the model to a real-time inference endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RealTimeInferenceConfig {
    /// <p>The instance type the model is deployed to.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::InstanceType>,
    /// <p>The number of instances of the type specified by <code>InstanceType</code>.</p>
    #[doc(hidden)]
    pub instance_count: std::option::Option<i32>,
}
impl RealTimeInferenceConfig {
    /// <p>The instance type the model is deployed to.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::InstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The number of instances of the type specified by <code>InstanceType</code>.</p>
    pub fn instance_count(&self) -> std::option::Option<i32> {
        self.instance_count
    }
}
/// See [`RealTimeInferenceConfig`](crate::model::RealTimeInferenceConfig).
pub mod real_time_inference_config {

    /// A builder for [`RealTimeInferenceConfig`](crate::model::RealTimeInferenceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::InstanceType>,
        pub(crate) instance_count: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The instance type the model is deployed to.</p>
        pub fn instance_type(mut self, input: crate::model::InstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type the model is deployed to.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::InstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The number of instances of the type specified by <code>InstanceType</code>.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of instances of the type specified by <code>InstanceType</code>.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// Consumes the builder and constructs a [`RealTimeInferenceConfig`](crate::model::RealTimeInferenceConfig).
        pub fn build(self) -> crate::model::RealTimeInferenceConfig {
            crate::model::RealTimeInferenceConfig {
                instance_type: self.instance_type,
                instance_count: self.instance_count,
            }
        }
    }
}
impl RealTimeInferenceConfig {
    /// Creates a new builder-style object to manufacture [`RealTimeInferenceConfig`](crate::model::RealTimeInferenceConfig).
    pub fn builder() -> crate::model::real_time_inference_config::Builder {
        crate::model::real_time_inference_config::Builder::default()
    }
}

/// When writing a match expression against `ModelInfrastructureType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelinfrastructuretype = unimplemented!();
/// match modelinfrastructuretype {
///     ModelInfrastructureType::RealTimeInference => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelinfrastructuretype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelInfrastructureType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelInfrastructureType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelInfrastructureType::NewFeature` is defined.
/// Specifically, when `modelinfrastructuretype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelInfrastructureType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelInfrastructureType {
    #[allow(missing_docs)] // documentation missing in model
    RealTimeInference,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelInfrastructureType {
    fn from(s: &str) -> Self {
        match s {
            "RealTimeInference" => ModelInfrastructureType::RealTimeInference,
            other => ModelInfrastructureType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelInfrastructureType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelInfrastructureType::from(s))
    }
}
impl ModelInfrastructureType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelInfrastructureType::RealTimeInference => "RealTimeInference",
            ModelInfrastructureType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["RealTimeInference"]
    }
}
impl AsRef<str> for ModelInfrastructureType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The start and end times of an inference experiment.</p>
/// <p>The maximum duration that you can set for an inference experiment is 30 days.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceExperimentSchedule {
    /// <p>The timestamp at which the inference experiment started or will start.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The timestamp at which the inference experiment ended or will end.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl InferenceExperimentSchedule {
    /// <p>The timestamp at which the inference experiment started or will start.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>The timestamp at which the inference experiment ended or will end.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
}
/// See [`InferenceExperimentSchedule`](crate::model::InferenceExperimentSchedule).
pub mod inference_experiment_schedule {

    /// A builder for [`InferenceExperimentSchedule`](crate::model::InferenceExperimentSchedule).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The timestamp at which the inference experiment started or will start.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>The timestamp at which the inference experiment started or will start.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// <p>The timestamp at which the inference experiment ended or will end.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>The timestamp at which the inference experiment ended or will end.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceExperimentSchedule`](crate::model::InferenceExperimentSchedule).
        pub fn build(self) -> crate::model::InferenceExperimentSchedule {
            crate::model::InferenceExperimentSchedule {
                start_time: self.start_time,
                end_time: self.end_time,
            }
        }
    }
}
impl InferenceExperimentSchedule {
    /// Creates a new builder-style object to manufacture [`InferenceExperimentSchedule`](crate::model::InferenceExperimentSchedule).
    pub fn builder() -> crate::model::inference_experiment_schedule::Builder {
        crate::model::inference_experiment_schedule::Builder::default()
    }
}

/// When writing a match expression against `Processor`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processor = unimplemented!();
/// match processor {
///     Processor::Cpu => { /* ... */ },
///     Processor::Gpu => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processor` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `Processor::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `Processor::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `Processor::NewFeature` is defined.
/// Specifically, when `processor` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `Processor::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum Processor {
    #[allow(missing_docs)] // documentation missing in model
    Cpu,
    #[allow(missing_docs)] // documentation missing in model
    Gpu,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for Processor {
    fn from(s: &str) -> Self {
        match s {
            "CPU" => Processor::Cpu,
            "GPU" => Processor::Gpu,
            other => Processor::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for Processor {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(Processor::from(s))
    }
}
impl Processor {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            Processor::Cpu => "CPU",
            Processor::Gpu => "GPU",
            Processor::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CPU", "GPU"]
    }
}
impl AsRef<str> for Processor {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `JobType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let jobtype = unimplemented!();
/// match jobtype {
///     JobType::Inference => { /* ... */ },
///     JobType::NotebookKernel => { /* ... */ },
///     JobType::Training => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `jobtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `JobType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `JobType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `JobType::NewFeature` is defined.
/// Specifically, when `jobtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `JobType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum JobType {
    #[allow(missing_docs)] // documentation missing in model
    Inference,
    #[allow(missing_docs)] // documentation missing in model
    NotebookKernel,
    #[allow(missing_docs)] // documentation missing in model
    Training,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for JobType {
    fn from(s: &str) -> Self {
        match s {
            "INFERENCE" => JobType::Inference,
            "NOTEBOOK_KERNEL" => JobType::NotebookKernel,
            "TRAINING" => JobType::Training,
            other => JobType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for JobType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(JobType::from(s))
    }
}
impl JobType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            JobType::Inference => "INFERENCE",
            JobType::NotebookKernel => "NOTEBOOK_KERNEL",
            JobType::Training => "TRAINING",
            JobType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["INFERENCE", "NOTEBOOK_KERNEL", "TRAINING"]
    }
}
impl AsRef<str> for JobType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `VendorGuidance`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let vendorguidance = unimplemented!();
/// match vendorguidance {
///     VendorGuidance::Archived => { /* ... */ },
///     VendorGuidance::NotProvided => { /* ... */ },
///     VendorGuidance::Stable => { /* ... */ },
///     VendorGuidance::ToBeArchived => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `vendorguidance` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `VendorGuidance::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `VendorGuidance::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `VendorGuidance::NewFeature` is defined.
/// Specifically, when `vendorguidance` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `VendorGuidance::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum VendorGuidance {
    #[allow(missing_docs)] // documentation missing in model
    Archived,
    #[allow(missing_docs)] // documentation missing in model
    NotProvided,
    #[allow(missing_docs)] // documentation missing in model
    Stable,
    #[allow(missing_docs)] // documentation missing in model
    ToBeArchived,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for VendorGuidance {
    fn from(s: &str) -> Self {
        match s {
            "ARCHIVED" => VendorGuidance::Archived,
            "NOT_PROVIDED" => VendorGuidance::NotProvided,
            "STABLE" => VendorGuidance::Stable,
            "TO_BE_ARCHIVED" => VendorGuidance::ToBeArchived,
            other => VendorGuidance::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for VendorGuidance {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(VendorGuidance::from(s))
    }
}
impl VendorGuidance {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            VendorGuidance::Archived => "ARCHIVED",
            VendorGuidance::NotProvided => "NOT_PROVIDED",
            VendorGuidance::Stable => "STABLE",
            VendorGuidance::ToBeArchived => "TO_BE_ARCHIVED",
            VendorGuidance::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ARCHIVED", "NOT_PROVIDED", "STABLE", "TO_BE_ARCHIVED"]
    }
}
impl AsRef<str> for VendorGuidance {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A key-value pair that you specify to describe the feature.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FeatureParameter {
    /// <p>A key that must contain a value to describe the feature.</p>
    #[doc(hidden)]
    pub key: std::option::Option<std::string::String>,
    /// <p>The value that belongs to a key.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl FeatureParameter {
    /// <p>A key that must contain a value to describe the feature.</p>
    pub fn key(&self) -> std::option::Option<&str> {
        self.key.as_deref()
    }
    /// <p>The value that belongs to a key.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`FeatureParameter`](crate::model::FeatureParameter).
pub mod feature_parameter {

    /// A builder for [`FeatureParameter`](crate::model::FeatureParameter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) key: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A key that must contain a value to describe the feature.</p>
        pub fn key(mut self, input: impl Into<std::string::String>) -> Self {
            self.key = Some(input.into());
            self
        }
        /// <p>A key that must contain a value to describe the feature.</p>
        pub fn set_key(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.key = input;
            self
        }
        /// <p>The value that belongs to a key.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The value that belongs to a key.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`FeatureParameter`](crate::model::FeatureParameter).
        pub fn build(self) -> crate::model::FeatureParameter {
            crate::model::FeatureParameter {
                key: self.key,
                value: self.value,
            }
        }
    }
}
impl FeatureParameter {
    /// Creates a new builder-style object to manufacture [`FeatureParameter`](crate::model::FeatureParameter).
    pub fn builder() -> crate::model::feature_parameter::Builder {
        crate::model::feature_parameter::Builder::default()
    }
}

/// <p>A list of features. You must include <code>FeatureName</code> and <code>FeatureType</code>. Valid feature <code>FeatureType</code>s are <code>Integral</code>, <code>Fractional</code> and <code>String</code>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FeatureDefinition {
    /// <p>The name of a feature. The type must be a string. <code>FeatureName</code> cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
    #[doc(hidden)]
    pub feature_name: std::option::Option<std::string::String>,
    /// <p>The value type of a feature. Valid values are Integral, Fractional, or String.</p>
    #[doc(hidden)]
    pub feature_type: std::option::Option<crate::model::FeatureType>,
}
impl FeatureDefinition {
    /// <p>The name of a feature. The type must be a string. <code>FeatureName</code> cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
    pub fn feature_name(&self) -> std::option::Option<&str> {
        self.feature_name.as_deref()
    }
    /// <p>The value type of a feature. Valid values are Integral, Fractional, or String.</p>
    pub fn feature_type(&self) -> std::option::Option<&crate::model::FeatureType> {
        self.feature_type.as_ref()
    }
}
/// See [`FeatureDefinition`](crate::model::FeatureDefinition).
pub mod feature_definition {

    /// A builder for [`FeatureDefinition`](crate::model::FeatureDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) feature_name: std::option::Option<std::string::String>,
        pub(crate) feature_type: std::option::Option<crate::model::FeatureType>,
    }
    impl Builder {
        /// <p>The name of a feature. The type must be a string. <code>FeatureName</code> cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
        pub fn feature_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_name = Some(input.into());
            self
        }
        /// <p>The name of a feature. The type must be a string. <code>FeatureName</code> cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
        pub fn set_feature_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.feature_name = input;
            self
        }
        /// <p>The value type of a feature. Valid values are Integral, Fractional, or String.</p>
        pub fn feature_type(mut self, input: crate::model::FeatureType) -> Self {
            self.feature_type = Some(input);
            self
        }
        /// <p>The value type of a feature. Valid values are Integral, Fractional, or String.</p>
        pub fn set_feature_type(
            mut self,
            input: std::option::Option<crate::model::FeatureType>,
        ) -> Self {
            self.feature_type = input;
            self
        }
        /// Consumes the builder and constructs a [`FeatureDefinition`](crate::model::FeatureDefinition).
        pub fn build(self) -> crate::model::FeatureDefinition {
            crate::model::FeatureDefinition {
                feature_name: self.feature_name,
                feature_type: self.feature_type,
            }
        }
    }
}
impl FeatureDefinition {
    /// Creates a new builder-style object to manufacture [`FeatureDefinition`](crate::model::FeatureDefinition).
    pub fn builder() -> crate::model::feature_definition::Builder {
        crate::model::feature_definition::Builder::default()
    }
}

/// When writing a match expression against `FeatureType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let featuretype = unimplemented!();
/// match featuretype {
///     FeatureType::Fractional => { /* ... */ },
///     FeatureType::Integral => { /* ... */ },
///     FeatureType::String => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `featuretype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FeatureType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FeatureType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FeatureType::NewFeature` is defined.
/// Specifically, when `featuretype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FeatureType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FeatureType {
    #[allow(missing_docs)] // documentation missing in model
    Fractional,
    #[allow(missing_docs)] // documentation missing in model
    Integral,
    #[allow(missing_docs)] // documentation missing in model
    String,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FeatureType {
    fn from(s: &str) -> Self {
        match s {
            "Fractional" => FeatureType::Fractional,
            "Integral" => FeatureType::Integral,
            "String" => FeatureType::String,
            other => FeatureType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for FeatureType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FeatureType::from(s))
    }
}
impl FeatureType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FeatureType::Fractional => "Fractional",
            FeatureType::Integral => "Integral",
            FeatureType::String => "String",
            FeatureType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Fractional", "Integral", "String"]
    }
}
impl AsRef<str> for FeatureType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies weight and capacity values for a production variant.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DesiredWeightAndCapacity {
    /// <p>The name of the variant to update.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>The variant's weight.</p>
    #[doc(hidden)]
    pub desired_weight: std::option::Option<f32>,
    /// <p>The variant's capacity.</p>
    #[doc(hidden)]
    pub desired_instance_count: std::option::Option<i32>,
}
impl DesiredWeightAndCapacity {
    /// <p>The name of the variant to update.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>The variant's weight.</p>
    pub fn desired_weight(&self) -> std::option::Option<f32> {
        self.desired_weight
    }
    /// <p>The variant's capacity.</p>
    pub fn desired_instance_count(&self) -> std::option::Option<i32> {
        self.desired_instance_count
    }
}
/// See [`DesiredWeightAndCapacity`](crate::model::DesiredWeightAndCapacity).
pub mod desired_weight_and_capacity {

    /// A builder for [`DesiredWeightAndCapacity`](crate::model::DesiredWeightAndCapacity).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) desired_weight: std::option::Option<f32>,
        pub(crate) desired_instance_count: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The name of the variant to update.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the variant to update.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// <p>The variant's weight.</p>
        pub fn desired_weight(mut self, input: f32) -> Self {
            self.desired_weight = Some(input);
            self
        }
        /// <p>The variant's weight.</p>
        pub fn set_desired_weight(mut self, input: std::option::Option<f32>) -> Self {
            self.desired_weight = input;
            self
        }
        /// <p>The variant's capacity.</p>
        pub fn desired_instance_count(mut self, input: i32) -> Self {
            self.desired_instance_count = Some(input);
            self
        }
        /// <p>The variant's capacity.</p>
        pub fn set_desired_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.desired_instance_count = input;
            self
        }
        /// Consumes the builder and constructs a [`DesiredWeightAndCapacity`](crate::model::DesiredWeightAndCapacity).
        pub fn build(self) -> crate::model::DesiredWeightAndCapacity {
            crate::model::DesiredWeightAndCapacity {
                variant_name: self.variant_name,
                desired_weight: self.desired_weight,
                desired_instance_count: self.desired_instance_count,
            }
        }
    }
}
impl DesiredWeightAndCapacity {
    /// Creates a new builder-style object to manufacture [`DesiredWeightAndCapacity`](crate::model::DesiredWeightAndCapacity).
    pub fn builder() -> crate::model::desired_weight_and_capacity::Builder {
        crate::model::desired_weight_and_capacity::Builder::default()
    }
}

/// <p>The deployment configuration for an endpoint, which contains the desired deployment strategy and rollback configurations.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeploymentConfig {
    /// <p>Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default.</p>
    #[doc(hidden)]
    pub blue_green_update_policy: std::option::Option<crate::model::BlueGreenUpdatePolicy>,
    /// <p>Automatic rollback configuration for handling endpoint deployment failures and recovery.</p>
    #[doc(hidden)]
    pub auto_rollback_configuration: std::option::Option<crate::model::AutoRollbackConfig>,
}
impl DeploymentConfig {
    /// <p>Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default.</p>
    pub fn blue_green_update_policy(
        &self,
    ) -> std::option::Option<&crate::model::BlueGreenUpdatePolicy> {
        self.blue_green_update_policy.as_ref()
    }
    /// <p>Automatic rollback configuration for handling endpoint deployment failures and recovery.</p>
    pub fn auto_rollback_configuration(
        &self,
    ) -> std::option::Option<&crate::model::AutoRollbackConfig> {
        self.auto_rollback_configuration.as_ref()
    }
}
/// See [`DeploymentConfig`](crate::model::DeploymentConfig).
pub mod deployment_config {

    /// A builder for [`DeploymentConfig`](crate::model::DeploymentConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) blue_green_update_policy:
            std::option::Option<crate::model::BlueGreenUpdatePolicy>,
        pub(crate) auto_rollback_configuration:
            std::option::Option<crate::model::AutoRollbackConfig>,
    }
    impl Builder {
        /// <p>Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default.</p>
        pub fn blue_green_update_policy(
            mut self,
            input: crate::model::BlueGreenUpdatePolicy,
        ) -> Self {
            self.blue_green_update_policy = Some(input);
            self
        }
        /// <p>Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default.</p>
        pub fn set_blue_green_update_policy(
            mut self,
            input: std::option::Option<crate::model::BlueGreenUpdatePolicy>,
        ) -> Self {
            self.blue_green_update_policy = input;
            self
        }
        /// <p>Automatic rollback configuration for handling endpoint deployment failures and recovery.</p>
        pub fn auto_rollback_configuration(
            mut self,
            input: crate::model::AutoRollbackConfig,
        ) -> Self {
            self.auto_rollback_configuration = Some(input);
            self
        }
        /// <p>Automatic rollback configuration for handling endpoint deployment failures and recovery.</p>
        pub fn set_auto_rollback_configuration(
            mut self,
            input: std::option::Option<crate::model::AutoRollbackConfig>,
        ) -> Self {
            self.auto_rollback_configuration = input;
            self
        }
        /// Consumes the builder and constructs a [`DeploymentConfig`](crate::model::DeploymentConfig).
        pub fn build(self) -> crate::model::DeploymentConfig {
            crate::model::DeploymentConfig {
                blue_green_update_policy: self.blue_green_update_policy,
                auto_rollback_configuration: self.auto_rollback_configuration,
            }
        }
    }
}
impl DeploymentConfig {
    /// Creates a new builder-style object to manufacture [`DeploymentConfig`](crate::model::DeploymentConfig).
    pub fn builder() -> crate::model::deployment_config::Builder {
        crate::model::deployment_config::Builder::default()
    }
}

/// <p>Automatic rollback configuration for handling endpoint deployment failures and recovery.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoRollbackConfig {
    /// <p>List of CloudWatch alarms in your account that are configured to monitor metrics on an endpoint. If any alarms are tripped during a deployment, SageMaker rolls back the deployment.</p>
    #[doc(hidden)]
    pub alarms: std::option::Option<std::vec::Vec<crate::model::Alarm>>,
}
impl AutoRollbackConfig {
    /// <p>List of CloudWatch alarms in your account that are configured to monitor metrics on an endpoint. If any alarms are tripped during a deployment, SageMaker rolls back the deployment.</p>
    pub fn alarms(&self) -> std::option::Option<&[crate::model::Alarm]> {
        self.alarms.as_deref()
    }
}
/// See [`AutoRollbackConfig`](crate::model::AutoRollbackConfig).
pub mod auto_rollback_config {

    /// A builder for [`AutoRollbackConfig`](crate::model::AutoRollbackConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) alarms: std::option::Option<std::vec::Vec<crate::model::Alarm>>,
    }
    impl Builder {
        /// Appends an item to `alarms`.
        ///
        /// To override the contents of this collection use [`set_alarms`](Self::set_alarms).
        ///
        /// <p>List of CloudWatch alarms in your account that are configured to monitor metrics on an endpoint. If any alarms are tripped during a deployment, SageMaker rolls back the deployment.</p>
        pub fn alarms(mut self, input: crate::model::Alarm) -> Self {
            let mut v = self.alarms.unwrap_or_default();
            v.push(input);
            self.alarms = Some(v);
            self
        }
        /// <p>List of CloudWatch alarms in your account that are configured to monitor metrics on an endpoint. If any alarms are tripped during a deployment, SageMaker rolls back the deployment.</p>
        pub fn set_alarms(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Alarm>>,
        ) -> Self {
            self.alarms = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoRollbackConfig`](crate::model::AutoRollbackConfig).
        pub fn build(self) -> crate::model::AutoRollbackConfig {
            crate::model::AutoRollbackConfig {
                alarms: self.alarms,
            }
        }
    }
}
impl AutoRollbackConfig {
    /// Creates a new builder-style object to manufacture [`AutoRollbackConfig`](crate::model::AutoRollbackConfig).
    pub fn builder() -> crate::model::auto_rollback_config::Builder {
        crate::model::auto_rollback_config::Builder::default()
    }
}

/// <p>An Amazon CloudWatch alarm configured to monitor metrics on an endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Alarm {
    /// <p>The name of a CloudWatch alarm in your account.</p>
    #[doc(hidden)]
    pub alarm_name: std::option::Option<std::string::String>,
}
impl Alarm {
    /// <p>The name of a CloudWatch alarm in your account.</p>
    pub fn alarm_name(&self) -> std::option::Option<&str> {
        self.alarm_name.as_deref()
    }
}
/// See [`Alarm`](crate::model::Alarm).
pub mod alarm {

    /// A builder for [`Alarm`](crate::model::Alarm).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) alarm_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of a CloudWatch alarm in your account.</p>
        pub fn alarm_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.alarm_name = Some(input.into());
            self
        }
        /// <p>The name of a CloudWatch alarm in your account.</p>
        pub fn set_alarm_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.alarm_name = input;
            self
        }
        /// Consumes the builder and constructs a [`Alarm`](crate::model::Alarm).
        pub fn build(self) -> crate::model::Alarm {
            crate::model::Alarm {
                alarm_name: self.alarm_name,
            }
        }
    }
}
impl Alarm {
    /// Creates a new builder-style object to manufacture [`Alarm`](crate::model::Alarm).
    pub fn builder() -> crate::model::alarm::Builder {
        crate::model::alarm::Builder::default()
    }
}

/// <p>Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct BlueGreenUpdatePolicy {
    /// <p>Defines the traffic routing strategy to shift traffic from the old fleet to the new fleet during an endpoint deployment.</p>
    #[doc(hidden)]
    pub traffic_routing_configuration: std::option::Option<crate::model::TrafficRoutingConfig>,
    /// <p>Additional waiting time in seconds after the completion of an endpoint deployment before terminating the old endpoint fleet. Default is 0.</p>
    #[doc(hidden)]
    pub termination_wait_in_seconds: std::option::Option<i32>,
    /// <p>Maximum execution timeout for the deployment. Note that the timeout value should be larger than the total waiting time specified in <code>TerminationWaitInSeconds</code> and <code>WaitIntervalInSeconds</code>.</p>
    #[doc(hidden)]
    pub maximum_execution_timeout_in_seconds: std::option::Option<i32>,
}
impl BlueGreenUpdatePolicy {
    /// <p>Defines the traffic routing strategy to shift traffic from the old fleet to the new fleet during an endpoint deployment.</p>
    pub fn traffic_routing_configuration(
        &self,
    ) -> std::option::Option<&crate::model::TrafficRoutingConfig> {
        self.traffic_routing_configuration.as_ref()
    }
    /// <p>Additional waiting time in seconds after the completion of an endpoint deployment before terminating the old endpoint fleet. Default is 0.</p>
    pub fn termination_wait_in_seconds(&self) -> std::option::Option<i32> {
        self.termination_wait_in_seconds
    }
    /// <p>Maximum execution timeout for the deployment. Note that the timeout value should be larger than the total waiting time specified in <code>TerminationWaitInSeconds</code> and <code>WaitIntervalInSeconds</code>.</p>
    pub fn maximum_execution_timeout_in_seconds(&self) -> std::option::Option<i32> {
        self.maximum_execution_timeout_in_seconds
    }
}
/// See [`BlueGreenUpdatePolicy`](crate::model::BlueGreenUpdatePolicy).
pub mod blue_green_update_policy {

    /// A builder for [`BlueGreenUpdatePolicy`](crate::model::BlueGreenUpdatePolicy).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) traffic_routing_configuration:
            std::option::Option<crate::model::TrafficRoutingConfig>,
        pub(crate) termination_wait_in_seconds: std::option::Option<i32>,
        pub(crate) maximum_execution_timeout_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Defines the traffic routing strategy to shift traffic from the old fleet to the new fleet during an endpoint deployment.</p>
        pub fn traffic_routing_configuration(
            mut self,
            input: crate::model::TrafficRoutingConfig,
        ) -> Self {
            self.traffic_routing_configuration = Some(input);
            self
        }
        /// <p>Defines the traffic routing strategy to shift traffic from the old fleet to the new fleet during an endpoint deployment.</p>
        pub fn set_traffic_routing_configuration(
            mut self,
            input: std::option::Option<crate::model::TrafficRoutingConfig>,
        ) -> Self {
            self.traffic_routing_configuration = input;
            self
        }
        /// <p>Additional waiting time in seconds after the completion of an endpoint deployment before terminating the old endpoint fleet. Default is 0.</p>
        pub fn termination_wait_in_seconds(mut self, input: i32) -> Self {
            self.termination_wait_in_seconds = Some(input);
            self
        }
        /// <p>Additional waiting time in seconds after the completion of an endpoint deployment before terminating the old endpoint fleet. Default is 0.</p>
        pub fn set_termination_wait_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.termination_wait_in_seconds = input;
            self
        }
        /// <p>Maximum execution timeout for the deployment. Note that the timeout value should be larger than the total waiting time specified in <code>TerminationWaitInSeconds</code> and <code>WaitIntervalInSeconds</code>.</p>
        pub fn maximum_execution_timeout_in_seconds(mut self, input: i32) -> Self {
            self.maximum_execution_timeout_in_seconds = Some(input);
            self
        }
        /// <p>Maximum execution timeout for the deployment. Note that the timeout value should be larger than the total waiting time specified in <code>TerminationWaitInSeconds</code> and <code>WaitIntervalInSeconds</code>.</p>
        pub fn set_maximum_execution_timeout_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.maximum_execution_timeout_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`BlueGreenUpdatePolicy`](crate::model::BlueGreenUpdatePolicy).
        pub fn build(self) -> crate::model::BlueGreenUpdatePolicy {
            crate::model::BlueGreenUpdatePolicy {
                traffic_routing_configuration: self.traffic_routing_configuration,
                termination_wait_in_seconds: self.termination_wait_in_seconds,
                maximum_execution_timeout_in_seconds: self.maximum_execution_timeout_in_seconds,
            }
        }
    }
}
impl BlueGreenUpdatePolicy {
    /// Creates a new builder-style object to manufacture [`BlueGreenUpdatePolicy`](crate::model::BlueGreenUpdatePolicy).
    pub fn builder() -> crate::model::blue_green_update_policy::Builder {
        crate::model::blue_green_update_policy::Builder::default()
    }
}

/// <p>Defines the traffic routing strategy during an endpoint deployment to shift traffic from the old fleet to the new fleet.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrafficRoutingConfig {
    /// <p>Traffic routing strategy type.</p>
    /// <ul>
    /// <li> <p> <code>ALL_AT_ONCE</code>: Endpoint traffic shifts to the new fleet in a single step. </p> </li>
    /// <li> <p> <code>CANARY</code>: Endpoint traffic shifts to the new fleet in two steps. The first step is the canary, which is a small portion of the traffic. The second step is the remainder of the traffic. </p> </li>
    /// <li> <p> <code>LINEAR</code>: Endpoint traffic shifts to the new fleet in n steps of a configurable size. </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::TrafficRoutingConfigType>,
    /// <p>The waiting time (in seconds) between incremental steps to turn on traffic on the new endpoint fleet.</p>
    #[doc(hidden)]
    pub wait_interval_in_seconds: std::option::Option<i32>,
    /// <p>Batch size for the first step to turn on traffic on the new endpoint fleet. <code>Value</code> must be less than or equal to 50% of the variant's total instance count.</p>
    #[doc(hidden)]
    pub canary_size: std::option::Option<crate::model::CapacitySize>,
    /// <p>Batch size for each step to turn on traffic on the new endpoint fleet. <code>Value</code> must be 10-50% of the variant's total instance count.</p>
    #[doc(hidden)]
    pub linear_step_size: std::option::Option<crate::model::CapacitySize>,
}
impl TrafficRoutingConfig {
    /// <p>Traffic routing strategy type.</p>
    /// <ul>
    /// <li> <p> <code>ALL_AT_ONCE</code>: Endpoint traffic shifts to the new fleet in a single step. </p> </li>
    /// <li> <p> <code>CANARY</code>: Endpoint traffic shifts to the new fleet in two steps. The first step is the canary, which is a small portion of the traffic. The second step is the remainder of the traffic. </p> </li>
    /// <li> <p> <code>LINEAR</code>: Endpoint traffic shifts to the new fleet in n steps of a configurable size. </p> </li>
    /// </ul>
    pub fn r#type(&self) -> std::option::Option<&crate::model::TrafficRoutingConfigType> {
        self.r#type.as_ref()
    }
    /// <p>The waiting time (in seconds) between incremental steps to turn on traffic on the new endpoint fleet.</p>
    pub fn wait_interval_in_seconds(&self) -> std::option::Option<i32> {
        self.wait_interval_in_seconds
    }
    /// <p>Batch size for the first step to turn on traffic on the new endpoint fleet. <code>Value</code> must be less than or equal to 50% of the variant's total instance count.</p>
    pub fn canary_size(&self) -> std::option::Option<&crate::model::CapacitySize> {
        self.canary_size.as_ref()
    }
    /// <p>Batch size for each step to turn on traffic on the new endpoint fleet. <code>Value</code> must be 10-50% of the variant's total instance count.</p>
    pub fn linear_step_size(&self) -> std::option::Option<&crate::model::CapacitySize> {
        self.linear_step_size.as_ref()
    }
}
/// See [`TrafficRoutingConfig`](crate::model::TrafficRoutingConfig).
pub mod traffic_routing_config {

    /// A builder for [`TrafficRoutingConfig`](crate::model::TrafficRoutingConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r#type: std::option::Option<crate::model::TrafficRoutingConfigType>,
        pub(crate) wait_interval_in_seconds: std::option::Option<i32>,
        pub(crate) canary_size: std::option::Option<crate::model::CapacitySize>,
        pub(crate) linear_step_size: std::option::Option<crate::model::CapacitySize>,
    }
    impl Builder {
        /// <p>Traffic routing strategy type.</p>
        /// <ul>
        /// <li> <p> <code>ALL_AT_ONCE</code>: Endpoint traffic shifts to the new fleet in a single step. </p> </li>
        /// <li> <p> <code>CANARY</code>: Endpoint traffic shifts to the new fleet in two steps. The first step is the canary, which is a small portion of the traffic. The second step is the remainder of the traffic. </p> </li>
        /// <li> <p> <code>LINEAR</code>: Endpoint traffic shifts to the new fleet in n steps of a configurable size. </p> </li>
        /// </ul>
        pub fn r#type(mut self, input: crate::model::TrafficRoutingConfigType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>Traffic routing strategy type.</p>
        /// <ul>
        /// <li> <p> <code>ALL_AT_ONCE</code>: Endpoint traffic shifts to the new fleet in a single step. </p> </li>
        /// <li> <p> <code>CANARY</code>: Endpoint traffic shifts to the new fleet in two steps. The first step is the canary, which is a small portion of the traffic. The second step is the remainder of the traffic. </p> </li>
        /// <li> <p> <code>LINEAR</code>: Endpoint traffic shifts to the new fleet in n steps of a configurable size. </p> </li>
        /// </ul>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::TrafficRoutingConfigType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The waiting time (in seconds) between incremental steps to turn on traffic on the new endpoint fleet.</p>
        pub fn wait_interval_in_seconds(mut self, input: i32) -> Self {
            self.wait_interval_in_seconds = Some(input);
            self
        }
        /// <p>The waiting time (in seconds) between incremental steps to turn on traffic on the new endpoint fleet.</p>
        pub fn set_wait_interval_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.wait_interval_in_seconds = input;
            self
        }
        /// <p>Batch size for the first step to turn on traffic on the new endpoint fleet. <code>Value</code> must be less than or equal to 50% of the variant's total instance count.</p>
        pub fn canary_size(mut self, input: crate::model::CapacitySize) -> Self {
            self.canary_size = Some(input);
            self
        }
        /// <p>Batch size for the first step to turn on traffic on the new endpoint fleet. <code>Value</code> must be less than or equal to 50% of the variant's total instance count.</p>
        pub fn set_canary_size(
            mut self,
            input: std::option::Option<crate::model::CapacitySize>,
        ) -> Self {
            self.canary_size = input;
            self
        }
        /// <p>Batch size for each step to turn on traffic on the new endpoint fleet. <code>Value</code> must be 10-50% of the variant's total instance count.</p>
        pub fn linear_step_size(mut self, input: crate::model::CapacitySize) -> Self {
            self.linear_step_size = Some(input);
            self
        }
        /// <p>Batch size for each step to turn on traffic on the new endpoint fleet. <code>Value</code> must be 10-50% of the variant's total instance count.</p>
        pub fn set_linear_step_size(
            mut self,
            input: std::option::Option<crate::model::CapacitySize>,
        ) -> Self {
            self.linear_step_size = input;
            self
        }
        /// Consumes the builder and constructs a [`TrafficRoutingConfig`](crate::model::TrafficRoutingConfig).
        pub fn build(self) -> crate::model::TrafficRoutingConfig {
            crate::model::TrafficRoutingConfig {
                r#type: self.r#type,
                wait_interval_in_seconds: self.wait_interval_in_seconds,
                canary_size: self.canary_size,
                linear_step_size: self.linear_step_size,
            }
        }
    }
}
impl TrafficRoutingConfig {
    /// Creates a new builder-style object to manufacture [`TrafficRoutingConfig`](crate::model::TrafficRoutingConfig).
    pub fn builder() -> crate::model::traffic_routing_config::Builder {
        crate::model::traffic_routing_config::Builder::default()
    }
}

/// <p>Specifies the endpoint capacity to activate for production.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CapacitySize {
    /// <p>Specifies the endpoint capacity type.</p>
    /// <ul>
    /// <li> <p> <code>INSTANCE_COUNT</code>: The endpoint activates based on the number of instances.</p> </li>
    /// <li> <p> <code>CAPACITY_PERCENT</code>: The endpoint activates based on the specified percentage of capacity.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::CapacitySizeType>,
    /// <p>Defines the capacity size, either as a number of instances or a capacity percentage.</p>
    #[doc(hidden)]
    pub value: std::option::Option<i32>,
}
impl CapacitySize {
    /// <p>Specifies the endpoint capacity type.</p>
    /// <ul>
    /// <li> <p> <code>INSTANCE_COUNT</code>: The endpoint activates based on the number of instances.</p> </li>
    /// <li> <p> <code>CAPACITY_PERCENT</code>: The endpoint activates based on the specified percentage of capacity.</p> </li>
    /// </ul>
    pub fn r#type(&self) -> std::option::Option<&crate::model::CapacitySizeType> {
        self.r#type.as_ref()
    }
    /// <p>Defines the capacity size, either as a number of instances or a capacity percentage.</p>
    pub fn value(&self) -> std::option::Option<i32> {
        self.value
    }
}
/// See [`CapacitySize`](crate::model::CapacitySize).
pub mod capacity_size {

    /// A builder for [`CapacitySize`](crate::model::CapacitySize).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r#type: std::option::Option<crate::model::CapacitySizeType>,
        pub(crate) value: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Specifies the endpoint capacity type.</p>
        /// <ul>
        /// <li> <p> <code>INSTANCE_COUNT</code>: The endpoint activates based on the number of instances.</p> </li>
        /// <li> <p> <code>CAPACITY_PERCENT</code>: The endpoint activates based on the specified percentage of capacity.</p> </li>
        /// </ul>
        pub fn r#type(mut self, input: crate::model::CapacitySizeType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>Specifies the endpoint capacity type.</p>
        /// <ul>
        /// <li> <p> <code>INSTANCE_COUNT</code>: The endpoint activates based on the number of instances.</p> </li>
        /// <li> <p> <code>CAPACITY_PERCENT</code>: The endpoint activates based on the specified percentage of capacity.</p> </li>
        /// </ul>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::CapacitySizeType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>Defines the capacity size, either as a number of instances or a capacity percentage.</p>
        pub fn value(mut self, input: i32) -> Self {
            self.value = Some(input);
            self
        }
        /// <p>Defines the capacity size, either as a number of instances or a capacity percentage.</p>
        pub fn set_value(mut self, input: std::option::Option<i32>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`CapacitySize`](crate::model::CapacitySize).
        pub fn build(self) -> crate::model::CapacitySize {
            crate::model::CapacitySize {
                r#type: self.r#type,
                value: self.value,
            }
        }
    }
}
impl CapacitySize {
    /// Creates a new builder-style object to manufacture [`CapacitySize`](crate::model::CapacitySize).
    pub fn builder() -> crate::model::capacity_size::Builder {
        crate::model::capacity_size::Builder::default()
    }
}

/// When writing a match expression against `CapacitySizeType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let capacitysizetype = unimplemented!();
/// match capacitysizetype {
///     CapacitySizeType::CapacityPercent => { /* ... */ },
///     CapacitySizeType::InstanceCount => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `capacitysizetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CapacitySizeType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CapacitySizeType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CapacitySizeType::NewFeature` is defined.
/// Specifically, when `capacitysizetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CapacitySizeType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CapacitySizeType {
    #[allow(missing_docs)] // documentation missing in model
    CapacityPercent,
    #[allow(missing_docs)] // documentation missing in model
    InstanceCount,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CapacitySizeType {
    fn from(s: &str) -> Self {
        match s {
            "CAPACITY_PERCENT" => CapacitySizeType::CapacityPercent,
            "INSTANCE_COUNT" => CapacitySizeType::InstanceCount,
            other => CapacitySizeType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for CapacitySizeType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CapacitySizeType::from(s))
    }
}
impl CapacitySizeType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CapacitySizeType::CapacityPercent => "CAPACITY_PERCENT",
            CapacitySizeType::InstanceCount => "INSTANCE_COUNT",
            CapacitySizeType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CAPACITY_PERCENT", "INSTANCE_COUNT"]
    }
}
impl AsRef<str> for CapacitySizeType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TrafficRoutingConfigType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let trafficroutingconfigtype = unimplemented!();
/// match trafficroutingconfigtype {
///     TrafficRoutingConfigType::AllAtOnce => { /* ... */ },
///     TrafficRoutingConfigType::Canary => { /* ... */ },
///     TrafficRoutingConfigType::Linear => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `trafficroutingconfigtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrafficRoutingConfigType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrafficRoutingConfigType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrafficRoutingConfigType::NewFeature` is defined.
/// Specifically, when `trafficroutingconfigtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrafficRoutingConfigType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrafficRoutingConfigType {
    #[allow(missing_docs)] // documentation missing in model
    AllAtOnce,
    #[allow(missing_docs)] // documentation missing in model
    Canary,
    #[allow(missing_docs)] // documentation missing in model
    Linear,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrafficRoutingConfigType {
    fn from(s: &str) -> Self {
        match s {
            "ALL_AT_ONCE" => TrafficRoutingConfigType::AllAtOnce,
            "CANARY" => TrafficRoutingConfigType::Canary,
            "LINEAR" => TrafficRoutingConfigType::Linear,
            other => TrafficRoutingConfigType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for TrafficRoutingConfigType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrafficRoutingConfigType::from(s))
    }
}
impl TrafficRoutingConfigType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrafficRoutingConfigType::AllAtOnce => "ALL_AT_ONCE",
            TrafficRoutingConfigType::Canary => "CANARY",
            TrafficRoutingConfigType::Linear => "LINEAR",
            TrafficRoutingConfigType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ALL_AT_ONCE", "CANARY", "LINEAR"]
    }
}
impl AsRef<str> for TrafficRoutingConfigType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies a production variant property type for an Endpoint.</p>
/// <p>If you are updating an endpoint with the <code>UpdateEndpointInput$RetainAllVariantProperties</code> option set to <code>true</code>, the <code>VariantProperty</code> objects listed in <code>UpdateEndpointInput$ExcludeRetainedVariantProperties</code> override the existing variant properties of the endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct VariantProperty {
    /// <p>The type of variant property. The supported values are:</p>
    /// <ul>
    /// <li> <p> <code>DesiredInstanceCount</code>: Overrides the existing variant instance counts using the <code>ProductionVariant$InitialInstanceCount</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
    /// <li> <p> <code>DesiredWeight</code>: Overrides the existing variant weights using the <code>ProductionVariant$InitialVariantWeight</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
    /// <li> <p> <code>DataCaptureConfig</code>: (Not currently supported.)</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub variant_property_type: std::option::Option<crate::model::VariantPropertyType>,
}
impl VariantProperty {
    /// <p>The type of variant property. The supported values are:</p>
    /// <ul>
    /// <li> <p> <code>DesiredInstanceCount</code>: Overrides the existing variant instance counts using the <code>ProductionVariant$InitialInstanceCount</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
    /// <li> <p> <code>DesiredWeight</code>: Overrides the existing variant weights using the <code>ProductionVariant$InitialVariantWeight</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
    /// <li> <p> <code>DataCaptureConfig</code>: (Not currently supported.)</p> </li>
    /// </ul>
    pub fn variant_property_type(&self) -> std::option::Option<&crate::model::VariantPropertyType> {
        self.variant_property_type.as_ref()
    }
}
/// See [`VariantProperty`](crate::model::VariantProperty).
pub mod variant_property {

    /// A builder for [`VariantProperty`](crate::model::VariantProperty).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) variant_property_type: std::option::Option<crate::model::VariantPropertyType>,
    }
    impl Builder {
        /// <p>The type of variant property. The supported values are:</p>
        /// <ul>
        /// <li> <p> <code>DesiredInstanceCount</code>: Overrides the existing variant instance counts using the <code>ProductionVariant$InitialInstanceCount</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
        /// <li> <p> <code>DesiredWeight</code>: Overrides the existing variant weights using the <code>ProductionVariant$InitialVariantWeight</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
        /// <li> <p> <code>DataCaptureConfig</code>: (Not currently supported.)</p> </li>
        /// </ul>
        pub fn variant_property_type(mut self, input: crate::model::VariantPropertyType) -> Self {
            self.variant_property_type = Some(input);
            self
        }
        /// <p>The type of variant property. The supported values are:</p>
        /// <ul>
        /// <li> <p> <code>DesiredInstanceCount</code>: Overrides the existing variant instance counts using the <code>ProductionVariant$InitialInstanceCount</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
        /// <li> <p> <code>DesiredWeight</code>: Overrides the existing variant weights using the <code>ProductionVariant$InitialVariantWeight</code> values in the <code>CreateEndpointConfigInput$ProductionVariants</code>.</p> </li>
        /// <li> <p> <code>DataCaptureConfig</code>: (Not currently supported.)</p> </li>
        /// </ul>
        pub fn set_variant_property_type(
            mut self,
            input: std::option::Option<crate::model::VariantPropertyType>,
        ) -> Self {
            self.variant_property_type = input;
            self
        }
        /// Consumes the builder and constructs a [`VariantProperty`](crate::model::VariantProperty).
        pub fn build(self) -> crate::model::VariantProperty {
            crate::model::VariantProperty {
                variant_property_type: self.variant_property_type,
            }
        }
    }
}
impl VariantProperty {
    /// Creates a new builder-style object to manufacture [`VariantProperty`](crate::model::VariantProperty).
    pub fn builder() -> crate::model::variant_property::Builder {
        crate::model::variant_property::Builder::default()
    }
}

/// When writing a match expression against `VariantPropertyType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let variantpropertytype = unimplemented!();
/// match variantpropertytype {
///     VariantPropertyType::DataCaptureConfig => { /* ... */ },
///     VariantPropertyType::DesiredInstanceCount => { /* ... */ },
///     VariantPropertyType::DesiredWeight => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `variantpropertytype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `VariantPropertyType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `VariantPropertyType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `VariantPropertyType::NewFeature` is defined.
/// Specifically, when `variantpropertytype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `VariantPropertyType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum VariantPropertyType {
    #[allow(missing_docs)] // documentation missing in model
    DataCaptureConfig,
    #[allow(missing_docs)] // documentation missing in model
    DesiredInstanceCount,
    #[allow(missing_docs)] // documentation missing in model
    DesiredWeight,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for VariantPropertyType {
    fn from(s: &str) -> Self {
        match s {
            "DataCaptureConfig" => VariantPropertyType::DataCaptureConfig,
            "DesiredInstanceCount" => VariantPropertyType::DesiredInstanceCount,
            "DesiredWeight" => VariantPropertyType::DesiredWeight,
            other => {
                VariantPropertyType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for VariantPropertyType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(VariantPropertyType::from(s))
    }
}
impl VariantPropertyType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            VariantPropertyType::DataCaptureConfig => "DataCaptureConfig",
            VariantPropertyType::DesiredInstanceCount => "DesiredInstanceCount",
            VariantPropertyType::DesiredWeight => "DesiredWeight",
            VariantPropertyType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["DataCaptureConfig", "DesiredInstanceCount", "DesiredWeight"]
    }
}
impl AsRef<str> for VariantPropertyType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AppSecurityGroupManagement`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let appsecuritygroupmanagement = unimplemented!();
/// match appsecuritygroupmanagement {
///     AppSecurityGroupManagement::Customer => { /* ... */ },
///     AppSecurityGroupManagement::Service => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `appsecuritygroupmanagement` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppSecurityGroupManagement::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppSecurityGroupManagement::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppSecurityGroupManagement::NewFeature` is defined.
/// Specifically, when `appsecuritygroupmanagement` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppSecurityGroupManagement::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppSecurityGroupManagement {
    #[allow(missing_docs)] // documentation missing in model
    Customer,
    #[allow(missing_docs)] // documentation missing in model
    Service,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppSecurityGroupManagement {
    fn from(s: &str) -> Self {
        match s {
            "Customer" => AppSecurityGroupManagement::Customer,
            "Service" => AppSecurityGroupManagement::Service,
            other => AppSecurityGroupManagement::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for AppSecurityGroupManagement {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppSecurityGroupManagement::from(s))
    }
}
impl AppSecurityGroupManagement {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppSecurityGroupManagement::Customer => "Customer",
            AppSecurityGroupManagement::Service => "Service",
            AppSecurityGroupManagement::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Customer", "Service"]
    }
}
impl AsRef<str> for AppSecurityGroupManagement {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A collection of settings that apply to spaces created in the Domain.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DefaultSpaceSettings {
    /// <p>The execution role for the space.</p>
    #[doc(hidden)]
    pub execution_role: std::option::Option<std::string::String>,
    /// <p>The security groups for the Amazon Virtual Private Cloud that the space uses for communication.</p>
    #[doc(hidden)]
    pub security_groups: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The JupyterServer app settings.</p>
    #[doc(hidden)]
    pub jupyter_server_app_settings: std::option::Option<crate::model::JupyterServerAppSettings>,
    /// <p>The KernelGateway app settings.</p>
    #[doc(hidden)]
    pub kernel_gateway_app_settings: std::option::Option<crate::model::KernelGatewayAppSettings>,
}
impl DefaultSpaceSettings {
    /// <p>The execution role for the space.</p>
    pub fn execution_role(&self) -> std::option::Option<&str> {
        self.execution_role.as_deref()
    }
    /// <p>The security groups for the Amazon Virtual Private Cloud that the space uses for communication.</p>
    pub fn security_groups(&self) -> std::option::Option<&[std::string::String]> {
        self.security_groups.as_deref()
    }
    /// <p>The JupyterServer app settings.</p>
    pub fn jupyter_server_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::JupyterServerAppSettings> {
        self.jupyter_server_app_settings.as_ref()
    }
    /// <p>The KernelGateway app settings.</p>
    pub fn kernel_gateway_app_settings(
        &self,
    ) -> std::option::Option<&crate::model::KernelGatewayAppSettings> {
        self.kernel_gateway_app_settings.as_ref()
    }
}
/// See [`DefaultSpaceSettings`](crate::model::DefaultSpaceSettings).
pub mod default_space_settings {

    /// A builder for [`DefaultSpaceSettings`](crate::model::DefaultSpaceSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) execution_role: std::option::Option<std::string::String>,
        pub(crate) security_groups: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) jupyter_server_app_settings:
            std::option::Option<crate::model::JupyterServerAppSettings>,
        pub(crate) kernel_gateway_app_settings:
            std::option::Option<crate::model::KernelGatewayAppSettings>,
    }
    impl Builder {
        /// <p>The execution role for the space.</p>
        pub fn execution_role(mut self, input: impl Into<std::string::String>) -> Self {
            self.execution_role = Some(input.into());
            self
        }
        /// <p>The execution role for the space.</p>
        pub fn set_execution_role(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.execution_role = input;
            self
        }
        /// Appends an item to `security_groups`.
        ///
        /// To override the contents of this collection use [`set_security_groups`](Self::set_security_groups).
        ///
        /// <p>The security groups for the Amazon Virtual Private Cloud that the space uses for communication.</p>
        pub fn security_groups(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_groups.unwrap_or_default();
            v.push(input.into());
            self.security_groups = Some(v);
            self
        }
        /// <p>The security groups for the Amazon Virtual Private Cloud that the space uses for communication.</p>
        pub fn set_security_groups(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_groups = input;
            self
        }
        /// <p>The JupyterServer app settings.</p>
        pub fn jupyter_server_app_settings(
            mut self,
            input: crate::model::JupyterServerAppSettings,
        ) -> Self {
            self.jupyter_server_app_settings = Some(input);
            self
        }
        /// <p>The JupyterServer app settings.</p>
        pub fn set_jupyter_server_app_settings(
            mut self,
            input: std::option::Option<crate::model::JupyterServerAppSettings>,
        ) -> Self {
            self.jupyter_server_app_settings = input;
            self
        }
        /// <p>The KernelGateway app settings.</p>
        pub fn kernel_gateway_app_settings(
            mut self,
            input: crate::model::KernelGatewayAppSettings,
        ) -> Self {
            self.kernel_gateway_app_settings = Some(input);
            self
        }
        /// <p>The KernelGateway app settings.</p>
        pub fn set_kernel_gateway_app_settings(
            mut self,
            input: std::option::Option<crate::model::KernelGatewayAppSettings>,
        ) -> Self {
            self.kernel_gateway_app_settings = input;
            self
        }
        /// Consumes the builder and constructs a [`DefaultSpaceSettings`](crate::model::DefaultSpaceSettings).
        pub fn build(self) -> crate::model::DefaultSpaceSettings {
            crate::model::DefaultSpaceSettings {
                execution_role: self.execution_role,
                security_groups: self.security_groups,
                jupyter_server_app_settings: self.jupyter_server_app_settings,
                kernel_gateway_app_settings: self.kernel_gateway_app_settings,
            }
        }
    }
}
impl DefaultSpaceSettings {
    /// Creates a new builder-style object to manufacture [`DefaultSpaceSettings`](crate::model::DefaultSpaceSettings).
    pub fn builder() -> crate::model::default_space_settings::Builder {
        crate::model::default_space_settings::Builder::default()
    }
}

/// <p>A collection of <code>Domain</code> configuration settings to update.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DomainSettingsForUpdate {
    /// <p>A collection of <code>RStudioServerPro</code> Domain-level app settings to update.</p>
    #[doc(hidden)]
    pub r_studio_server_pro_domain_settings_for_update:
        std::option::Option<crate::model::RStudioServerProDomainSettingsForUpdate>,
    /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>. This configuration can only be modified if there are no apps in the <code>InService</code> or <code>Pending</code> state.</p>
    #[doc(hidden)]
    pub execution_role_identity_config:
        std::option::Option<crate::model::ExecutionRoleIdentityConfig>,
    /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl DomainSettingsForUpdate {
    /// <p>A collection of <code>RStudioServerPro</code> Domain-level app settings to update.</p>
    pub fn r_studio_server_pro_domain_settings_for_update(
        &self,
    ) -> std::option::Option<&crate::model::RStudioServerProDomainSettingsForUpdate> {
        self.r_studio_server_pro_domain_settings_for_update.as_ref()
    }
    /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>. This configuration can only be modified if there are no apps in the <code>InService</code> or <code>Pending</code> state.</p>
    pub fn execution_role_identity_config(
        &self,
    ) -> std::option::Option<&crate::model::ExecutionRoleIdentityConfig> {
        self.execution_role_identity_config.as_ref()
    }
    /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
}
/// See [`DomainSettingsForUpdate`](crate::model::DomainSettingsForUpdate).
pub mod domain_settings_for_update {

    /// A builder for [`DomainSettingsForUpdate`](crate::model::DomainSettingsForUpdate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r_studio_server_pro_domain_settings_for_update:
            std::option::Option<crate::model::RStudioServerProDomainSettingsForUpdate>,
        pub(crate) execution_role_identity_config:
            std::option::Option<crate::model::ExecutionRoleIdentityConfig>,
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>A collection of <code>RStudioServerPro</code> Domain-level app settings to update.</p>
        pub fn r_studio_server_pro_domain_settings_for_update(
            mut self,
            input: crate::model::RStudioServerProDomainSettingsForUpdate,
        ) -> Self {
            self.r_studio_server_pro_domain_settings_for_update = Some(input);
            self
        }
        /// <p>A collection of <code>RStudioServerPro</code> Domain-level app settings to update.</p>
        pub fn set_r_studio_server_pro_domain_settings_for_update(
            mut self,
            input: std::option::Option<crate::model::RStudioServerProDomainSettingsForUpdate>,
        ) -> Self {
            self.r_studio_server_pro_domain_settings_for_update = input;
            self
        }
        /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>. This configuration can only be modified if there are no apps in the <code>InService</code> or <code>Pending</code> state.</p>
        pub fn execution_role_identity_config(
            mut self,
            input: crate::model::ExecutionRoleIdentityConfig,
        ) -> Self {
            self.execution_role_identity_config = Some(input);
            self
        }
        /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>. This configuration can only be modified if there are no apps in the <code>InService</code> or <code>Pending</code> state.</p>
        pub fn set_execution_role_identity_config(
            mut self,
            input: std::option::Option<crate::model::ExecutionRoleIdentityConfig>,
        ) -> Self {
            self.execution_role_identity_config = input;
            self
        }
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// Consumes the builder and constructs a [`DomainSettingsForUpdate`](crate::model::DomainSettingsForUpdate).
        pub fn build(self) -> crate::model::DomainSettingsForUpdate {
            crate::model::DomainSettingsForUpdate {
                r_studio_server_pro_domain_settings_for_update: self
                    .r_studio_server_pro_domain_settings_for_update,
                execution_role_identity_config: self.execution_role_identity_config,
                security_group_ids: self.security_group_ids,
            }
        }
    }
}
impl DomainSettingsForUpdate {
    /// Creates a new builder-style object to manufacture [`DomainSettingsForUpdate`](crate::model::DomainSettingsForUpdate).
    pub fn builder() -> crate::model::domain_settings_for_update::Builder {
        crate::model::domain_settings_for_update::Builder::default()
    }
}

/// When writing a match expression against `ExecutionRoleIdentityConfig`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let executionroleidentityconfig = unimplemented!();
/// match executionroleidentityconfig {
///     ExecutionRoleIdentityConfig::Disabled => { /* ... */ },
///     ExecutionRoleIdentityConfig::UserProfileName => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `executionroleidentityconfig` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ExecutionRoleIdentityConfig::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ExecutionRoleIdentityConfig::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ExecutionRoleIdentityConfig::NewFeature` is defined.
/// Specifically, when `executionroleidentityconfig` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ExecutionRoleIdentityConfig::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ExecutionRoleIdentityConfig {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    UserProfileName,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ExecutionRoleIdentityConfig {
    fn from(s: &str) -> Self {
        match s {
            "DISABLED" => ExecutionRoleIdentityConfig::Disabled,
            "USER_PROFILE_NAME" => ExecutionRoleIdentityConfig::UserProfileName,
            other => ExecutionRoleIdentityConfig::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ExecutionRoleIdentityConfig {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ExecutionRoleIdentityConfig::from(s))
    }
}
impl ExecutionRoleIdentityConfig {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ExecutionRoleIdentityConfig::Disabled => "DISABLED",
            ExecutionRoleIdentityConfig::UserProfileName => "USER_PROFILE_NAME",
            ExecutionRoleIdentityConfig::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["DISABLED", "USER_PROFILE_NAME"]
    }
}
impl AsRef<str> for ExecutionRoleIdentityConfig {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A collection of settings that update the current configuration for the <code>RStudioServerPro</code> Domain-level app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RStudioServerProDomainSettingsForUpdate {
    /// <p>The execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
    #[doc(hidden)]
    pub domain_execution_role_arn: std::option::Option<std::string::String>,
    /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
    #[doc(hidden)]
    pub default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
    /// <p>A URL pointing to an RStudio Connect server.</p>
    #[doc(hidden)]
    pub r_studio_connect_url: std::option::Option<std::string::String>,
    /// <p>A URL pointing to an RStudio Package Manager server.</p>
    #[doc(hidden)]
    pub r_studio_package_manager_url: std::option::Option<std::string::String>,
}
impl RStudioServerProDomainSettingsForUpdate {
    /// <p>The execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
    pub fn domain_execution_role_arn(&self) -> std::option::Option<&str> {
        self.domain_execution_role_arn.as_deref()
    }
    /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
    pub fn default_resource_spec(&self) -> std::option::Option<&crate::model::ResourceSpec> {
        self.default_resource_spec.as_ref()
    }
    /// <p>A URL pointing to an RStudio Connect server.</p>
    pub fn r_studio_connect_url(&self) -> std::option::Option<&str> {
        self.r_studio_connect_url.as_deref()
    }
    /// <p>A URL pointing to an RStudio Package Manager server.</p>
    pub fn r_studio_package_manager_url(&self) -> std::option::Option<&str> {
        self.r_studio_package_manager_url.as_deref()
    }
}
/// See [`RStudioServerProDomainSettingsForUpdate`](crate::model::RStudioServerProDomainSettingsForUpdate).
pub mod r_studio_server_pro_domain_settings_for_update {

    /// A builder for [`RStudioServerProDomainSettingsForUpdate`](crate::model::RStudioServerProDomainSettingsForUpdate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain_execution_role_arn: std::option::Option<std::string::String>,
        pub(crate) default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
        pub(crate) r_studio_connect_url: std::option::Option<std::string::String>,
        pub(crate) r_studio_package_manager_url: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
        pub fn domain_execution_role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_execution_role_arn = Some(input.into());
            self
        }
        /// <p>The execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
        pub fn set_domain_execution_role_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.domain_execution_role_arn = input;
            self
        }
        /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
        pub fn default_resource_spec(mut self, input: crate::model::ResourceSpec) -> Self {
            self.default_resource_spec = Some(input);
            self
        }
        /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
        pub fn set_default_resource_spec(
            mut self,
            input: std::option::Option<crate::model::ResourceSpec>,
        ) -> Self {
            self.default_resource_spec = input;
            self
        }
        /// <p>A URL pointing to an RStudio Connect server.</p>
        pub fn r_studio_connect_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.r_studio_connect_url = Some(input.into());
            self
        }
        /// <p>A URL pointing to an RStudio Connect server.</p>
        pub fn set_r_studio_connect_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.r_studio_connect_url = input;
            self
        }
        /// <p>A URL pointing to an RStudio Package Manager server.</p>
        pub fn r_studio_package_manager_url(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.r_studio_package_manager_url = Some(input.into());
            self
        }
        /// <p>A URL pointing to an RStudio Package Manager server.</p>
        pub fn set_r_studio_package_manager_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.r_studio_package_manager_url = input;
            self
        }
        /// Consumes the builder and constructs a [`RStudioServerProDomainSettingsForUpdate`](crate::model::RStudioServerProDomainSettingsForUpdate).
        pub fn build(self) -> crate::model::RStudioServerProDomainSettingsForUpdate {
            crate::model::RStudioServerProDomainSettingsForUpdate {
                domain_execution_role_arn: self.domain_execution_role_arn,
                default_resource_spec: self.default_resource_spec,
                r_studio_connect_url: self.r_studio_connect_url,
                r_studio_package_manager_url: self.r_studio_package_manager_url,
            }
        }
    }
}
impl RStudioServerProDomainSettingsForUpdate {
    /// Creates a new builder-style object to manufacture [`RStudioServerProDomainSettingsForUpdate`](crate::model::RStudioServerProDomainSettingsForUpdate).
    pub fn builder() -> crate::model::r_studio_server_pro_domain_settings_for_update::Builder {
        crate::model::r_studio_server_pro_domain_settings_for_update::Builder::default()
    }
}

/// <p>Information of a particular device.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Device {
    /// <p>The name of the device.</p>
    #[doc(hidden)]
    pub device_name: std::option::Option<std::string::String>,
    /// <p>Description of the device.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>Amazon Web Services Internet of Things (IoT) object name.</p>
    #[doc(hidden)]
    pub iot_thing_name: std::option::Option<std::string::String>,
}
impl Device {
    /// <p>The name of the device.</p>
    pub fn device_name(&self) -> std::option::Option<&str> {
        self.device_name.as_deref()
    }
    /// <p>Description of the device.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>Amazon Web Services Internet of Things (IoT) object name.</p>
    pub fn iot_thing_name(&self) -> std::option::Option<&str> {
        self.iot_thing_name.as_deref()
    }
}
/// See [`Device`](crate::model::Device).
pub mod device {

    /// A builder for [`Device`](crate::model::Device).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) device_name: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) iot_thing_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the device.</p>
        pub fn device_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_name = Some(input.into());
            self
        }
        /// <p>The name of the device.</p>
        pub fn set_device_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.device_name = input;
            self
        }
        /// <p>Description of the device.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>Description of the device.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>Amazon Web Services Internet of Things (IoT) object name.</p>
        pub fn iot_thing_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.iot_thing_name = Some(input.into());
            self
        }
        /// <p>Amazon Web Services Internet of Things (IoT) object name.</p>
        pub fn set_iot_thing_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.iot_thing_name = input;
            self
        }
        /// Consumes the builder and constructs a [`Device`](crate::model::Device).
        pub fn build(self) -> crate::model::Device {
            crate::model::Device {
                device_name: self.device_name,
                description: self.description,
                iot_thing_name: self.iot_thing_name,
            }
        }
    }
}
impl Device {
    /// Creates a new builder-style object to manufacture [`Device`](crate::model::Device).
    pub fn builder() -> crate::model::device::Builder {
        crate::model::device::Builder::default()
    }
}

/// <p>The output configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeOutputConfig {
    /// <p>The Amazon Simple Storage (S3) bucker URI.</p>
    #[doc(hidden)]
    pub s3_output_location: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>The deployment type SageMaker Edge Manager will create. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
    #[doc(hidden)]
    pub preset_deployment_type: std::option::Option<crate::model::EdgePresetDeploymentType>,
    /// <p>The configuration used to create deployment artifacts. Specify configuration options with a JSON string. The available configuration options for each type are:</p>
    /// <ul>
    /// <li> <p> <code>ComponentName</code> (optional) - Name of the GreenGrass V2 component. If not specified, the default name generated consists of "SagemakerEdgeManager" and the name of your SageMaker Edge Manager packaging job.</p> </li>
    /// <li> <p> <code>ComponentDescription</code> (optional) - Description of the component.</p> </li>
    /// <li> <p> <code>ComponentVersion</code> (optional) - The version of the component.</p> <note>
    /// <p>Amazon Web Services IoT Greengrass uses semantic versions for components. Semantic versions follow a<i> major.minor.patch</i> number system. For example, version 1.0.0 represents the first major release for a component. For more information, see the <a href="https://semver.org/">semantic version specification</a>.</p>
    /// </note> </li>
    /// <li> <p> <code>PlatformOS</code> (optional) - The name of the operating system for the platform. Supported platforms include Windows and Linux.</p> </li>
    /// <li> <p> <code>PlatformArchitecture</code> (optional) - The processor architecture for the platform. </p> <p>Supported architectures Windows include: Windows32_x86, Windows64_x64.</p> <p>Supported architectures for Linux include: Linux x86_64, Linux ARMV8.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub preset_deployment_config: std::option::Option<std::string::String>,
}
impl EdgeOutputConfig {
    /// <p>The Amazon Simple Storage (S3) bucker URI.</p>
    pub fn s3_output_location(&self) -> std::option::Option<&str> {
        self.s3_output_location.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>The deployment type SageMaker Edge Manager will create. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
    pub fn preset_deployment_type(
        &self,
    ) -> std::option::Option<&crate::model::EdgePresetDeploymentType> {
        self.preset_deployment_type.as_ref()
    }
    /// <p>The configuration used to create deployment artifacts. Specify configuration options with a JSON string. The available configuration options for each type are:</p>
    /// <ul>
    /// <li> <p> <code>ComponentName</code> (optional) - Name of the GreenGrass V2 component. If not specified, the default name generated consists of "SagemakerEdgeManager" and the name of your SageMaker Edge Manager packaging job.</p> </li>
    /// <li> <p> <code>ComponentDescription</code> (optional) - Description of the component.</p> </li>
    /// <li> <p> <code>ComponentVersion</code> (optional) - The version of the component.</p> <note>
    /// <p>Amazon Web Services IoT Greengrass uses semantic versions for components. Semantic versions follow a<i> major.minor.patch</i> number system. For example, version 1.0.0 represents the first major release for a component. For more information, see the <a href="https://semver.org/">semantic version specification</a>.</p>
    /// </note> </li>
    /// <li> <p> <code>PlatformOS</code> (optional) - The name of the operating system for the platform. Supported platforms include Windows and Linux.</p> </li>
    /// <li> <p> <code>PlatformArchitecture</code> (optional) - The processor architecture for the platform. </p> <p>Supported architectures Windows include: Windows32_x86, Windows64_x64.</p> <p>Supported architectures for Linux include: Linux x86_64, Linux ARMV8.</p> </li>
    /// </ul>
    pub fn preset_deployment_config(&self) -> std::option::Option<&str> {
        self.preset_deployment_config.as_deref()
    }
}
/// See [`EdgeOutputConfig`](crate::model::EdgeOutputConfig).
pub mod edge_output_config {

    /// A builder for [`EdgeOutputConfig`](crate::model::EdgeOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_location: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) preset_deployment_type:
            std::option::Option<crate::model::EdgePresetDeploymentType>,
        pub(crate) preset_deployment_config: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Simple Storage (S3) bucker URI.</p>
        pub fn s3_output_location(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_location = Some(input.into());
            self
        }
        /// <p>The Amazon Simple Storage (S3) bucker URI.</p>
        pub fn set_s3_output_location(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_location = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>The deployment type SageMaker Edge Manager will create. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
        pub fn preset_deployment_type(
            mut self,
            input: crate::model::EdgePresetDeploymentType,
        ) -> Self {
            self.preset_deployment_type = Some(input);
            self
        }
        /// <p>The deployment type SageMaker Edge Manager will create. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
        pub fn set_preset_deployment_type(
            mut self,
            input: std::option::Option<crate::model::EdgePresetDeploymentType>,
        ) -> Self {
            self.preset_deployment_type = input;
            self
        }
        /// <p>The configuration used to create deployment artifacts. Specify configuration options with a JSON string. The available configuration options for each type are:</p>
        /// <ul>
        /// <li> <p> <code>ComponentName</code> (optional) - Name of the GreenGrass V2 component. If not specified, the default name generated consists of "SagemakerEdgeManager" and the name of your SageMaker Edge Manager packaging job.</p> </li>
        /// <li> <p> <code>ComponentDescription</code> (optional) - Description of the component.</p> </li>
        /// <li> <p> <code>ComponentVersion</code> (optional) - The version of the component.</p> <note>
        /// <p>Amazon Web Services IoT Greengrass uses semantic versions for components. Semantic versions follow a<i> major.minor.patch</i> number system. For example, version 1.0.0 represents the first major release for a component. For more information, see the <a href="https://semver.org/">semantic version specification</a>.</p>
        /// </note> </li>
        /// <li> <p> <code>PlatformOS</code> (optional) - The name of the operating system for the platform. Supported platforms include Windows and Linux.</p> </li>
        /// <li> <p> <code>PlatformArchitecture</code> (optional) - The processor architecture for the platform. </p> <p>Supported architectures Windows include: Windows32_x86, Windows64_x64.</p> <p>Supported architectures for Linux include: Linux x86_64, Linux ARMV8.</p> </li>
        /// </ul>
        pub fn preset_deployment_config(mut self, input: impl Into<std::string::String>) -> Self {
            self.preset_deployment_config = Some(input.into());
            self
        }
        /// <p>The configuration used to create deployment artifacts. Specify configuration options with a JSON string. The available configuration options for each type are:</p>
        /// <ul>
        /// <li> <p> <code>ComponentName</code> (optional) - Name of the GreenGrass V2 component. If not specified, the default name generated consists of "SagemakerEdgeManager" and the name of your SageMaker Edge Manager packaging job.</p> </li>
        /// <li> <p> <code>ComponentDescription</code> (optional) - Description of the component.</p> </li>
        /// <li> <p> <code>ComponentVersion</code> (optional) - The version of the component.</p> <note>
        /// <p>Amazon Web Services IoT Greengrass uses semantic versions for components. Semantic versions follow a<i> major.minor.patch</i> number system. For example, version 1.0.0 represents the first major release for a component. For more information, see the <a href="https://semver.org/">semantic version specification</a>.</p>
        /// </note> </li>
        /// <li> <p> <code>PlatformOS</code> (optional) - The name of the operating system for the platform. Supported platforms include Windows and Linux.</p> </li>
        /// <li> <p> <code>PlatformArchitecture</code> (optional) - The processor architecture for the platform. </p> <p>Supported architectures Windows include: Windows32_x86, Windows64_x64.</p> <p>Supported architectures for Linux include: Linux x86_64, Linux ARMV8.</p> </li>
        /// </ul>
        pub fn set_preset_deployment_config(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.preset_deployment_config = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeOutputConfig`](crate::model::EdgeOutputConfig).
        pub fn build(self) -> crate::model::EdgeOutputConfig {
            crate::model::EdgeOutputConfig {
                s3_output_location: self.s3_output_location,
                kms_key_id: self.kms_key_id,
                preset_deployment_type: self.preset_deployment_type,
                preset_deployment_config: self.preset_deployment_config,
            }
        }
    }
}
impl EdgeOutputConfig {
    /// Creates a new builder-style object to manufacture [`EdgeOutputConfig`](crate::model::EdgeOutputConfig).
    pub fn builder() -> crate::model::edge_output_config::Builder {
        crate::model::edge_output_config::Builder::default()
    }
}

/// When writing a match expression against `EdgePresetDeploymentType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let edgepresetdeploymenttype = unimplemented!();
/// match edgepresetdeploymenttype {
///     EdgePresetDeploymentType::GreengrassV2Component => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `edgepresetdeploymenttype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `EdgePresetDeploymentType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `EdgePresetDeploymentType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `EdgePresetDeploymentType::NewFeature` is defined.
/// Specifically, when `edgepresetdeploymenttype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `EdgePresetDeploymentType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum EdgePresetDeploymentType {
    #[allow(missing_docs)] // documentation missing in model
    GreengrassV2Component,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for EdgePresetDeploymentType {
    fn from(s: &str) -> Self {
        match s {
            "GreengrassV2Component" => EdgePresetDeploymentType::GreengrassV2Component,
            other => EdgePresetDeploymentType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for EdgePresetDeploymentType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(EdgePresetDeploymentType::from(s))
    }
}
impl EdgePresetDeploymentType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            EdgePresetDeploymentType::GreengrassV2Component => "GreengrassV2Component",
            EdgePresetDeploymentType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["GreengrassV2Component"]
    }
}
impl AsRef<str> for EdgePresetDeploymentType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies configuration details for a Git repository when the repository is updated.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct GitConfigForUpdate {
    /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
    /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
    #[doc(hidden)]
    pub secret_arn: std::option::Option<std::string::String>,
}
impl GitConfigForUpdate {
    /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
    /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
    pub fn secret_arn(&self) -> std::option::Option<&str> {
        self.secret_arn.as_deref()
    }
}
/// See [`GitConfigForUpdate`](crate::model::GitConfigForUpdate).
pub mod git_config_for_update {

    /// A builder for [`GitConfigForUpdate`](crate::model::GitConfigForUpdate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) secret_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
        /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
        pub fn secret_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.secret_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
        /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
        pub fn set_secret_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.secret_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`GitConfigForUpdate`](crate::model::GitConfigForUpdate).
        pub fn build(self) -> crate::model::GitConfigForUpdate {
            crate::model::GitConfigForUpdate {
                secret_arn: self.secret_arn,
            }
        }
    }
}
impl GitConfigForUpdate {
    /// Creates a new builder-style object to manufacture [`GitConfigForUpdate`](crate::model::GitConfigForUpdate).
    pub fn builder() -> crate::model::git_config_for_update::Builder {
        crate::model::git_config_for_update::Builder::default()
    }
}

/// <p>The configuration for the file system and kernels in a SageMaker image running as a KernelGateway app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct KernelGatewayImageConfig {
    /// <p>The specification of the Jupyter kernels in the image.</p>
    #[doc(hidden)]
    pub kernel_specs: std::option::Option<std::vec::Vec<crate::model::KernelSpec>>,
    /// <p>The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.</p>
    #[doc(hidden)]
    pub file_system_config: std::option::Option<crate::model::FileSystemConfig>,
}
impl KernelGatewayImageConfig {
    /// <p>The specification of the Jupyter kernels in the image.</p>
    pub fn kernel_specs(&self) -> std::option::Option<&[crate::model::KernelSpec]> {
        self.kernel_specs.as_deref()
    }
    /// <p>The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.</p>
    pub fn file_system_config(&self) -> std::option::Option<&crate::model::FileSystemConfig> {
        self.file_system_config.as_ref()
    }
}
/// See [`KernelGatewayImageConfig`](crate::model::KernelGatewayImageConfig).
pub mod kernel_gateway_image_config {

    /// A builder for [`KernelGatewayImageConfig`](crate::model::KernelGatewayImageConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kernel_specs: std::option::Option<std::vec::Vec<crate::model::KernelSpec>>,
        pub(crate) file_system_config: std::option::Option<crate::model::FileSystemConfig>,
    }
    impl Builder {
        /// Appends an item to `kernel_specs`.
        ///
        /// To override the contents of this collection use [`set_kernel_specs`](Self::set_kernel_specs).
        ///
        /// <p>The specification of the Jupyter kernels in the image.</p>
        pub fn kernel_specs(mut self, input: crate::model::KernelSpec) -> Self {
            let mut v = self.kernel_specs.unwrap_or_default();
            v.push(input);
            self.kernel_specs = Some(v);
            self
        }
        /// <p>The specification of the Jupyter kernels in the image.</p>
        pub fn set_kernel_specs(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::KernelSpec>>,
        ) -> Self {
            self.kernel_specs = input;
            self
        }
        /// <p>The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.</p>
        pub fn file_system_config(mut self, input: crate::model::FileSystemConfig) -> Self {
            self.file_system_config = Some(input);
            self
        }
        /// <p>The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.</p>
        pub fn set_file_system_config(
            mut self,
            input: std::option::Option<crate::model::FileSystemConfig>,
        ) -> Self {
            self.file_system_config = input;
            self
        }
        /// Consumes the builder and constructs a [`KernelGatewayImageConfig`](crate::model::KernelGatewayImageConfig).
        pub fn build(self) -> crate::model::KernelGatewayImageConfig {
            crate::model::KernelGatewayImageConfig {
                kernel_specs: self.kernel_specs,
                file_system_config: self.file_system_config,
            }
        }
    }
}
impl KernelGatewayImageConfig {
    /// Creates a new builder-style object to manufacture [`KernelGatewayImageConfig`](crate::model::KernelGatewayImageConfig).
    pub fn builder() -> crate::model::kernel_gateway_image_config::Builder {
        crate::model::kernel_gateway_image_config::Builder::default()
    }
}

/// <p>The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FileSystemConfig {
    /// <p>The path within the image to mount the user's EFS home directory. The directory should be empty. If not specified, defaults to <i>/home/sagemaker-user</i>.</p>
    #[doc(hidden)]
    pub mount_path: std::option::Option<std::string::String>,
    /// <p>The default POSIX user ID (UID). If not specified, defaults to <code>1000</code>.</p>
    #[doc(hidden)]
    pub default_uid: std::option::Option<i32>,
    /// <p>The default POSIX group ID (GID). If not specified, defaults to <code>100</code>.</p>
    #[doc(hidden)]
    pub default_gid: std::option::Option<i32>,
}
impl FileSystemConfig {
    /// <p>The path within the image to mount the user's EFS home directory. The directory should be empty. If not specified, defaults to <i>/home/sagemaker-user</i>.</p>
    pub fn mount_path(&self) -> std::option::Option<&str> {
        self.mount_path.as_deref()
    }
    /// <p>The default POSIX user ID (UID). If not specified, defaults to <code>1000</code>.</p>
    pub fn default_uid(&self) -> std::option::Option<i32> {
        self.default_uid
    }
    /// <p>The default POSIX group ID (GID). If not specified, defaults to <code>100</code>.</p>
    pub fn default_gid(&self) -> std::option::Option<i32> {
        self.default_gid
    }
}
/// See [`FileSystemConfig`](crate::model::FileSystemConfig).
pub mod file_system_config {

    /// A builder for [`FileSystemConfig`](crate::model::FileSystemConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) mount_path: std::option::Option<std::string::String>,
        pub(crate) default_uid: std::option::Option<i32>,
        pub(crate) default_gid: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The path within the image to mount the user's EFS home directory. The directory should be empty. If not specified, defaults to <i>/home/sagemaker-user</i>.</p>
        pub fn mount_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.mount_path = Some(input.into());
            self
        }
        /// <p>The path within the image to mount the user's EFS home directory. The directory should be empty. If not specified, defaults to <i>/home/sagemaker-user</i>.</p>
        pub fn set_mount_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.mount_path = input;
            self
        }
        /// <p>The default POSIX user ID (UID). If not specified, defaults to <code>1000</code>.</p>
        pub fn default_uid(mut self, input: i32) -> Self {
            self.default_uid = Some(input);
            self
        }
        /// <p>The default POSIX user ID (UID). If not specified, defaults to <code>1000</code>.</p>
        pub fn set_default_uid(mut self, input: std::option::Option<i32>) -> Self {
            self.default_uid = input;
            self
        }
        /// <p>The default POSIX group ID (GID). If not specified, defaults to <code>100</code>.</p>
        pub fn default_gid(mut self, input: i32) -> Self {
            self.default_gid = Some(input);
            self
        }
        /// <p>The default POSIX group ID (GID). If not specified, defaults to <code>100</code>.</p>
        pub fn set_default_gid(mut self, input: std::option::Option<i32>) -> Self {
            self.default_gid = input;
            self
        }
        /// Consumes the builder and constructs a [`FileSystemConfig`](crate::model::FileSystemConfig).
        pub fn build(self) -> crate::model::FileSystemConfig {
            crate::model::FileSystemConfig {
                mount_path: self.mount_path,
                default_uid: self.default_uid,
                default_gid: self.default_gid,
            }
        }
    }
}
impl FileSystemConfig {
    /// Creates a new builder-style object to manufacture [`FileSystemConfig`](crate::model::FileSystemConfig).
    pub fn builder() -> crate::model::file_system_config::Builder {
        crate::model::file_system_config::Builder::default()
    }
}

/// <p>The specification of a Jupyter kernel.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct KernelSpec {
    /// <p>The name of the Jupyter kernel in the image. This value is case sensitive.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The display name of the kernel.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
}
impl KernelSpec {
    /// <p>The name of the Jupyter kernel in the image. This value is case sensitive.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The display name of the kernel.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
}
/// See [`KernelSpec`](crate::model::KernelSpec).
pub mod kernel_spec {

    /// A builder for [`KernelSpec`](crate::model::KernelSpec).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the Jupyter kernel in the image. This value is case sensitive.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the Jupyter kernel in the image. This value is case sensitive.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The display name of the kernel.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The display name of the kernel.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// Consumes the builder and constructs a [`KernelSpec`](crate::model::KernelSpec).
        pub fn build(self) -> crate::model::KernelSpec {
            crate::model::KernelSpec {
                name: self.name,
                display_name: self.display_name,
            }
        }
    }
}
impl KernelSpec {
    /// Creates a new builder-style object to manufacture [`KernelSpec`](crate::model::KernelSpec).
    pub fn builder() -> crate::model::kernel_spec::Builder {
        crate::model::kernel_spec::Builder::default()
    }
}

/// When writing a match expression against `ActionStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let actionstatus = unimplemented!();
/// match actionstatus {
///     ActionStatus::Completed => { /* ... */ },
///     ActionStatus::Failed => { /* ... */ },
///     ActionStatus::InProgress => { /* ... */ },
///     ActionStatus::Stopped => { /* ... */ },
///     ActionStatus::Stopping => { /* ... */ },
///     ActionStatus::UnknownValue => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `actionstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ActionStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ActionStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ActionStatus::NewFeature` is defined.
/// Specifically, when `actionstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ActionStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// _Note: `ActionStatus::Unknown` has been renamed to `::UnknownValue`._
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ActionStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// _Note: `::Unknown` has been renamed to `::UnknownValue`._
    UnknownValue,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ActionStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => ActionStatus::Completed,
            "Failed" => ActionStatus::Failed,
            "InProgress" => ActionStatus::InProgress,
            "Stopped" => ActionStatus::Stopped,
            "Stopping" => ActionStatus::Stopping,
            "Unknown" => ActionStatus::UnknownValue,
            other => ActionStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ActionStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ActionStatus::from(s))
    }
}
impl ActionStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ActionStatus::Completed => "Completed",
            ActionStatus::Failed => "Failed",
            ActionStatus::InProgress => "InProgress",
            ActionStatus::Stopped => "Stopped",
            ActionStatus::Stopping => "Stopping",
            ActionStatus::UnknownValue => "Unknown",
            ActionStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Completed",
            "Failed",
            "InProgress",
            "Stopped",
            "Stopping",
            "Unknown",
        ]
    }
}
impl AsRef<str> for ActionStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `InferenceExperimentStopDesiredState`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let inferenceexperimentstopdesiredstate = unimplemented!();
/// match inferenceexperimentstopdesiredstate {
///     InferenceExperimentStopDesiredState::Cancelled => { /* ... */ },
///     InferenceExperimentStopDesiredState::Completed => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `inferenceexperimentstopdesiredstate` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `InferenceExperimentStopDesiredState::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `InferenceExperimentStopDesiredState::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `InferenceExperimentStopDesiredState::NewFeature` is defined.
/// Specifically, when `inferenceexperimentstopdesiredstate` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `InferenceExperimentStopDesiredState::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum InferenceExperimentStopDesiredState {
    #[allow(missing_docs)] // documentation missing in model
    Cancelled,
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for InferenceExperimentStopDesiredState {
    fn from(s: &str) -> Self {
        match s {
            "Cancelled" => InferenceExperimentStopDesiredState::Cancelled,
            "Completed" => InferenceExperimentStopDesiredState::Completed,
            other => InferenceExperimentStopDesiredState::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for InferenceExperimentStopDesiredState {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(InferenceExperimentStopDesiredState::from(s))
    }
}
impl InferenceExperimentStopDesiredState {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            InferenceExperimentStopDesiredState::Cancelled => "Cancelled",
            InferenceExperimentStopDesiredState::Completed => "Completed",
            InferenceExperimentStopDesiredState::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Cancelled", "Completed"]
    }
}
impl AsRef<str> for InferenceExperimentStopDesiredState {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelVariantAction`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelvariantaction = unimplemented!();
/// match modelvariantaction {
///     ModelVariantAction::Promote => { /* ... */ },
///     ModelVariantAction::Remove => { /* ... */ },
///     ModelVariantAction::Retain => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelvariantaction` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelVariantAction::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelVariantAction::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelVariantAction::NewFeature` is defined.
/// Specifically, when `modelvariantaction` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelVariantAction::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelVariantAction {
    #[allow(missing_docs)] // documentation missing in model
    Promote,
    #[allow(missing_docs)] // documentation missing in model
    Remove,
    #[allow(missing_docs)] // documentation missing in model
    Retain,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelVariantAction {
    fn from(s: &str) -> Self {
        match s {
            "Promote" => ModelVariantAction::Promote,
            "Remove" => ModelVariantAction::Remove,
            "Retain" => ModelVariantAction::Retain,
            other => {
                ModelVariantAction::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelVariantAction {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelVariantAction::from(s))
    }
}
impl ModelVariantAction {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelVariantAction::Promote => "Promote",
            ModelVariantAction::Remove => "Remove",
            ModelVariantAction::Retain => "Retain",
            ModelVariantAction::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Promote", "Remove", "Retain"]
    }
}
impl AsRef<str> for ModelVariantAction {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Assigns a value to a named Pipeline parameter.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Parameter {
    /// <p>The name of the parameter to assign a value to. This parameter name must match a named parameter in the pipeline definition.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The literal value for the parameter.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl Parameter {
    /// <p>The name of the parameter to assign a value to. This parameter name must match a named parameter in the pipeline definition.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The literal value for the parameter.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`Parameter`](crate::model::Parameter).
pub mod parameter {

    /// A builder for [`Parameter`](crate::model::Parameter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the parameter to assign a value to. This parameter name must match a named parameter in the pipeline definition.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the parameter to assign a value to. This parameter name must match a named parameter in the pipeline definition.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The literal value for the parameter.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The literal value for the parameter.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`Parameter`](crate::model::Parameter).
        pub fn build(self) -> crate::model::Parameter {
            crate::model::Parameter {
                name: self.name,
                value: self.value,
            }
        }
    }
}
impl Parameter {
    /// Creates a new builder-style object to manufacture [`Parameter`](crate::model::Parameter).
    pub fn builder() -> crate::model::parameter::Builder {
        crate::model::parameter::Builder::default()
    }
}

/// <p>An output parameter of a pipeline step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OutputParameter {
    /// <p>The name of the output parameter.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The value of the output parameter.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl OutputParameter {
    /// <p>The name of the output parameter.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The value of the output parameter.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`OutputParameter`](crate::model::OutputParameter).
pub mod output_parameter {

    /// A builder for [`OutputParameter`](crate::model::OutputParameter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the output parameter.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the output parameter.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The value of the output parameter.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The value of the output parameter.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`OutputParameter`](crate::model::OutputParameter).
        pub fn build(self) -> crate::model::OutputParameter {
            crate::model::OutputParameter {
                name: self.name,
                value: self.value,
            }
        }
    }
}
impl OutputParameter {
    /// Creates a new builder-style object to manufacture [`OutputParameter`](crate::model::OutputParameter).
    pub fn builder() -> crate::model::output_parameter::Builder {
        crate::model::output_parameter::Builder::default()
    }
}

/// <p>A single resource returned as part of the <code>Search</code> API response.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SearchRecord {
    /// <p>The properties of a training job.</p>
    #[doc(hidden)]
    pub training_job: std::option::Option<crate::model::TrainingJob>,
    /// <p>The properties of an experiment.</p>
    #[doc(hidden)]
    pub experiment: std::option::Option<crate::model::Experiment>,
    /// <p>The properties of a trial.</p>
    #[doc(hidden)]
    pub trial: std::option::Option<crate::model::Trial>,
    /// <p>The properties of a trial component.</p>
    #[doc(hidden)]
    pub trial_component: std::option::Option<crate::model::TrialComponent>,
    /// <p>A hosted endpoint for real-time inference.</p>
    #[doc(hidden)]
    pub endpoint: std::option::Option<crate::model::Endpoint>,
    /// <p>A versioned model that can be deployed for SageMaker inference.</p>
    #[doc(hidden)]
    pub model_package: std::option::Option<crate::model::ModelPackage>,
    /// <p>A group of versioned models in the model registry.</p>
    #[doc(hidden)]
    pub model_package_group: std::option::Option<crate::model::ModelPackageGroup>,
    /// <p>A SageMaker Model Building Pipeline instance.</p>
    #[doc(hidden)]
    pub pipeline: std::option::Option<crate::model::Pipeline>,
    /// <p>An execution of a pipeline.</p>
    #[doc(hidden)]
    pub pipeline_execution: std::option::Option<crate::model::PipelineExecution>,
    /// <p>Amazon SageMaker Feature Store stores features in a collection called Feature Group. A Feature Group can be visualized as a table which has rows, with a unique identifier for each row where each column in the table is a feature. In principle, a Feature Group is composed of features and values per features.</p>
    #[doc(hidden)]
    pub feature_group: std::option::Option<crate::model::FeatureGroup>,
    /// <p>The properties of a project.</p>
    #[doc(hidden)]
    pub project: std::option::Option<crate::model::Project>,
    /// <p>The feature metadata used to search through the features.</p>
    #[doc(hidden)]
    pub feature_metadata: std::option::Option<crate::model::FeatureMetadata>,
    /// <p>The properties of a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job:
        std::option::Option<crate::model::HyperParameterTuningJobSearchEntity>,
    /// <p>A model displayed in the Amazon SageMaker Model Dashboard.</p>
    #[doc(hidden)]
    pub model: std::option::Option<crate::model::ModelDashboardModel>,
    /// <p>An Amazon SageMaker Model Card that documents details about a machine learning model.</p>
    #[doc(hidden)]
    pub model_card: std::option::Option<crate::model::ModelCard>,
}
impl SearchRecord {
    /// <p>The properties of a training job.</p>
    pub fn training_job(&self) -> std::option::Option<&crate::model::TrainingJob> {
        self.training_job.as_ref()
    }
    /// <p>The properties of an experiment.</p>
    pub fn experiment(&self) -> std::option::Option<&crate::model::Experiment> {
        self.experiment.as_ref()
    }
    /// <p>The properties of a trial.</p>
    pub fn trial(&self) -> std::option::Option<&crate::model::Trial> {
        self.trial.as_ref()
    }
    /// <p>The properties of a trial component.</p>
    pub fn trial_component(&self) -> std::option::Option<&crate::model::TrialComponent> {
        self.trial_component.as_ref()
    }
    /// <p>A hosted endpoint for real-time inference.</p>
    pub fn endpoint(&self) -> std::option::Option<&crate::model::Endpoint> {
        self.endpoint.as_ref()
    }
    /// <p>A versioned model that can be deployed for SageMaker inference.</p>
    pub fn model_package(&self) -> std::option::Option<&crate::model::ModelPackage> {
        self.model_package.as_ref()
    }
    /// <p>A group of versioned models in the model registry.</p>
    pub fn model_package_group(&self) -> std::option::Option<&crate::model::ModelPackageGroup> {
        self.model_package_group.as_ref()
    }
    /// <p>A SageMaker Model Building Pipeline instance.</p>
    pub fn pipeline(&self) -> std::option::Option<&crate::model::Pipeline> {
        self.pipeline.as_ref()
    }
    /// <p>An execution of a pipeline.</p>
    pub fn pipeline_execution(&self) -> std::option::Option<&crate::model::PipelineExecution> {
        self.pipeline_execution.as_ref()
    }
    /// <p>Amazon SageMaker Feature Store stores features in a collection called Feature Group. A Feature Group can be visualized as a table which has rows, with a unique identifier for each row where each column in the table is a feature. In principle, a Feature Group is composed of features and values per features.</p>
    pub fn feature_group(&self) -> std::option::Option<&crate::model::FeatureGroup> {
        self.feature_group.as_ref()
    }
    /// <p>The properties of a project.</p>
    pub fn project(&self) -> std::option::Option<&crate::model::Project> {
        self.project.as_ref()
    }
    /// <p>The feature metadata used to search through the features.</p>
    pub fn feature_metadata(&self) -> std::option::Option<&crate::model::FeatureMetadata> {
        self.feature_metadata.as_ref()
    }
    /// <p>The properties of a hyperparameter tuning job.</p>
    pub fn hyper_parameter_tuning_job(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobSearchEntity> {
        self.hyper_parameter_tuning_job.as_ref()
    }
    /// <p>A model displayed in the Amazon SageMaker Model Dashboard.</p>
    pub fn model(&self) -> std::option::Option<&crate::model::ModelDashboardModel> {
        self.model.as_ref()
    }
    /// <p>An Amazon SageMaker Model Card that documents details about a machine learning model.</p>
    pub fn model_card(&self) -> std::option::Option<&crate::model::ModelCard> {
        self.model_card.as_ref()
    }
}
/// See [`SearchRecord`](crate::model::SearchRecord).
pub mod search_record {

    /// A builder for [`SearchRecord`](crate::model::SearchRecord).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_job: std::option::Option<crate::model::TrainingJob>,
        pub(crate) experiment: std::option::Option<crate::model::Experiment>,
        pub(crate) trial: std::option::Option<crate::model::Trial>,
        pub(crate) trial_component: std::option::Option<crate::model::TrialComponent>,
        pub(crate) endpoint: std::option::Option<crate::model::Endpoint>,
        pub(crate) model_package: std::option::Option<crate::model::ModelPackage>,
        pub(crate) model_package_group: std::option::Option<crate::model::ModelPackageGroup>,
        pub(crate) pipeline: std::option::Option<crate::model::Pipeline>,
        pub(crate) pipeline_execution: std::option::Option<crate::model::PipelineExecution>,
        pub(crate) feature_group: std::option::Option<crate::model::FeatureGroup>,
        pub(crate) project: std::option::Option<crate::model::Project>,
        pub(crate) feature_metadata: std::option::Option<crate::model::FeatureMetadata>,
        pub(crate) hyper_parameter_tuning_job:
            std::option::Option<crate::model::HyperParameterTuningJobSearchEntity>,
        pub(crate) model: std::option::Option<crate::model::ModelDashboardModel>,
        pub(crate) model_card: std::option::Option<crate::model::ModelCard>,
    }
    impl Builder {
        /// <p>The properties of a training job.</p>
        pub fn training_job(mut self, input: crate::model::TrainingJob) -> Self {
            self.training_job = Some(input);
            self
        }
        /// <p>The properties of a training job.</p>
        pub fn set_training_job(
            mut self,
            input: std::option::Option<crate::model::TrainingJob>,
        ) -> Self {
            self.training_job = input;
            self
        }
        /// <p>The properties of an experiment.</p>
        pub fn experiment(mut self, input: crate::model::Experiment) -> Self {
            self.experiment = Some(input);
            self
        }
        /// <p>The properties of an experiment.</p>
        pub fn set_experiment(
            mut self,
            input: std::option::Option<crate::model::Experiment>,
        ) -> Self {
            self.experiment = input;
            self
        }
        /// <p>The properties of a trial.</p>
        pub fn trial(mut self, input: crate::model::Trial) -> Self {
            self.trial = Some(input);
            self
        }
        /// <p>The properties of a trial.</p>
        pub fn set_trial(mut self, input: std::option::Option<crate::model::Trial>) -> Self {
            self.trial = input;
            self
        }
        /// <p>The properties of a trial component.</p>
        pub fn trial_component(mut self, input: crate::model::TrialComponent) -> Self {
            self.trial_component = Some(input);
            self
        }
        /// <p>The properties of a trial component.</p>
        pub fn set_trial_component(
            mut self,
            input: std::option::Option<crate::model::TrialComponent>,
        ) -> Self {
            self.trial_component = input;
            self
        }
        /// <p>A hosted endpoint for real-time inference.</p>
        pub fn endpoint(mut self, input: crate::model::Endpoint) -> Self {
            self.endpoint = Some(input);
            self
        }
        /// <p>A hosted endpoint for real-time inference.</p>
        pub fn set_endpoint(mut self, input: std::option::Option<crate::model::Endpoint>) -> Self {
            self.endpoint = input;
            self
        }
        /// <p>A versioned model that can be deployed for SageMaker inference.</p>
        pub fn model_package(mut self, input: crate::model::ModelPackage) -> Self {
            self.model_package = Some(input);
            self
        }
        /// <p>A versioned model that can be deployed for SageMaker inference.</p>
        pub fn set_model_package(
            mut self,
            input: std::option::Option<crate::model::ModelPackage>,
        ) -> Self {
            self.model_package = input;
            self
        }
        /// <p>A group of versioned models in the model registry.</p>
        pub fn model_package_group(mut self, input: crate::model::ModelPackageGroup) -> Self {
            self.model_package_group = Some(input);
            self
        }
        /// <p>A group of versioned models in the model registry.</p>
        pub fn set_model_package_group(
            mut self,
            input: std::option::Option<crate::model::ModelPackageGroup>,
        ) -> Self {
            self.model_package_group = input;
            self
        }
        /// <p>A SageMaker Model Building Pipeline instance.</p>
        pub fn pipeline(mut self, input: crate::model::Pipeline) -> Self {
            self.pipeline = Some(input);
            self
        }
        /// <p>A SageMaker Model Building Pipeline instance.</p>
        pub fn set_pipeline(mut self, input: std::option::Option<crate::model::Pipeline>) -> Self {
            self.pipeline = input;
            self
        }
        /// <p>An execution of a pipeline.</p>
        pub fn pipeline_execution(mut self, input: crate::model::PipelineExecution) -> Self {
            self.pipeline_execution = Some(input);
            self
        }
        /// <p>An execution of a pipeline.</p>
        pub fn set_pipeline_execution(
            mut self,
            input: std::option::Option<crate::model::PipelineExecution>,
        ) -> Self {
            self.pipeline_execution = input;
            self
        }
        /// <p>Amazon SageMaker Feature Store stores features in a collection called Feature Group. A Feature Group can be visualized as a table which has rows, with a unique identifier for each row where each column in the table is a feature. In principle, a Feature Group is composed of features and values per features.</p>
        pub fn feature_group(mut self, input: crate::model::FeatureGroup) -> Self {
            self.feature_group = Some(input);
            self
        }
        /// <p>Amazon SageMaker Feature Store stores features in a collection called Feature Group. A Feature Group can be visualized as a table which has rows, with a unique identifier for each row where each column in the table is a feature. In principle, a Feature Group is composed of features and values per features.</p>
        pub fn set_feature_group(
            mut self,
            input: std::option::Option<crate::model::FeatureGroup>,
        ) -> Self {
            self.feature_group = input;
            self
        }
        /// <p>The properties of a project.</p>
        pub fn project(mut self, input: crate::model::Project) -> Self {
            self.project = Some(input);
            self
        }
        /// <p>The properties of a project.</p>
        pub fn set_project(mut self, input: std::option::Option<crate::model::Project>) -> Self {
            self.project = input;
            self
        }
        /// <p>The feature metadata used to search through the features.</p>
        pub fn feature_metadata(mut self, input: crate::model::FeatureMetadata) -> Self {
            self.feature_metadata = Some(input);
            self
        }
        /// <p>The feature metadata used to search through the features.</p>
        pub fn set_feature_metadata(
            mut self,
            input: std::option::Option<crate::model::FeatureMetadata>,
        ) -> Self {
            self.feature_metadata = input;
            self
        }
        /// <p>The properties of a hyperparameter tuning job.</p>
        pub fn hyper_parameter_tuning_job(
            mut self,
            input: crate::model::HyperParameterTuningJobSearchEntity,
        ) -> Self {
            self.hyper_parameter_tuning_job = Some(input);
            self
        }
        /// <p>The properties of a hyperparameter tuning job.</p>
        pub fn set_hyper_parameter_tuning_job(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobSearchEntity>,
        ) -> Self {
            self.hyper_parameter_tuning_job = input;
            self
        }
        /// <p>A model displayed in the Amazon SageMaker Model Dashboard.</p>
        pub fn model(mut self, input: crate::model::ModelDashboardModel) -> Self {
            self.model = Some(input);
            self
        }
        /// <p>A model displayed in the Amazon SageMaker Model Dashboard.</p>
        pub fn set_model(
            mut self,
            input: std::option::Option<crate::model::ModelDashboardModel>,
        ) -> Self {
            self.model = input;
            self
        }
        /// <p>An Amazon SageMaker Model Card that documents details about a machine learning model.</p>
        pub fn model_card(mut self, input: crate::model::ModelCard) -> Self {
            self.model_card = Some(input);
            self
        }
        /// <p>An Amazon SageMaker Model Card that documents details about a machine learning model.</p>
        pub fn set_model_card(
            mut self,
            input: std::option::Option<crate::model::ModelCard>,
        ) -> Self {
            self.model_card = input;
            self
        }
        /// Consumes the builder and constructs a [`SearchRecord`](crate::model::SearchRecord).
        pub fn build(self) -> crate::model::SearchRecord {
            crate::model::SearchRecord {
                training_job: self.training_job,
                experiment: self.experiment,
                trial: self.trial,
                trial_component: self.trial_component,
                endpoint: self.endpoint,
                model_package: self.model_package,
                model_package_group: self.model_package_group,
                pipeline: self.pipeline,
                pipeline_execution: self.pipeline_execution,
                feature_group: self.feature_group,
                project: self.project,
                feature_metadata: self.feature_metadata,
                hyper_parameter_tuning_job: self.hyper_parameter_tuning_job,
                model: self.model,
                model_card: self.model_card,
            }
        }
    }
}
impl SearchRecord {
    /// Creates a new builder-style object to manufacture [`SearchRecord`](crate::model::SearchRecord).
    pub fn builder() -> crate::model::search_record::Builder {
        crate::model::search_record::Builder::default()
    }
}

/// <p>An Amazon SageMaker Model Card.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq)]
pub struct ModelCard {
    /// <p>The Amazon Resource Name (ARN) of the model card.</p>
    #[doc(hidden)]
    pub model_card_arn: std::option::Option<std::string::String>,
    /// <p>The unique name of the model card.</p>
    #[doc(hidden)]
    pub model_card_name: std::option::Option<std::string::String>,
    /// <p>The version of the model card.</p>
    #[doc(hidden)]
    pub model_card_version: i32,
    /// <p>The content of the model card. Content uses the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-api-json-schema.html">model card JSON schema</a> and provided as a string.</p>
    #[doc(hidden)]
    pub content: std::option::Option<std::string::String>,
    /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
    /// <ul>
    /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
    /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
    /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
    /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_card_status: std::option::Option<crate::model::ModelCardStatus>,
    /// <p>The security configuration used to protect model card data.</p>
    #[doc(hidden)]
    pub security_config: std::option::Option<crate::model::ModelCardSecurityConfig>,
    /// <p>The date and time that the model card was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>The date and time that the model card was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>Key-value pairs used to manage metadata for the model card.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>The unique name (ID) of the model.</p>
    #[doc(hidden)]
    pub model_id: std::option::Option<std::string::String>,
    /// <p>The risk rating of the model. Different organizations might have different criteria for model card risk ratings. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-risk-rating.html">Risk ratings</a>.</p>
    #[doc(hidden)]
    pub risk_rating: std::option::Option<std::string::String>,
}
impl ModelCard {
    /// <p>The Amazon Resource Name (ARN) of the model card.</p>
    pub fn model_card_arn(&self) -> std::option::Option<&str> {
        self.model_card_arn.as_deref()
    }
    /// <p>The unique name of the model card.</p>
    pub fn model_card_name(&self) -> std::option::Option<&str> {
        self.model_card_name.as_deref()
    }
    /// <p>The version of the model card.</p>
    pub fn model_card_version(&self) -> i32 {
        self.model_card_version
    }
    /// <p>The content of the model card. Content uses the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-api-json-schema.html">model card JSON schema</a> and provided as a string.</p>
    pub fn content(&self) -> std::option::Option<&str> {
        self.content.as_deref()
    }
    /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
    /// <ul>
    /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
    /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
    /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
    /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
    /// </ul>
    pub fn model_card_status(&self) -> std::option::Option<&crate::model::ModelCardStatus> {
        self.model_card_status.as_ref()
    }
    /// <p>The security configuration used to protect model card data.</p>
    pub fn security_config(&self) -> std::option::Option<&crate::model::ModelCardSecurityConfig> {
        self.security_config.as_ref()
    }
    /// <p>The date and time that the model card was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>The date and time that the model card was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>Key-value pairs used to manage metadata for the model card.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>The unique name (ID) of the model.</p>
    pub fn model_id(&self) -> std::option::Option<&str> {
        self.model_id.as_deref()
    }
    /// <p>The risk rating of the model. Different organizations might have different criteria for model card risk ratings. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-risk-rating.html">Risk ratings</a>.</p>
    pub fn risk_rating(&self) -> std::option::Option<&str> {
        self.risk_rating.as_deref()
    }
}
impl std::fmt::Debug for ModelCard {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let mut formatter = f.debug_struct("ModelCard");
        formatter.field("model_card_arn", &self.model_card_arn);
        formatter.field("model_card_name", &self.model_card_name);
        formatter.field("model_card_version", &self.model_card_version);
        formatter.field("content", &"*** Sensitive Data Redacted ***");
        formatter.field("model_card_status", &self.model_card_status);
        formatter.field("security_config", &self.security_config);
        formatter.field("creation_time", &self.creation_time);
        formatter.field("created_by", &self.created_by);
        formatter.field("last_modified_time", &self.last_modified_time);
        formatter.field("last_modified_by", &self.last_modified_by);
        formatter.field("tags", &self.tags);
        formatter.field("model_id", &self.model_id);
        formatter.field("risk_rating", &self.risk_rating);
        formatter.finish()
    }
}
/// See [`ModelCard`](crate::model::ModelCard).
pub mod model_card {

    /// A builder for [`ModelCard`](crate::model::ModelCard).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default)]
    pub struct Builder {
        pub(crate) model_card_arn: std::option::Option<std::string::String>,
        pub(crate) model_card_name: std::option::Option<std::string::String>,
        pub(crate) model_card_version: std::option::Option<i32>,
        pub(crate) content: std::option::Option<std::string::String>,
        pub(crate) model_card_status: std::option::Option<crate::model::ModelCardStatus>,
        pub(crate) security_config: std::option::Option<crate::model::ModelCardSecurityConfig>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) model_id: std::option::Option<std::string::String>,
        pub(crate) risk_rating: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the model card.</p>
        pub fn model_card_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card.</p>
        pub fn set_model_card_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_arn = input;
            self
        }
        /// <p>The unique name of the model card.</p>
        pub fn model_card_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_name = Some(input.into());
            self
        }
        /// <p>The unique name of the model card.</p>
        pub fn set_model_card_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_name = input;
            self
        }
        /// <p>The version of the model card.</p>
        pub fn model_card_version(mut self, input: i32) -> Self {
            self.model_card_version = Some(input);
            self
        }
        /// <p>The version of the model card.</p>
        pub fn set_model_card_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_card_version = input;
            self
        }
        /// <p>The content of the model card. Content uses the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-api-json-schema.html">model card JSON schema</a> and provided as a string.</p>
        pub fn content(mut self, input: impl Into<std::string::String>) -> Self {
            self.content = Some(input.into());
            self
        }
        /// <p>The content of the model card. Content uses the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-api-json-schema.html">model card JSON schema</a> and provided as a string.</p>
        pub fn set_content(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content = input;
            self
        }
        /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
        /// <ul>
        /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
        /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
        /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
        /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
        /// </ul>
        pub fn model_card_status(mut self, input: crate::model::ModelCardStatus) -> Self {
            self.model_card_status = Some(input);
            self
        }
        /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
        /// <ul>
        /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
        /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
        /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
        /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
        /// </ul>
        pub fn set_model_card_status(
            mut self,
            input: std::option::Option<crate::model::ModelCardStatus>,
        ) -> Self {
            self.model_card_status = input;
            self
        }
        /// <p>The security configuration used to protect model card data.</p>
        pub fn security_config(mut self, input: crate::model::ModelCardSecurityConfig) -> Self {
            self.security_config = Some(input);
            self
        }
        /// <p>The security configuration used to protect model card data.</p>
        pub fn set_security_config(
            mut self,
            input: std::option::Option<crate::model::ModelCardSecurityConfig>,
        ) -> Self {
            self.security_config = input;
            self
        }
        /// <p>The date and time that the model card was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the model card was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>The date and time that the model card was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The date and time that the model card was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>Key-value pairs used to manage metadata for the model card.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>Key-value pairs used to manage metadata for the model card.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// <p>The unique name (ID) of the model.</p>
        pub fn model_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_id = Some(input.into());
            self
        }
        /// <p>The unique name (ID) of the model.</p>
        pub fn set_model_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_id = input;
            self
        }
        /// <p>The risk rating of the model. Different organizations might have different criteria for model card risk ratings. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-risk-rating.html">Risk ratings</a>.</p>
        pub fn risk_rating(mut self, input: impl Into<std::string::String>) -> Self {
            self.risk_rating = Some(input.into());
            self
        }
        /// <p>The risk rating of the model. Different organizations might have different criteria for model card risk ratings. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards-risk-rating.html">Risk ratings</a>.</p>
        pub fn set_risk_rating(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.risk_rating = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCard`](crate::model::ModelCard).
        pub fn build(self) -> crate::model::ModelCard {
            crate::model::ModelCard {
                model_card_arn: self.model_card_arn,
                model_card_name: self.model_card_name,
                model_card_version: self.model_card_version.unwrap_or_default(),
                content: self.content,
                model_card_status: self.model_card_status,
                security_config: self.security_config,
                creation_time: self.creation_time,
                created_by: self.created_by,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
                tags: self.tags,
                model_id: self.model_id,
                risk_rating: self.risk_rating,
            }
        }
    }
    impl std::fmt::Debug for Builder {
        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
            let mut formatter = f.debug_struct("Builder");
            formatter.field("model_card_arn", &self.model_card_arn);
            formatter.field("model_card_name", &self.model_card_name);
            formatter.field("model_card_version", &self.model_card_version);
            formatter.field("content", &"*** Sensitive Data Redacted ***");
            formatter.field("model_card_status", &self.model_card_status);
            formatter.field("security_config", &self.security_config);
            formatter.field("creation_time", &self.creation_time);
            formatter.field("created_by", &self.created_by);
            formatter.field("last_modified_time", &self.last_modified_time);
            formatter.field("last_modified_by", &self.last_modified_by);
            formatter.field("tags", &self.tags);
            formatter.field("model_id", &self.model_id);
            formatter.field("risk_rating", &self.risk_rating);
            formatter.finish()
        }
    }
}
impl ModelCard {
    /// Creates a new builder-style object to manufacture [`ModelCard`](crate::model::ModelCard).
    pub fn builder() -> crate::model::model_card::Builder {
        crate::model::model_card::Builder::default()
    }
}

/// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct UserContext {
    /// <p>The Amazon Resource Name (ARN) of the user's profile.</p>
    #[doc(hidden)]
    pub user_profile_arn: std::option::Option<std::string::String>,
    /// <p>The name of the user's profile.</p>
    #[doc(hidden)]
    pub user_profile_name: std::option::Option<std::string::String>,
    /// <p>The domain associated with the user.</p>
    #[doc(hidden)]
    pub domain_id: std::option::Option<std::string::String>,
}
impl UserContext {
    /// <p>The Amazon Resource Name (ARN) of the user's profile.</p>
    pub fn user_profile_arn(&self) -> std::option::Option<&str> {
        self.user_profile_arn.as_deref()
    }
    /// <p>The name of the user's profile.</p>
    pub fn user_profile_name(&self) -> std::option::Option<&str> {
        self.user_profile_name.as_deref()
    }
    /// <p>The domain associated with the user.</p>
    pub fn domain_id(&self) -> std::option::Option<&str> {
        self.domain_id.as_deref()
    }
}
/// See [`UserContext`](crate::model::UserContext).
pub mod user_context {

    /// A builder for [`UserContext`](crate::model::UserContext).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) user_profile_arn: std::option::Option<std::string::String>,
        pub(crate) user_profile_name: std::option::Option<std::string::String>,
        pub(crate) domain_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the user's profile.</p>
        pub fn user_profile_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_profile_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the user's profile.</p>
        pub fn set_user_profile_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.user_profile_arn = input;
            self
        }
        /// <p>The name of the user's profile.</p>
        pub fn user_profile_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_profile_name = Some(input.into());
            self
        }
        /// <p>The name of the user's profile.</p>
        pub fn set_user_profile_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.user_profile_name = input;
            self
        }
        /// <p>The domain associated with the user.</p>
        pub fn domain_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_id = Some(input.into());
            self
        }
        /// <p>The domain associated with the user.</p>
        pub fn set_domain_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_id = input;
            self
        }
        /// Consumes the builder and constructs a [`UserContext`](crate::model::UserContext).
        pub fn build(self) -> crate::model::UserContext {
            crate::model::UserContext {
                user_profile_arn: self.user_profile_arn,
                user_profile_name: self.user_profile_name,
                domain_id: self.domain_id,
            }
        }
    }
}
impl UserContext {
    /// Creates a new builder-style object to manufacture [`UserContext`](crate::model::UserContext).
    pub fn builder() -> crate::model::user_context::Builder {
        crate::model::user_context::Builder::default()
    }
}

/// <p>Configure the security settings to protect model card data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelCardSecurityConfig {
    /// <p>A Key Management Service <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">key ID</a> to use for encrypting a model card.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl ModelCardSecurityConfig {
    /// <p>A Key Management Service <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">key ID</a> to use for encrypting a model card.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`ModelCardSecurityConfig`](crate::model::ModelCardSecurityConfig).
pub mod model_card_security_config {

    /// A builder for [`ModelCardSecurityConfig`](crate::model::ModelCardSecurityConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A Key Management Service <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">key ID</a> to use for encrypting a model card.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>A Key Management Service <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">key ID</a> to use for encrypting a model card.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCardSecurityConfig`](crate::model::ModelCardSecurityConfig).
        pub fn build(self) -> crate::model::ModelCardSecurityConfig {
            crate::model::ModelCardSecurityConfig {
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl ModelCardSecurityConfig {
    /// Creates a new builder-style object to manufacture [`ModelCardSecurityConfig`](crate::model::ModelCardSecurityConfig).
    pub fn builder() -> crate::model::model_card_security_config::Builder {
        crate::model::model_card_security_config::Builder::default()
    }
}

/// <p>A model displayed in the Amazon SageMaker Model Dashboard.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDashboardModel {
    /// <p>A model displayed in the Model Dashboard.</p>
    #[doc(hidden)]
    pub model: std::option::Option<crate::model::Model>,
    /// <p>The endpoints that host a model.</p>
    #[doc(hidden)]
    pub endpoints: std::option::Option<std::vec::Vec<crate::model::ModelDashboardEndpoint>>,
    /// <p>A batch transform job. For information about SageMaker batch transform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html">Use Batch Transform</a>.</p>
    #[doc(hidden)]
    pub last_batch_transform_job: std::option::Option<crate::model::TransformJob>,
    /// <p>The monitoring schedules for a model.</p>
    #[doc(hidden)]
    pub monitoring_schedules:
        std::option::Option<std::vec::Vec<crate::model::ModelDashboardMonitoringSchedule>>,
    /// <p>The model card for a model.</p>
    #[doc(hidden)]
    pub model_card: std::option::Option<crate::model::ModelDashboardModelCard>,
}
impl ModelDashboardModel {
    /// <p>A model displayed in the Model Dashboard.</p>
    pub fn model(&self) -> std::option::Option<&crate::model::Model> {
        self.model.as_ref()
    }
    /// <p>The endpoints that host a model.</p>
    pub fn endpoints(&self) -> std::option::Option<&[crate::model::ModelDashboardEndpoint]> {
        self.endpoints.as_deref()
    }
    /// <p>A batch transform job. For information about SageMaker batch transform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html">Use Batch Transform</a>.</p>
    pub fn last_batch_transform_job(&self) -> std::option::Option<&crate::model::TransformJob> {
        self.last_batch_transform_job.as_ref()
    }
    /// <p>The monitoring schedules for a model.</p>
    pub fn monitoring_schedules(
        &self,
    ) -> std::option::Option<&[crate::model::ModelDashboardMonitoringSchedule]> {
        self.monitoring_schedules.as_deref()
    }
    /// <p>The model card for a model.</p>
    pub fn model_card(&self) -> std::option::Option<&crate::model::ModelDashboardModelCard> {
        self.model_card.as_ref()
    }
}
/// See [`ModelDashboardModel`](crate::model::ModelDashboardModel).
pub mod model_dashboard_model {

    /// A builder for [`ModelDashboardModel`](crate::model::ModelDashboardModel).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model: std::option::Option<crate::model::Model>,
        pub(crate) endpoints:
            std::option::Option<std::vec::Vec<crate::model::ModelDashboardEndpoint>>,
        pub(crate) last_batch_transform_job: std::option::Option<crate::model::TransformJob>,
        pub(crate) monitoring_schedules:
            std::option::Option<std::vec::Vec<crate::model::ModelDashboardMonitoringSchedule>>,
        pub(crate) model_card: std::option::Option<crate::model::ModelDashboardModelCard>,
    }
    impl Builder {
        /// <p>A model displayed in the Model Dashboard.</p>
        pub fn model(mut self, input: crate::model::Model) -> Self {
            self.model = Some(input);
            self
        }
        /// <p>A model displayed in the Model Dashboard.</p>
        pub fn set_model(mut self, input: std::option::Option<crate::model::Model>) -> Self {
            self.model = input;
            self
        }
        /// Appends an item to `endpoints`.
        ///
        /// To override the contents of this collection use [`set_endpoints`](Self::set_endpoints).
        ///
        /// <p>The endpoints that host a model.</p>
        pub fn endpoints(mut self, input: crate::model::ModelDashboardEndpoint) -> Self {
            let mut v = self.endpoints.unwrap_or_default();
            v.push(input);
            self.endpoints = Some(v);
            self
        }
        /// <p>The endpoints that host a model.</p>
        pub fn set_endpoints(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ModelDashboardEndpoint>>,
        ) -> Self {
            self.endpoints = input;
            self
        }
        /// <p>A batch transform job. For information about SageMaker batch transform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html">Use Batch Transform</a>.</p>
        pub fn last_batch_transform_job(mut self, input: crate::model::TransformJob) -> Self {
            self.last_batch_transform_job = Some(input);
            self
        }
        /// <p>A batch transform job. For information about SageMaker batch transform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html">Use Batch Transform</a>.</p>
        pub fn set_last_batch_transform_job(
            mut self,
            input: std::option::Option<crate::model::TransformJob>,
        ) -> Self {
            self.last_batch_transform_job = input;
            self
        }
        /// Appends an item to `monitoring_schedules`.
        ///
        /// To override the contents of this collection use [`set_monitoring_schedules`](Self::set_monitoring_schedules).
        ///
        /// <p>The monitoring schedules for a model.</p>
        pub fn monitoring_schedules(
            mut self,
            input: crate::model::ModelDashboardMonitoringSchedule,
        ) -> Self {
            let mut v = self.monitoring_schedules.unwrap_or_default();
            v.push(input);
            self.monitoring_schedules = Some(v);
            self
        }
        /// <p>The monitoring schedules for a model.</p>
        pub fn set_monitoring_schedules(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::ModelDashboardMonitoringSchedule>,
            >,
        ) -> Self {
            self.monitoring_schedules = input;
            self
        }
        /// <p>The model card for a model.</p>
        pub fn model_card(mut self, input: crate::model::ModelDashboardModelCard) -> Self {
            self.model_card = Some(input);
            self
        }
        /// <p>The model card for a model.</p>
        pub fn set_model_card(
            mut self,
            input: std::option::Option<crate::model::ModelDashboardModelCard>,
        ) -> Self {
            self.model_card = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDashboardModel`](crate::model::ModelDashboardModel).
        pub fn build(self) -> crate::model::ModelDashboardModel {
            crate::model::ModelDashboardModel {
                model: self.model,
                endpoints: self.endpoints,
                last_batch_transform_job: self.last_batch_transform_job,
                monitoring_schedules: self.monitoring_schedules,
                model_card: self.model_card,
            }
        }
    }
}
impl ModelDashboardModel {
    /// Creates a new builder-style object to manufacture [`ModelDashboardModel`](crate::model::ModelDashboardModel).
    pub fn builder() -> crate::model::model_dashboard_model::Builder {
        crate::model::model_dashboard_model::Builder::default()
    }
}

/// <p>The model card for a model displayed in the Amazon SageMaker Model Dashboard.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDashboardModelCard {
    /// <p>The Amazon Resource Name (ARN) for a model card.</p>
    #[doc(hidden)]
    pub model_card_arn: std::option::Option<std::string::String>,
    /// <p>The name of a model card.</p>
    #[doc(hidden)]
    pub model_card_name: std::option::Option<std::string::String>,
    /// <p>The model card version.</p>
    #[doc(hidden)]
    pub model_card_version: i32,
    /// <p>The model card status.</p>
    #[doc(hidden)]
    pub model_card_status: std::option::Option<crate::model::ModelCardStatus>,
    /// <p>The KMS Key ID (<code>KMSKeyId</code>) for encryption of model card information.</p>
    #[doc(hidden)]
    pub security_config: std::option::Option<crate::model::ModelCardSecurityConfig>,
    /// <p>A timestamp that indicates when the model card was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>A timestamp that indicates when the model card was last updated.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>The tags associated with a model card.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>For models created in SageMaker, this is the model ARN. For models created outside of SageMaker, this is a user-customized string.</p>
    #[doc(hidden)]
    pub model_id: std::option::Option<std::string::String>,
    /// <p>A model card's risk rating. Can be low, medium, or high.</p>
    #[doc(hidden)]
    pub risk_rating: std::option::Option<std::string::String>,
}
impl ModelDashboardModelCard {
    /// <p>The Amazon Resource Name (ARN) for a model card.</p>
    pub fn model_card_arn(&self) -> std::option::Option<&str> {
        self.model_card_arn.as_deref()
    }
    /// <p>The name of a model card.</p>
    pub fn model_card_name(&self) -> std::option::Option<&str> {
        self.model_card_name.as_deref()
    }
    /// <p>The model card version.</p>
    pub fn model_card_version(&self) -> i32 {
        self.model_card_version
    }
    /// <p>The model card status.</p>
    pub fn model_card_status(&self) -> std::option::Option<&crate::model::ModelCardStatus> {
        self.model_card_status.as_ref()
    }
    /// <p>The KMS Key ID (<code>KMSKeyId</code>) for encryption of model card information.</p>
    pub fn security_config(&self) -> std::option::Option<&crate::model::ModelCardSecurityConfig> {
        self.security_config.as_ref()
    }
    /// <p>A timestamp that indicates when the model card was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>A timestamp that indicates when the model card was last updated.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>The tags associated with a model card.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>For models created in SageMaker, this is the model ARN. For models created outside of SageMaker, this is a user-customized string.</p>
    pub fn model_id(&self) -> std::option::Option<&str> {
        self.model_id.as_deref()
    }
    /// <p>A model card's risk rating. Can be low, medium, or high.</p>
    pub fn risk_rating(&self) -> std::option::Option<&str> {
        self.risk_rating.as_deref()
    }
}
/// See [`ModelDashboardModelCard`](crate::model::ModelDashboardModelCard).
pub mod model_dashboard_model_card {

    /// A builder for [`ModelDashboardModelCard`](crate::model::ModelDashboardModelCard).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_card_arn: std::option::Option<std::string::String>,
        pub(crate) model_card_name: std::option::Option<std::string::String>,
        pub(crate) model_card_version: std::option::Option<i32>,
        pub(crate) model_card_status: std::option::Option<crate::model::ModelCardStatus>,
        pub(crate) security_config: std::option::Option<crate::model::ModelCardSecurityConfig>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) model_id: std::option::Option<std::string::String>,
        pub(crate) risk_rating: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) for a model card.</p>
        pub fn model_card_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) for a model card.</p>
        pub fn set_model_card_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_arn = input;
            self
        }
        /// <p>The name of a model card.</p>
        pub fn model_card_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_name = Some(input.into());
            self
        }
        /// <p>The name of a model card.</p>
        pub fn set_model_card_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_name = input;
            self
        }
        /// <p>The model card version.</p>
        pub fn model_card_version(mut self, input: i32) -> Self {
            self.model_card_version = Some(input);
            self
        }
        /// <p>The model card version.</p>
        pub fn set_model_card_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_card_version = input;
            self
        }
        /// <p>The model card status.</p>
        pub fn model_card_status(mut self, input: crate::model::ModelCardStatus) -> Self {
            self.model_card_status = Some(input);
            self
        }
        /// <p>The model card status.</p>
        pub fn set_model_card_status(
            mut self,
            input: std::option::Option<crate::model::ModelCardStatus>,
        ) -> Self {
            self.model_card_status = input;
            self
        }
        /// <p>The KMS Key ID (<code>KMSKeyId</code>) for encryption of model card information.</p>
        pub fn security_config(mut self, input: crate::model::ModelCardSecurityConfig) -> Self {
            self.security_config = Some(input);
            self
        }
        /// <p>The KMS Key ID (<code>KMSKeyId</code>) for encryption of model card information.</p>
        pub fn set_security_config(
            mut self,
            input: std::option::Option<crate::model::ModelCardSecurityConfig>,
        ) -> Self {
            self.security_config = input;
            self
        }
        /// <p>A timestamp that indicates when the model card was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the model card was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>A timestamp that indicates when the model card was last updated.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the model card was last updated.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>The tags associated with a model card.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>The tags associated with a model card.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// <p>For models created in SageMaker, this is the model ARN. For models created outside of SageMaker, this is a user-customized string.</p>
        pub fn model_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_id = Some(input.into());
            self
        }
        /// <p>For models created in SageMaker, this is the model ARN. For models created outside of SageMaker, this is a user-customized string.</p>
        pub fn set_model_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_id = input;
            self
        }
        /// <p>A model card's risk rating. Can be low, medium, or high.</p>
        pub fn risk_rating(mut self, input: impl Into<std::string::String>) -> Self {
            self.risk_rating = Some(input.into());
            self
        }
        /// <p>A model card's risk rating. Can be low, medium, or high.</p>
        pub fn set_risk_rating(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.risk_rating = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDashboardModelCard`](crate::model::ModelDashboardModelCard).
        pub fn build(self) -> crate::model::ModelDashboardModelCard {
            crate::model::ModelDashboardModelCard {
                model_card_arn: self.model_card_arn,
                model_card_name: self.model_card_name,
                model_card_version: self.model_card_version.unwrap_or_default(),
                model_card_status: self.model_card_status,
                security_config: self.security_config,
                creation_time: self.creation_time,
                created_by: self.created_by,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
                tags: self.tags,
                model_id: self.model_id,
                risk_rating: self.risk_rating,
            }
        }
    }
}
impl ModelDashboardModelCard {
    /// Creates a new builder-style object to manufacture [`ModelDashboardModelCard`](crate::model::ModelDashboardModelCard).
    pub fn builder() -> crate::model::model_dashboard_model_card::Builder {
        crate::model::model_dashboard_model_card::Builder::default()
    }
}

/// <p>A monitoring schedule for a model displayed in the Amazon SageMaker Model Dashboard.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDashboardMonitoringSchedule {
    /// <p>The Amazon Resource Name (ARN) of a monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_arn: std::option::Option<std::string::String>,
    /// <p>The name of a monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_name: std::option::Option<std::string::String>,
    /// <p>The status of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_status: std::option::Option<crate::model::ScheduleStatus>,
    /// <p>The monitor type of a model monitor.</p>
    #[doc(hidden)]
    pub monitoring_type: std::option::Option<crate::model::MonitoringType>,
    /// <p>If a monitoring job failed, provides the reason.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>A timestamp that indicates when the monitoring schedule was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that indicates when the monitoring schedule was last updated.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_schedule_config: std::option::Option<crate::model::MonitoringScheduleConfig>,
    /// <p>The endpoint which is monitored.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>A JSON array where each element is a summary for a monitoring alert.</p>
    #[doc(hidden)]
    pub monitoring_alert_summaries:
        std::option::Option<std::vec::Vec<crate::model::MonitoringAlertSummary>>,
    /// <p>Summary of information about the last monitoring job to run.</p>
    #[doc(hidden)]
    pub last_monitoring_execution_summary:
        std::option::Option<crate::model::MonitoringExecutionSummary>,
}
impl ModelDashboardMonitoringSchedule {
    /// <p>The Amazon Resource Name (ARN) of a monitoring schedule.</p>
    pub fn monitoring_schedule_arn(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_arn.as_deref()
    }
    /// <p>The name of a monitoring schedule.</p>
    pub fn monitoring_schedule_name(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_name.as_deref()
    }
    /// <p>The status of the monitoring schedule.</p>
    pub fn monitoring_schedule_status(&self) -> std::option::Option<&crate::model::ScheduleStatus> {
        self.monitoring_schedule_status.as_ref()
    }
    /// <p>The monitor type of a model monitor.</p>
    pub fn monitoring_type(&self) -> std::option::Option<&crate::model::MonitoringType> {
        self.monitoring_type.as_ref()
    }
    /// <p>If a monitoring job failed, provides the reason.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>A timestamp that indicates when the monitoring schedule was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that indicates when the monitoring schedule was last updated.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
    pub fn monitoring_schedule_config(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringScheduleConfig> {
        self.monitoring_schedule_config.as_ref()
    }
    /// <p>The endpoint which is monitored.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>A JSON array where each element is a summary for a monitoring alert.</p>
    pub fn monitoring_alert_summaries(
        &self,
    ) -> std::option::Option<&[crate::model::MonitoringAlertSummary]> {
        self.monitoring_alert_summaries.as_deref()
    }
    /// <p>Summary of information about the last monitoring job to run.</p>
    pub fn last_monitoring_execution_summary(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringExecutionSummary> {
        self.last_monitoring_execution_summary.as_ref()
    }
}
/// See [`ModelDashboardMonitoringSchedule`](crate::model::ModelDashboardMonitoringSchedule).
pub mod model_dashboard_monitoring_schedule {

    /// A builder for [`ModelDashboardMonitoringSchedule`](crate::model::ModelDashboardMonitoringSchedule).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_schedule_arn: std::option::Option<std::string::String>,
        pub(crate) monitoring_schedule_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_schedule_status: std::option::Option<crate::model::ScheduleStatus>,
        pub(crate) monitoring_type: std::option::Option<crate::model::MonitoringType>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) monitoring_schedule_config:
            std::option::Option<crate::model::MonitoringScheduleConfig>,
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_alert_summaries:
            std::option::Option<std::vec::Vec<crate::model::MonitoringAlertSummary>>,
        pub(crate) last_monitoring_execution_summary:
            std::option::Option<crate::model::MonitoringExecutionSummary>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of a monitoring schedule.</p>
        pub fn monitoring_schedule_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a monitoring schedule.</p>
        pub fn set_monitoring_schedule_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_arn = input;
            self
        }
        /// <p>The name of a monitoring schedule.</p>
        pub fn monitoring_schedule_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_name = Some(input.into());
            self
        }
        /// <p>The name of a monitoring schedule.</p>
        pub fn set_monitoring_schedule_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_name = input;
            self
        }
        /// <p>The status of the monitoring schedule.</p>
        pub fn monitoring_schedule_status(mut self, input: crate::model::ScheduleStatus) -> Self {
            self.monitoring_schedule_status = Some(input);
            self
        }
        /// <p>The status of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_status(
            mut self,
            input: std::option::Option<crate::model::ScheduleStatus>,
        ) -> Self {
            self.monitoring_schedule_status = input;
            self
        }
        /// <p>The monitor type of a model monitor.</p>
        pub fn monitoring_type(mut self, input: crate::model::MonitoringType) -> Self {
            self.monitoring_type = Some(input);
            self
        }
        /// <p>The monitor type of a model monitor.</p>
        pub fn set_monitoring_type(
            mut self,
            input: std::option::Option<crate::model::MonitoringType>,
        ) -> Self {
            self.monitoring_type = input;
            self
        }
        /// <p>If a monitoring job failed, provides the reason.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If a monitoring job failed, provides the reason.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>A timestamp that indicates when the monitoring schedule was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the monitoring schedule was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that indicates when the monitoring schedule was last updated.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the monitoring schedule was last updated.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
        pub fn monitoring_schedule_config(
            mut self,
            input: crate::model::MonitoringScheduleConfig,
        ) -> Self {
            self.monitoring_schedule_config = Some(input);
            self
        }
        /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
        pub fn set_monitoring_schedule_config(
            mut self,
            input: std::option::Option<crate::model::MonitoringScheduleConfig>,
        ) -> Self {
            self.monitoring_schedule_config = input;
            self
        }
        /// <p>The endpoint which is monitored.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The endpoint which is monitored.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// Appends an item to `monitoring_alert_summaries`.
        ///
        /// To override the contents of this collection use [`set_monitoring_alert_summaries`](Self::set_monitoring_alert_summaries).
        ///
        /// <p>A JSON array where each element is a summary for a monitoring alert.</p>
        pub fn monitoring_alert_summaries(
            mut self,
            input: crate::model::MonitoringAlertSummary,
        ) -> Self {
            let mut v = self.monitoring_alert_summaries.unwrap_or_default();
            v.push(input);
            self.monitoring_alert_summaries = Some(v);
            self
        }
        /// <p>A JSON array where each element is a summary for a monitoring alert.</p>
        pub fn set_monitoring_alert_summaries(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MonitoringAlertSummary>>,
        ) -> Self {
            self.monitoring_alert_summaries = input;
            self
        }
        /// <p>Summary of information about the last monitoring job to run.</p>
        pub fn last_monitoring_execution_summary(
            mut self,
            input: crate::model::MonitoringExecutionSummary,
        ) -> Self {
            self.last_monitoring_execution_summary = Some(input);
            self
        }
        /// <p>Summary of information about the last monitoring job to run.</p>
        pub fn set_last_monitoring_execution_summary(
            mut self,
            input: std::option::Option<crate::model::MonitoringExecutionSummary>,
        ) -> Self {
            self.last_monitoring_execution_summary = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDashboardMonitoringSchedule`](crate::model::ModelDashboardMonitoringSchedule).
        pub fn build(self) -> crate::model::ModelDashboardMonitoringSchedule {
            crate::model::ModelDashboardMonitoringSchedule {
                monitoring_schedule_arn: self.monitoring_schedule_arn,
                monitoring_schedule_name: self.monitoring_schedule_name,
                monitoring_schedule_status: self.monitoring_schedule_status,
                monitoring_type: self.monitoring_type,
                failure_reason: self.failure_reason,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                monitoring_schedule_config: self.monitoring_schedule_config,
                endpoint_name: self.endpoint_name,
                monitoring_alert_summaries: self.monitoring_alert_summaries,
                last_monitoring_execution_summary: self.last_monitoring_execution_summary,
            }
        }
    }
}
impl ModelDashboardMonitoringSchedule {
    /// Creates a new builder-style object to manufacture [`ModelDashboardMonitoringSchedule`](crate::model::ModelDashboardMonitoringSchedule).
    pub fn builder() -> crate::model::model_dashboard_monitoring_schedule::Builder {
        crate::model::model_dashboard_monitoring_schedule::Builder::default()
    }
}

/// <p>Summary of information about the last monitoring job to run.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringExecutionSummary {
    /// <p>The name of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_name: std::option::Option<std::string::String>,
    /// <p>The time the monitoring job was scheduled.</p>
    #[doc(hidden)]
    pub scheduled_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time at which the monitoring job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that indicates the last time the monitoring job was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_execution_status: std::option::Option<crate::model::ExecutionStatus>,
    /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
    #[doc(hidden)]
    pub processing_job_arn: std::option::Option<std::string::String>,
    /// <p>The name of the endpoint used to run the monitoring job.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>Contains the reason a monitoring job failed, if it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The name of the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_job_definition_name: std::option::Option<std::string::String>,
    /// <p>The type of the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_type: std::option::Option<crate::model::MonitoringType>,
}
impl MonitoringExecutionSummary {
    /// <p>The name of the monitoring schedule.</p>
    pub fn monitoring_schedule_name(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_name.as_deref()
    }
    /// <p>The time the monitoring job was scheduled.</p>
    pub fn scheduled_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.scheduled_time.as_ref()
    }
    /// <p>The time at which the monitoring job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that indicates the last time the monitoring job was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the monitoring job.</p>
    pub fn monitoring_execution_status(
        &self,
    ) -> std::option::Option<&crate::model::ExecutionStatus> {
        self.monitoring_execution_status.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
    pub fn processing_job_arn(&self) -> std::option::Option<&str> {
        self.processing_job_arn.as_deref()
    }
    /// <p>The name of the endpoint used to run the monitoring job.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>Contains the reason a monitoring job failed, if it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The name of the monitoring job.</p>
    pub fn monitoring_job_definition_name(&self) -> std::option::Option<&str> {
        self.monitoring_job_definition_name.as_deref()
    }
    /// <p>The type of the monitoring job.</p>
    pub fn monitoring_type(&self) -> std::option::Option<&crate::model::MonitoringType> {
        self.monitoring_type.as_ref()
    }
}
/// See [`MonitoringExecutionSummary`](crate::model::MonitoringExecutionSummary).
pub mod monitoring_execution_summary {

    /// A builder for [`MonitoringExecutionSummary`](crate::model::MonitoringExecutionSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_schedule_name: std::option::Option<std::string::String>,
        pub(crate) scheduled_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) monitoring_execution_status: std::option::Option<crate::model::ExecutionStatus>,
        pub(crate) processing_job_arn: std::option::Option<std::string::String>,
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) monitoring_job_definition_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_type: std::option::Option<crate::model::MonitoringType>,
    }
    impl Builder {
        /// <p>The name of the monitoring schedule.</p>
        pub fn monitoring_schedule_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_name = input;
            self
        }
        /// <p>The time the monitoring job was scheduled.</p>
        pub fn scheduled_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.scheduled_time = Some(input);
            self
        }
        /// <p>The time the monitoring job was scheduled.</p>
        pub fn set_scheduled_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.scheduled_time = input;
            self
        }
        /// <p>The time at which the monitoring job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time at which the monitoring job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that indicates the last time the monitoring job was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates the last time the monitoring job was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the monitoring job.</p>
        pub fn monitoring_execution_status(mut self, input: crate::model::ExecutionStatus) -> Self {
            self.monitoring_execution_status = Some(input);
            self
        }
        /// <p>The status of the monitoring job.</p>
        pub fn set_monitoring_execution_status(
            mut self,
            input: std::option::Option<crate::model::ExecutionStatus>,
        ) -> Self {
            self.monitoring_execution_status = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
        pub fn processing_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.processing_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
        pub fn set_processing_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.processing_job_arn = input;
            self
        }
        /// <p>The name of the endpoint used to run the monitoring job.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint used to run the monitoring job.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>Contains the reason a monitoring job failed, if it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>Contains the reason a monitoring job failed, if it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The name of the monitoring job.</p>
        pub fn monitoring_job_definition_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring job.</p>
        pub fn set_monitoring_job_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = input;
            self
        }
        /// <p>The type of the monitoring job.</p>
        pub fn monitoring_type(mut self, input: crate::model::MonitoringType) -> Self {
            self.monitoring_type = Some(input);
            self
        }
        /// <p>The type of the monitoring job.</p>
        pub fn set_monitoring_type(
            mut self,
            input: std::option::Option<crate::model::MonitoringType>,
        ) -> Self {
            self.monitoring_type = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringExecutionSummary`](crate::model::MonitoringExecutionSummary).
        pub fn build(self) -> crate::model::MonitoringExecutionSummary {
            crate::model::MonitoringExecutionSummary {
                monitoring_schedule_name: self.monitoring_schedule_name,
                scheduled_time: self.scheduled_time,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                monitoring_execution_status: self.monitoring_execution_status,
                processing_job_arn: self.processing_job_arn,
                endpoint_name: self.endpoint_name,
                failure_reason: self.failure_reason,
                monitoring_job_definition_name: self.monitoring_job_definition_name,
                monitoring_type: self.monitoring_type,
            }
        }
    }
}
impl MonitoringExecutionSummary {
    /// Creates a new builder-style object to manufacture [`MonitoringExecutionSummary`](crate::model::MonitoringExecutionSummary).
    pub fn builder() -> crate::model::monitoring_execution_summary::Builder {
        crate::model::monitoring_execution_summary::Builder::default()
    }
}

/// When writing a match expression against `ExecutionStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let executionstatus = unimplemented!();
/// match executionstatus {
///     ExecutionStatus::Completed => { /* ... */ },
///     ExecutionStatus::CompletedWithViolations => { /* ... */ },
///     ExecutionStatus::Failed => { /* ... */ },
///     ExecutionStatus::InProgress => { /* ... */ },
///     ExecutionStatus::Pending => { /* ... */ },
///     ExecutionStatus::Stopped => { /* ... */ },
///     ExecutionStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `executionstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ExecutionStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ExecutionStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ExecutionStatus::NewFeature` is defined.
/// Specifically, when `executionstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ExecutionStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ExecutionStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    CompletedWithViolations,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ExecutionStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => ExecutionStatus::Completed,
            "CompletedWithViolations" => ExecutionStatus::CompletedWithViolations,
            "Failed" => ExecutionStatus::Failed,
            "InProgress" => ExecutionStatus::InProgress,
            "Pending" => ExecutionStatus::Pending,
            "Stopped" => ExecutionStatus::Stopped,
            "Stopping" => ExecutionStatus::Stopping,
            other => ExecutionStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ExecutionStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ExecutionStatus::from(s))
    }
}
impl ExecutionStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ExecutionStatus::Completed => "Completed",
            ExecutionStatus::CompletedWithViolations => "CompletedWithViolations",
            ExecutionStatus::Failed => "Failed",
            ExecutionStatus::InProgress => "InProgress",
            ExecutionStatus::Pending => "Pending",
            ExecutionStatus::Stopped => "Stopped",
            ExecutionStatus::Stopping => "Stopping",
            ExecutionStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Completed",
            "CompletedWithViolations",
            "Failed",
            "InProgress",
            "Pending",
            "Stopped",
            "Stopping",
        ]
    }
}
impl AsRef<str> for ExecutionStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about a monitor alert.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringAlertSummary {
    /// <p>The name of a monitoring alert.</p>
    #[doc(hidden)]
    pub monitoring_alert_name: std::option::Option<std::string::String>,
    /// <p>A timestamp that indicates when a monitor alert was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that indicates when a monitor alert was last updated.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The current status of an alert.</p>
    #[doc(hidden)]
    pub alert_status: std::option::Option<crate::model::MonitoringAlertStatus>,
    /// <p>Within <code>EvaluationPeriod</code>, how many execution failures will raise an alert.</p>
    #[doc(hidden)]
    pub datapoints_to_alert: std::option::Option<i32>,
    /// <p>The number of most recent monitoring executions to consider when evaluating alert status.</p>
    #[doc(hidden)]
    pub evaluation_period: std::option::Option<i32>,
    /// <p>A list of alert actions taken in response to an alert going into <code>InAlert</code> status.</p>
    #[doc(hidden)]
    pub actions: std::option::Option<crate::model::MonitoringAlertActions>,
}
impl MonitoringAlertSummary {
    /// <p>The name of a monitoring alert.</p>
    pub fn monitoring_alert_name(&self) -> std::option::Option<&str> {
        self.monitoring_alert_name.as_deref()
    }
    /// <p>A timestamp that indicates when a monitor alert was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that indicates when a monitor alert was last updated.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The current status of an alert.</p>
    pub fn alert_status(&self) -> std::option::Option<&crate::model::MonitoringAlertStatus> {
        self.alert_status.as_ref()
    }
    /// <p>Within <code>EvaluationPeriod</code>, how many execution failures will raise an alert.</p>
    pub fn datapoints_to_alert(&self) -> std::option::Option<i32> {
        self.datapoints_to_alert
    }
    /// <p>The number of most recent monitoring executions to consider when evaluating alert status.</p>
    pub fn evaluation_period(&self) -> std::option::Option<i32> {
        self.evaluation_period
    }
    /// <p>A list of alert actions taken in response to an alert going into <code>InAlert</code> status.</p>
    pub fn actions(&self) -> std::option::Option<&crate::model::MonitoringAlertActions> {
        self.actions.as_ref()
    }
}
/// See [`MonitoringAlertSummary`](crate::model::MonitoringAlertSummary).
pub mod monitoring_alert_summary {

    /// A builder for [`MonitoringAlertSummary`](crate::model::MonitoringAlertSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_alert_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) alert_status: std::option::Option<crate::model::MonitoringAlertStatus>,
        pub(crate) datapoints_to_alert: std::option::Option<i32>,
        pub(crate) evaluation_period: std::option::Option<i32>,
        pub(crate) actions: std::option::Option<crate::model::MonitoringAlertActions>,
    }
    impl Builder {
        /// <p>The name of a monitoring alert.</p>
        pub fn monitoring_alert_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_alert_name = Some(input.into());
            self
        }
        /// <p>The name of a monitoring alert.</p>
        pub fn set_monitoring_alert_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_alert_name = input;
            self
        }
        /// <p>A timestamp that indicates when a monitor alert was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when a monitor alert was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that indicates when a monitor alert was last updated.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when a monitor alert was last updated.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The current status of an alert.</p>
        pub fn alert_status(mut self, input: crate::model::MonitoringAlertStatus) -> Self {
            self.alert_status = Some(input);
            self
        }
        /// <p>The current status of an alert.</p>
        pub fn set_alert_status(
            mut self,
            input: std::option::Option<crate::model::MonitoringAlertStatus>,
        ) -> Self {
            self.alert_status = input;
            self
        }
        /// <p>Within <code>EvaluationPeriod</code>, how many execution failures will raise an alert.</p>
        pub fn datapoints_to_alert(mut self, input: i32) -> Self {
            self.datapoints_to_alert = Some(input);
            self
        }
        /// <p>Within <code>EvaluationPeriod</code>, how many execution failures will raise an alert.</p>
        pub fn set_datapoints_to_alert(mut self, input: std::option::Option<i32>) -> Self {
            self.datapoints_to_alert = input;
            self
        }
        /// <p>The number of most recent monitoring executions to consider when evaluating alert status.</p>
        pub fn evaluation_period(mut self, input: i32) -> Self {
            self.evaluation_period = Some(input);
            self
        }
        /// <p>The number of most recent monitoring executions to consider when evaluating alert status.</p>
        pub fn set_evaluation_period(mut self, input: std::option::Option<i32>) -> Self {
            self.evaluation_period = input;
            self
        }
        /// <p>A list of alert actions taken in response to an alert going into <code>InAlert</code> status.</p>
        pub fn actions(mut self, input: crate::model::MonitoringAlertActions) -> Self {
            self.actions = Some(input);
            self
        }
        /// <p>A list of alert actions taken in response to an alert going into <code>InAlert</code> status.</p>
        pub fn set_actions(
            mut self,
            input: std::option::Option<crate::model::MonitoringAlertActions>,
        ) -> Self {
            self.actions = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringAlertSummary`](crate::model::MonitoringAlertSummary).
        pub fn build(self) -> crate::model::MonitoringAlertSummary {
            crate::model::MonitoringAlertSummary {
                monitoring_alert_name: self.monitoring_alert_name,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                alert_status: self.alert_status,
                datapoints_to_alert: self.datapoints_to_alert,
                evaluation_period: self.evaluation_period,
                actions: self.actions,
            }
        }
    }
}
impl MonitoringAlertSummary {
    /// Creates a new builder-style object to manufacture [`MonitoringAlertSummary`](crate::model::MonitoringAlertSummary).
    pub fn builder() -> crate::model::monitoring_alert_summary::Builder {
        crate::model::monitoring_alert_summary::Builder::default()
    }
}

/// <p>A list of alert actions taken in response to an alert going into <code>InAlert</code> status.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringAlertActions {
    /// <p>An alert action taken to light up an icon on the Model Dashboard when an alert goes into <code>InAlert</code> status.</p>
    #[doc(hidden)]
    pub model_dashboard_indicator: std::option::Option<crate::model::ModelDashboardIndicatorAction>,
}
impl MonitoringAlertActions {
    /// <p>An alert action taken to light up an icon on the Model Dashboard when an alert goes into <code>InAlert</code> status.</p>
    pub fn model_dashboard_indicator(
        &self,
    ) -> std::option::Option<&crate::model::ModelDashboardIndicatorAction> {
        self.model_dashboard_indicator.as_ref()
    }
}
/// See [`MonitoringAlertActions`](crate::model::MonitoringAlertActions).
pub mod monitoring_alert_actions {

    /// A builder for [`MonitoringAlertActions`](crate::model::MonitoringAlertActions).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_dashboard_indicator:
            std::option::Option<crate::model::ModelDashboardIndicatorAction>,
    }
    impl Builder {
        /// <p>An alert action taken to light up an icon on the Model Dashboard when an alert goes into <code>InAlert</code> status.</p>
        pub fn model_dashboard_indicator(
            mut self,
            input: crate::model::ModelDashboardIndicatorAction,
        ) -> Self {
            self.model_dashboard_indicator = Some(input);
            self
        }
        /// <p>An alert action taken to light up an icon on the Model Dashboard when an alert goes into <code>InAlert</code> status.</p>
        pub fn set_model_dashboard_indicator(
            mut self,
            input: std::option::Option<crate::model::ModelDashboardIndicatorAction>,
        ) -> Self {
            self.model_dashboard_indicator = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringAlertActions`](crate::model::MonitoringAlertActions).
        pub fn build(self) -> crate::model::MonitoringAlertActions {
            crate::model::MonitoringAlertActions {
                model_dashboard_indicator: self.model_dashboard_indicator,
            }
        }
    }
}
impl MonitoringAlertActions {
    /// Creates a new builder-style object to manufacture [`MonitoringAlertActions`](crate::model::MonitoringAlertActions).
    pub fn builder() -> crate::model::monitoring_alert_actions::Builder {
        crate::model::monitoring_alert_actions::Builder::default()
    }
}

/// <p>An alert action taken to light up an icon on the Amazon SageMaker Model Dashboard when an alert goes into <code>InAlert</code> status.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDashboardIndicatorAction {
    /// <p>Indicates whether the alert action is turned on.</p>
    #[doc(hidden)]
    pub enabled: bool,
}
impl ModelDashboardIndicatorAction {
    /// <p>Indicates whether the alert action is turned on.</p>
    pub fn enabled(&self) -> bool {
        self.enabled
    }
}
/// See [`ModelDashboardIndicatorAction`](crate::model::ModelDashboardIndicatorAction).
pub mod model_dashboard_indicator_action {

    /// A builder for [`ModelDashboardIndicatorAction`](crate::model::ModelDashboardIndicatorAction).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) enabled: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>Indicates whether the alert action is turned on.</p>
        pub fn enabled(mut self, input: bool) -> Self {
            self.enabled = Some(input);
            self
        }
        /// <p>Indicates whether the alert action is turned on.</p>
        pub fn set_enabled(mut self, input: std::option::Option<bool>) -> Self {
            self.enabled = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDashboardIndicatorAction`](crate::model::ModelDashboardIndicatorAction).
        pub fn build(self) -> crate::model::ModelDashboardIndicatorAction {
            crate::model::ModelDashboardIndicatorAction {
                enabled: self.enabled.unwrap_or_default(),
            }
        }
    }
}
impl ModelDashboardIndicatorAction {
    /// Creates a new builder-style object to manufacture [`ModelDashboardIndicatorAction`](crate::model::ModelDashboardIndicatorAction).
    pub fn builder() -> crate::model::model_dashboard_indicator_action::Builder {
        crate::model::model_dashboard_indicator_action::Builder::default()
    }
}

/// When writing a match expression against `MonitoringAlertStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringalertstatus = unimplemented!();
/// match monitoringalertstatus {
///     MonitoringAlertStatus::InAlert => { /* ... */ },
///     MonitoringAlertStatus::Ok => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringalertstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringAlertStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringAlertStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringAlertStatus::NewFeature` is defined.
/// Specifically, when `monitoringalertstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringAlertStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringAlertStatus {
    #[allow(missing_docs)] // documentation missing in model
    InAlert,
    #[allow(missing_docs)] // documentation missing in model
    Ok,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringAlertStatus {
    fn from(s: &str) -> Self {
        match s {
            "InAlert" => MonitoringAlertStatus::InAlert,
            "OK" => MonitoringAlertStatus::Ok,
            other => {
                MonitoringAlertStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for MonitoringAlertStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringAlertStatus::from(s))
    }
}
impl MonitoringAlertStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringAlertStatus::InAlert => "InAlert",
            MonitoringAlertStatus::Ok => "OK",
            MonitoringAlertStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["InAlert", "OK"]
    }
}
impl AsRef<str> for MonitoringAlertStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ScheduleStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let schedulestatus = unimplemented!();
/// match schedulestatus {
///     ScheduleStatus::Failed => { /* ... */ },
///     ScheduleStatus::Pending => { /* ... */ },
///     ScheduleStatus::Scheduled => { /* ... */ },
///     ScheduleStatus::Stopped => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `schedulestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ScheduleStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ScheduleStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ScheduleStatus::NewFeature` is defined.
/// Specifically, when `schedulestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ScheduleStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ScheduleStatus {
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    Scheduled,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ScheduleStatus {
    fn from(s: &str) -> Self {
        match s {
            "Failed" => ScheduleStatus::Failed,
            "Pending" => ScheduleStatus::Pending,
            "Scheduled" => ScheduleStatus::Scheduled,
            "Stopped" => ScheduleStatus::Stopped,
            other => ScheduleStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ScheduleStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ScheduleStatus::from(s))
    }
}
impl ScheduleStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ScheduleStatus::Failed => "Failed",
            ScheduleStatus::Pending => "Pending",
            ScheduleStatus::Scheduled => "Scheduled",
            ScheduleStatus::Stopped => "Stopped",
            ScheduleStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Failed", "Pending", "Scheduled", "Stopped"]
    }
}
impl AsRef<str> for ScheduleStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A batch transform job. For information about SageMaker batch transform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html">Use Batch Transform</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformJob {
    /// <p>The name of the transform job.</p>
    #[doc(hidden)]
    pub transform_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
    #[doc(hidden)]
    pub transform_job_arn: std::option::Option<std::string::String>,
    /// <p>The status of the transform job.</p>
    /// <p>Transform job statuses are:</p>
    /// <ul>
    /// <li> <p> <code>InProgress</code> - The job is in progress.</p> </li>
    /// <li> <p> <code>Completed</code> - The job has completed.</p> </li>
    /// <li> <p> <code>Failed</code> - The transform job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTransformJob</code> call.</p> </li>
    /// <li> <p> <code>Stopping</code> - The transform job is stopping.</p> </li>
    /// <li> <p> <code>Stopped</code> - The transform job has stopped.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub transform_job_status: std::option::Option<crate::model::TransformJobStatus>,
    /// <p>If the transform job failed, the reason it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The name of the model associated with the transform job.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. If <code>MaxConcurrentTransforms</code> is set to 0 or left unset, SageMaker checks the optional execution-parameters to determine the settings for your chosen algorithm. If the execution-parameters endpoint is not enabled, the default value is 1. For built-in algorithms, you don't need to set a value for <code>MaxConcurrentTransforms</code>.</p>
    #[doc(hidden)]
    pub max_concurrent_transforms: std::option::Option<i32>,
    /// <p>Configures the timeout and maximum number of retries for processing a transform job invocation.</p>
    #[doc(hidden)]
    pub model_client_config: std::option::Option<crate::model::ModelClientConfig>,
    /// <p>The maximum allowed size of the payload, in MB. A payload is the data portion of a record (without metadata). The value in <code>MaxPayloadInMB</code> must be greater than, or equal to, the size of a single record. To estimate the size of a record in MB, divide the size of your dataset by the number of records. To ensure that the records fit within the maximum payload size, we recommend using a slightly larger value. The default value is 6 MB. For cases where the payload might be arbitrarily large and is transmitted using HTTP chunked encoding, set the value to 0. This feature works only in supported algorithms. Currently, SageMaker built-in algorithms do not support HTTP chunked encoding.</p>
    #[doc(hidden)]
    pub max_payload_in_mb: std::option::Option<i32>,
    /// <p>Specifies the number of records to include in a mini-batch for an HTTP inference request. A record is a single unit of input data that inference can be made on. For example, a single line in a CSV file is a record.</p>
    #[doc(hidden)]
    pub batch_strategy: std::option::Option<crate::model::BatchStrategy>,
    /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Describes the input source of a transform job and the way the transform job consumes it.</p>
    #[doc(hidden)]
    pub transform_input: std::option::Option<crate::model::TransformInput>,
    /// <p>Describes the results of a transform job.</p>
    #[doc(hidden)]
    pub transform_output: std::option::Option<crate::model::TransformOutput>,
    /// <p>Describes the resources, including ML instance types and ML instance count, to use for transform job.</p>
    #[doc(hidden)]
    pub transform_resources: std::option::Option<crate::model::TransformResources>,
    /// <p>A timestamp that shows when the transform Job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Indicates when the transform job starts on ML instances. You are billed for the time interval between this time and the value of <code>TransformEndTime</code>.</p>
    #[doc(hidden)]
    pub transform_start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Indicates when the transform job has been completed, or has stopped or failed. You are billed for the time interval between this time and the value of <code>TransformStartTime</code>.</p>
    #[doc(hidden)]
    pub transform_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The Amazon Resource Name (ARN) of the labeling job that created the transform job.</p>
    #[doc(hidden)]
    pub labeling_job_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the AutoML job that created the transform job.</p>
    #[doc(hidden)]
    pub auto_ml_job_arn: std::option::Option<std::string::String>,
    /// <p>The data structure used to specify the data to be used for inference in a batch transform job and to associate the data that is relevant to the prediction results in the output. The input filter provided allows you to exclude input data that is not needed for inference in a batch transform job. The output filter provided allows you to include input data relevant to interpreting the predictions in the output from the job. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html">Associate Prediction Results with their Corresponding Input Records</a>.</p>
    #[doc(hidden)]
    pub data_processing: std::option::Option<crate::model::DataProcessing>,
    /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
    /// <ul>
    /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
    /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
    /// <li> <p> <code>CreateTransformJob</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub experiment_config: std::option::Option<crate::model::ExperimentConfig>,
    /// <p>A list of tags associated with the transform job.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl TransformJob {
    /// <p>The name of the transform job.</p>
    pub fn transform_job_name(&self) -> std::option::Option<&str> {
        self.transform_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
    pub fn transform_job_arn(&self) -> std::option::Option<&str> {
        self.transform_job_arn.as_deref()
    }
    /// <p>The status of the transform job.</p>
    /// <p>Transform job statuses are:</p>
    /// <ul>
    /// <li> <p> <code>InProgress</code> - The job is in progress.</p> </li>
    /// <li> <p> <code>Completed</code> - The job has completed.</p> </li>
    /// <li> <p> <code>Failed</code> - The transform job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTransformJob</code> call.</p> </li>
    /// <li> <p> <code>Stopping</code> - The transform job is stopping.</p> </li>
    /// <li> <p> <code>Stopped</code> - The transform job has stopped.</p> </li>
    /// </ul>
    pub fn transform_job_status(&self) -> std::option::Option<&crate::model::TransformJobStatus> {
        self.transform_job_status.as_ref()
    }
    /// <p>If the transform job failed, the reason it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The name of the model associated with the transform job.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. If <code>MaxConcurrentTransforms</code> is set to 0 or left unset, SageMaker checks the optional execution-parameters to determine the settings for your chosen algorithm. If the execution-parameters endpoint is not enabled, the default value is 1. For built-in algorithms, you don't need to set a value for <code>MaxConcurrentTransforms</code>.</p>
    pub fn max_concurrent_transforms(&self) -> std::option::Option<i32> {
        self.max_concurrent_transforms
    }
    /// <p>Configures the timeout and maximum number of retries for processing a transform job invocation.</p>
    pub fn model_client_config(&self) -> std::option::Option<&crate::model::ModelClientConfig> {
        self.model_client_config.as_ref()
    }
    /// <p>The maximum allowed size of the payload, in MB. A payload is the data portion of a record (without metadata). The value in <code>MaxPayloadInMB</code> must be greater than, or equal to, the size of a single record. To estimate the size of a record in MB, divide the size of your dataset by the number of records. To ensure that the records fit within the maximum payload size, we recommend using a slightly larger value. The default value is 6 MB. For cases where the payload might be arbitrarily large and is transmitted using HTTP chunked encoding, set the value to 0. This feature works only in supported algorithms. Currently, SageMaker built-in algorithms do not support HTTP chunked encoding.</p>
    pub fn max_payload_in_mb(&self) -> std::option::Option<i32> {
        self.max_payload_in_mb
    }
    /// <p>Specifies the number of records to include in a mini-batch for an HTTP inference request. A record is a single unit of input data that inference can be made on. For example, a single line in a CSV file is a record.</p>
    pub fn batch_strategy(&self) -> std::option::Option<&crate::model::BatchStrategy> {
        self.batch_strategy.as_ref()
    }
    /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>Describes the input source of a transform job and the way the transform job consumes it.</p>
    pub fn transform_input(&self) -> std::option::Option<&crate::model::TransformInput> {
        self.transform_input.as_ref()
    }
    /// <p>Describes the results of a transform job.</p>
    pub fn transform_output(&self) -> std::option::Option<&crate::model::TransformOutput> {
        self.transform_output.as_ref()
    }
    /// <p>Describes the resources, including ML instance types and ML instance count, to use for transform job.</p>
    pub fn transform_resources(&self) -> std::option::Option<&crate::model::TransformResources> {
        self.transform_resources.as_ref()
    }
    /// <p>A timestamp that shows when the transform Job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Indicates when the transform job starts on ML instances. You are billed for the time interval between this time and the value of <code>TransformEndTime</code>.</p>
    pub fn transform_start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.transform_start_time.as_ref()
    }
    /// <p>Indicates when the transform job has been completed, or has stopped or failed. You are billed for the time interval between this time and the value of <code>TransformStartTime</code>.</p>
    pub fn transform_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.transform_end_time.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the labeling job that created the transform job.</p>
    pub fn labeling_job_arn(&self) -> std::option::Option<&str> {
        self.labeling_job_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the AutoML job that created the transform job.</p>
    pub fn auto_ml_job_arn(&self) -> std::option::Option<&str> {
        self.auto_ml_job_arn.as_deref()
    }
    /// <p>The data structure used to specify the data to be used for inference in a batch transform job and to associate the data that is relevant to the prediction results in the output. The input filter provided allows you to exclude input data that is not needed for inference in a batch transform job. The output filter provided allows you to include input data relevant to interpreting the predictions in the output from the job. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html">Associate Prediction Results with their Corresponding Input Records</a>.</p>
    pub fn data_processing(&self) -> std::option::Option<&crate::model::DataProcessing> {
        self.data_processing.as_ref()
    }
    /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
    /// <ul>
    /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
    /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
    /// <li> <p> <code>CreateTransformJob</code> </p> </li>
    /// </ul>
    pub fn experiment_config(&self) -> std::option::Option<&crate::model::ExperimentConfig> {
        self.experiment_config.as_ref()
    }
    /// <p>A list of tags associated with the transform job.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`TransformJob`](crate::model::TransformJob).
pub mod transform_job {

    /// A builder for [`TransformJob`](crate::model::TransformJob).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) transform_job_name: std::option::Option<std::string::String>,
        pub(crate) transform_job_arn: std::option::Option<std::string::String>,
        pub(crate) transform_job_status: std::option::Option<crate::model::TransformJobStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) max_concurrent_transforms: std::option::Option<i32>,
        pub(crate) model_client_config: std::option::Option<crate::model::ModelClientConfig>,
        pub(crate) max_payload_in_mb: std::option::Option<i32>,
        pub(crate) batch_strategy: std::option::Option<crate::model::BatchStrategy>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) transform_input: std::option::Option<crate::model::TransformInput>,
        pub(crate) transform_output: std::option::Option<crate::model::TransformOutput>,
        pub(crate) transform_resources: std::option::Option<crate::model::TransformResources>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) transform_start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) transform_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) labeling_job_arn: std::option::Option<std::string::String>,
        pub(crate) auto_ml_job_arn: std::option::Option<std::string::String>,
        pub(crate) data_processing: std::option::Option<crate::model::DataProcessing>,
        pub(crate) experiment_config: std::option::Option<crate::model::ExperimentConfig>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The name of the transform job.</p>
        pub fn transform_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.transform_job_name = Some(input.into());
            self
        }
        /// <p>The name of the transform job.</p>
        pub fn set_transform_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.transform_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
        pub fn transform_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.transform_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
        pub fn set_transform_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.transform_job_arn = input;
            self
        }
        /// <p>The status of the transform job.</p>
        /// <p>Transform job statuses are:</p>
        /// <ul>
        /// <li> <p> <code>InProgress</code> - The job is in progress.</p> </li>
        /// <li> <p> <code>Completed</code> - The job has completed.</p> </li>
        /// <li> <p> <code>Failed</code> - The transform job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTransformJob</code> call.</p> </li>
        /// <li> <p> <code>Stopping</code> - The transform job is stopping.</p> </li>
        /// <li> <p> <code>Stopped</code> - The transform job has stopped.</p> </li>
        /// </ul>
        pub fn transform_job_status(mut self, input: crate::model::TransformJobStatus) -> Self {
            self.transform_job_status = Some(input);
            self
        }
        /// <p>The status of the transform job.</p>
        /// <p>Transform job statuses are:</p>
        /// <ul>
        /// <li> <p> <code>InProgress</code> - The job is in progress.</p> </li>
        /// <li> <p> <code>Completed</code> - The job has completed.</p> </li>
        /// <li> <p> <code>Failed</code> - The transform job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTransformJob</code> call.</p> </li>
        /// <li> <p> <code>Stopping</code> - The transform job is stopping.</p> </li>
        /// <li> <p> <code>Stopped</code> - The transform job has stopped.</p> </li>
        /// </ul>
        pub fn set_transform_job_status(
            mut self,
            input: std::option::Option<crate::model::TransformJobStatus>,
        ) -> Self {
            self.transform_job_status = input;
            self
        }
        /// <p>If the transform job failed, the reason it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the transform job failed, the reason it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The name of the model associated with the transform job.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model associated with the transform job.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. If <code>MaxConcurrentTransforms</code> is set to 0 or left unset, SageMaker checks the optional execution-parameters to determine the settings for your chosen algorithm. If the execution-parameters endpoint is not enabled, the default value is 1. For built-in algorithms, you don't need to set a value for <code>MaxConcurrentTransforms</code>.</p>
        pub fn max_concurrent_transforms(mut self, input: i32) -> Self {
            self.max_concurrent_transforms = Some(input);
            self
        }
        /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. If <code>MaxConcurrentTransforms</code> is set to 0 or left unset, SageMaker checks the optional execution-parameters to determine the settings for your chosen algorithm. If the execution-parameters endpoint is not enabled, the default value is 1. For built-in algorithms, you don't need to set a value for <code>MaxConcurrentTransforms</code>.</p>
        pub fn set_max_concurrent_transforms(mut self, input: std::option::Option<i32>) -> Self {
            self.max_concurrent_transforms = input;
            self
        }
        /// <p>Configures the timeout and maximum number of retries for processing a transform job invocation.</p>
        pub fn model_client_config(mut self, input: crate::model::ModelClientConfig) -> Self {
            self.model_client_config = Some(input);
            self
        }
        /// <p>Configures the timeout and maximum number of retries for processing a transform job invocation.</p>
        pub fn set_model_client_config(
            mut self,
            input: std::option::Option<crate::model::ModelClientConfig>,
        ) -> Self {
            self.model_client_config = input;
            self
        }
        /// <p>The maximum allowed size of the payload, in MB. A payload is the data portion of a record (without metadata). The value in <code>MaxPayloadInMB</code> must be greater than, or equal to, the size of a single record. To estimate the size of a record in MB, divide the size of your dataset by the number of records. To ensure that the records fit within the maximum payload size, we recommend using a slightly larger value. The default value is 6 MB. For cases where the payload might be arbitrarily large and is transmitted using HTTP chunked encoding, set the value to 0. This feature works only in supported algorithms. Currently, SageMaker built-in algorithms do not support HTTP chunked encoding.</p>
        pub fn max_payload_in_mb(mut self, input: i32) -> Self {
            self.max_payload_in_mb = Some(input);
            self
        }
        /// <p>The maximum allowed size of the payload, in MB. A payload is the data portion of a record (without metadata). The value in <code>MaxPayloadInMB</code> must be greater than, or equal to, the size of a single record. To estimate the size of a record in MB, divide the size of your dataset by the number of records. To ensure that the records fit within the maximum payload size, we recommend using a slightly larger value. The default value is 6 MB. For cases where the payload might be arbitrarily large and is transmitted using HTTP chunked encoding, set the value to 0. This feature works only in supported algorithms. Currently, SageMaker built-in algorithms do not support HTTP chunked encoding.</p>
        pub fn set_max_payload_in_mb(mut self, input: std::option::Option<i32>) -> Self {
            self.max_payload_in_mb = input;
            self
        }
        /// <p>Specifies the number of records to include in a mini-batch for an HTTP inference request. A record is a single unit of input data that inference can be made on. For example, a single line in a CSV file is a record.</p>
        pub fn batch_strategy(mut self, input: crate::model::BatchStrategy) -> Self {
            self.batch_strategy = Some(input);
            self
        }
        /// <p>Specifies the number of records to include in a mini-batch for an HTTP inference request. A record is a single unit of input data that inference can be made on. For example, a single line in a CSV file is a record.</p>
        pub fn set_batch_strategy(
            mut self,
            input: std::option::Option<crate::model::BatchStrategy>,
        ) -> Self {
            self.batch_strategy = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>Describes the input source of a transform job and the way the transform job consumes it.</p>
        pub fn transform_input(mut self, input: crate::model::TransformInput) -> Self {
            self.transform_input = Some(input);
            self
        }
        /// <p>Describes the input source of a transform job and the way the transform job consumes it.</p>
        pub fn set_transform_input(
            mut self,
            input: std::option::Option<crate::model::TransformInput>,
        ) -> Self {
            self.transform_input = input;
            self
        }
        /// <p>Describes the results of a transform job.</p>
        pub fn transform_output(mut self, input: crate::model::TransformOutput) -> Self {
            self.transform_output = Some(input);
            self
        }
        /// <p>Describes the results of a transform job.</p>
        pub fn set_transform_output(
            mut self,
            input: std::option::Option<crate::model::TransformOutput>,
        ) -> Self {
            self.transform_output = input;
            self
        }
        /// <p>Describes the resources, including ML instance types and ML instance count, to use for transform job.</p>
        pub fn transform_resources(mut self, input: crate::model::TransformResources) -> Self {
            self.transform_resources = Some(input);
            self
        }
        /// <p>Describes the resources, including ML instance types and ML instance count, to use for transform job.</p>
        pub fn set_transform_resources(
            mut self,
            input: std::option::Option<crate::model::TransformResources>,
        ) -> Self {
            self.transform_resources = input;
            self
        }
        /// <p>A timestamp that shows when the transform Job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the transform Job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Indicates when the transform job starts on ML instances. You are billed for the time interval between this time and the value of <code>TransformEndTime</code>.</p>
        pub fn transform_start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.transform_start_time = Some(input);
            self
        }
        /// <p>Indicates when the transform job starts on ML instances. You are billed for the time interval between this time and the value of <code>TransformEndTime</code>.</p>
        pub fn set_transform_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.transform_start_time = input;
            self
        }
        /// <p>Indicates when the transform job has been completed, or has stopped or failed. You are billed for the time interval between this time and the value of <code>TransformStartTime</code>.</p>
        pub fn transform_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.transform_end_time = Some(input);
            self
        }
        /// <p>Indicates when the transform job has been completed, or has stopped or failed. You are billed for the time interval between this time and the value of <code>TransformStartTime</code>.</p>
        pub fn set_transform_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.transform_end_time = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the labeling job that created the transform job.</p>
        pub fn labeling_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.labeling_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the labeling job that created the transform job.</p>
        pub fn set_labeling_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.labeling_job_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job that created the transform job.</p>
        pub fn auto_ml_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.auto_ml_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job that created the transform job.</p>
        pub fn set_auto_ml_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.auto_ml_job_arn = input;
            self
        }
        /// <p>The data structure used to specify the data to be used for inference in a batch transform job and to associate the data that is relevant to the prediction results in the output. The input filter provided allows you to exclude input data that is not needed for inference in a batch transform job. The output filter provided allows you to include input data relevant to interpreting the predictions in the output from the job. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html">Associate Prediction Results with their Corresponding Input Records</a>.</p>
        pub fn data_processing(mut self, input: crate::model::DataProcessing) -> Self {
            self.data_processing = Some(input);
            self
        }
        /// <p>The data structure used to specify the data to be used for inference in a batch transform job and to associate the data that is relevant to the prediction results in the output. The input filter provided allows you to exclude input data that is not needed for inference in a batch transform job. The output filter provided allows you to include input data relevant to interpreting the predictions in the output from the job. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html">Associate Prediction Results with their Corresponding Input Records</a>.</p>
        pub fn set_data_processing(
            mut self,
            input: std::option::Option<crate::model::DataProcessing>,
        ) -> Self {
            self.data_processing = input;
            self
        }
        /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
        /// <ul>
        /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
        /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
        /// <li> <p> <code>CreateTransformJob</code> </p> </li>
        /// </ul>
        pub fn experiment_config(mut self, input: crate::model::ExperimentConfig) -> Self {
            self.experiment_config = Some(input);
            self
        }
        /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
        /// <ul>
        /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
        /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
        /// <li> <p> <code>CreateTransformJob</code> </p> </li>
        /// </ul>
        pub fn set_experiment_config(
            mut self,
            input: std::option::Option<crate::model::ExperimentConfig>,
        ) -> Self {
            self.experiment_config = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of tags associated with the transform job.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of tags associated with the transform job.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformJob`](crate::model::TransformJob).
        pub fn build(self) -> crate::model::TransformJob {
            crate::model::TransformJob {
                transform_job_name: self.transform_job_name,
                transform_job_arn: self.transform_job_arn,
                transform_job_status: self.transform_job_status,
                failure_reason: self.failure_reason,
                model_name: self.model_name,
                max_concurrent_transforms: self.max_concurrent_transforms,
                model_client_config: self.model_client_config,
                max_payload_in_mb: self.max_payload_in_mb,
                batch_strategy: self.batch_strategy,
                environment: self.environment,
                transform_input: self.transform_input,
                transform_output: self.transform_output,
                transform_resources: self.transform_resources,
                creation_time: self.creation_time,
                transform_start_time: self.transform_start_time,
                transform_end_time: self.transform_end_time,
                labeling_job_arn: self.labeling_job_arn,
                auto_ml_job_arn: self.auto_ml_job_arn,
                data_processing: self.data_processing,
                experiment_config: self.experiment_config,
                tags: self.tags,
            }
        }
    }
}
impl TransformJob {
    /// Creates a new builder-style object to manufacture [`TransformJob`](crate::model::TransformJob).
    pub fn builder() -> crate::model::transform_job::Builder {
        crate::model::transform_job::Builder::default()
    }
}

/// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
/// <ul>
/// <li> <p> <code>CreateProcessingJob</code> </p> </li>
/// <li> <p> <code>CreateTrainingJob</code> </p> </li>
/// <li> <p> <code>CreateTransformJob</code> </p> </li>
/// </ul>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ExperimentConfig {
    /// <p>The name of an existing experiment to associate with the trial component.</p>
    #[doc(hidden)]
    pub experiment_name: std::option::Option<std::string::String>,
    /// <p>The name of an existing trial to associate the trial component with. If not specified, a new trial is created.</p>
    #[doc(hidden)]
    pub trial_name: std::option::Option<std::string::String>,
    /// <p>The display name for the trial component. If this key isn't specified, the display name is the trial component name.</p>
    #[doc(hidden)]
    pub trial_component_display_name: std::option::Option<std::string::String>,
    /// <p>The name of the experiment run to associate with the trial component.</p>
    #[doc(hidden)]
    pub run_name: std::option::Option<std::string::String>,
}
impl ExperimentConfig {
    /// <p>The name of an existing experiment to associate with the trial component.</p>
    pub fn experiment_name(&self) -> std::option::Option<&str> {
        self.experiment_name.as_deref()
    }
    /// <p>The name of an existing trial to associate the trial component with. If not specified, a new trial is created.</p>
    pub fn trial_name(&self) -> std::option::Option<&str> {
        self.trial_name.as_deref()
    }
    /// <p>The display name for the trial component. If this key isn't specified, the display name is the trial component name.</p>
    pub fn trial_component_display_name(&self) -> std::option::Option<&str> {
        self.trial_component_display_name.as_deref()
    }
    /// <p>The name of the experiment run to associate with the trial component.</p>
    pub fn run_name(&self) -> std::option::Option<&str> {
        self.run_name.as_deref()
    }
}
/// See [`ExperimentConfig`](crate::model::ExperimentConfig).
pub mod experiment_config {

    /// A builder for [`ExperimentConfig`](crate::model::ExperimentConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) experiment_name: std::option::Option<std::string::String>,
        pub(crate) trial_name: std::option::Option<std::string::String>,
        pub(crate) trial_component_display_name: std::option::Option<std::string::String>,
        pub(crate) run_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of an existing experiment to associate with the trial component.</p>
        pub fn experiment_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_name = Some(input.into());
            self
        }
        /// <p>The name of an existing experiment to associate with the trial component.</p>
        pub fn set_experiment_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_name = input;
            self
        }
        /// <p>The name of an existing trial to associate the trial component with. If not specified, a new trial is created.</p>
        pub fn trial_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_name = Some(input.into());
            self
        }
        /// <p>The name of an existing trial to associate the trial component with. If not specified, a new trial is created.</p>
        pub fn set_trial_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_name = input;
            self
        }
        /// <p>The display name for the trial component. If this key isn't specified, the display name is the trial component name.</p>
        pub fn trial_component_display_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.trial_component_display_name = Some(input.into());
            self
        }
        /// <p>The display name for the trial component. If this key isn't specified, the display name is the trial component name.</p>
        pub fn set_trial_component_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_display_name = input;
            self
        }
        /// <p>The name of the experiment run to associate with the trial component.</p>
        pub fn run_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.run_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment run to associate with the trial component.</p>
        pub fn set_run_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.run_name = input;
            self
        }
        /// Consumes the builder and constructs a [`ExperimentConfig`](crate::model::ExperimentConfig).
        pub fn build(self) -> crate::model::ExperimentConfig {
            crate::model::ExperimentConfig {
                experiment_name: self.experiment_name,
                trial_name: self.trial_name,
                trial_component_display_name: self.trial_component_display_name,
                run_name: self.run_name,
            }
        }
    }
}
impl ExperimentConfig {
    /// Creates a new builder-style object to manufacture [`ExperimentConfig`](crate::model::ExperimentConfig).
    pub fn builder() -> crate::model::experiment_config::Builder {
        crate::model::experiment_config::Builder::default()
    }
}

/// <p>The data structure used to specify the data to be used for inference in a batch transform job and to associate the data that is relevant to the prediction results in the output. The input filter provided allows you to exclude input data that is not needed for inference in a batch transform job. The output filter provided allows you to include input data relevant to interpreting the predictions in the output from the job. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html">Associate Prediction Results with their Corresponding Input Records</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataProcessing {
    /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the input data to pass to the algorithm. Use the <code>InputFilter</code> parameter to exclude fields, such as an ID column, from the input. If you want SageMaker to pass the entire input dataset to the algorithm, accept the default value <code>$</code>.</p>
    /// <p>Examples: <code>"$"</code>, <code>"$[1:]"</code>, <code>"$.features"</code> </p>
    #[doc(hidden)]
    pub input_filter: std::option::Option<std::string::String>,
    /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the joined dataset to save in the output file for a batch transform job. If you want SageMaker to store the entire input dataset in the output file, leave the default value, <code>$</code>. If you specify indexes that aren't within the dimension size of the joined dataset, you get an error.</p>
    /// <p>Examples: <code>"$"</code>, <code>"$[0,5:]"</code>, <code>"$['id','SageMakerOutput']"</code> </p>
    #[doc(hidden)]
    pub output_filter: std::option::Option<std::string::String>,
    /// <p>Specifies the source of the data to join with the transformed data. The valid values are <code>None</code> and <code>Input</code>. The default value is <code>None</code>, which specifies not to join the input with the transformed data. If you want the batch transform job to join the original input data with the transformed data, set <code>JoinSource</code> to <code>Input</code>. You can specify <code>OutputFilter</code> as an additional filter to select a portion of the joined dataset and store it in the output file.</p>
    /// <p>For JSON or JSONLines objects, such as a JSON array, SageMaker adds the transformed data to the input JSON object in an attribute called <code>SageMakerOutput</code>. The joined result for JSON must be a key-value pair object. If the input is not a key-value pair object, SageMaker creates a new JSON file. In the new JSON file, and the input data is stored under the <code>SageMakerInput</code> key and the results are stored in <code>SageMakerOutput</code>.</p>
    /// <p>For CSV data, SageMaker takes each row as a JSON array and joins the transformed data with the input by appending each transformed row to the end of the input. The joined data has the original input data followed by the transformed data and the output is a CSV file.</p>
    /// <p>For information on how joining in applied, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#batch-transform-data-processing-workflow">Workflow for Associating Inferences with Input Records</a>.</p>
    #[doc(hidden)]
    pub join_source: std::option::Option<crate::model::JoinSource>,
}
impl DataProcessing {
    /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the input data to pass to the algorithm. Use the <code>InputFilter</code> parameter to exclude fields, such as an ID column, from the input. If you want SageMaker to pass the entire input dataset to the algorithm, accept the default value <code>$</code>.</p>
    /// <p>Examples: <code>"$"</code>, <code>"$[1:]"</code>, <code>"$.features"</code> </p>
    pub fn input_filter(&self) -> std::option::Option<&str> {
        self.input_filter.as_deref()
    }
    /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the joined dataset to save in the output file for a batch transform job. If you want SageMaker to store the entire input dataset in the output file, leave the default value, <code>$</code>. If you specify indexes that aren't within the dimension size of the joined dataset, you get an error.</p>
    /// <p>Examples: <code>"$"</code>, <code>"$[0,5:]"</code>, <code>"$['id','SageMakerOutput']"</code> </p>
    pub fn output_filter(&self) -> std::option::Option<&str> {
        self.output_filter.as_deref()
    }
    /// <p>Specifies the source of the data to join with the transformed data. The valid values are <code>None</code> and <code>Input</code>. The default value is <code>None</code>, which specifies not to join the input with the transformed data. If you want the batch transform job to join the original input data with the transformed data, set <code>JoinSource</code> to <code>Input</code>. You can specify <code>OutputFilter</code> as an additional filter to select a portion of the joined dataset and store it in the output file.</p>
    /// <p>For JSON or JSONLines objects, such as a JSON array, SageMaker adds the transformed data to the input JSON object in an attribute called <code>SageMakerOutput</code>. The joined result for JSON must be a key-value pair object. If the input is not a key-value pair object, SageMaker creates a new JSON file. In the new JSON file, and the input data is stored under the <code>SageMakerInput</code> key and the results are stored in <code>SageMakerOutput</code>.</p>
    /// <p>For CSV data, SageMaker takes each row as a JSON array and joins the transformed data with the input by appending each transformed row to the end of the input. The joined data has the original input data followed by the transformed data and the output is a CSV file.</p>
    /// <p>For information on how joining in applied, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#batch-transform-data-processing-workflow">Workflow for Associating Inferences with Input Records</a>.</p>
    pub fn join_source(&self) -> std::option::Option<&crate::model::JoinSource> {
        self.join_source.as_ref()
    }
}
/// See [`DataProcessing`](crate::model::DataProcessing).
pub mod data_processing {

    /// A builder for [`DataProcessing`](crate::model::DataProcessing).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) input_filter: std::option::Option<std::string::String>,
        pub(crate) output_filter: std::option::Option<std::string::String>,
        pub(crate) join_source: std::option::Option<crate::model::JoinSource>,
    }
    impl Builder {
        /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the input data to pass to the algorithm. Use the <code>InputFilter</code> parameter to exclude fields, such as an ID column, from the input. If you want SageMaker to pass the entire input dataset to the algorithm, accept the default value <code>$</code>.</p>
        /// <p>Examples: <code>"$"</code>, <code>"$[1:]"</code>, <code>"$.features"</code> </p>
        pub fn input_filter(mut self, input: impl Into<std::string::String>) -> Self {
            self.input_filter = Some(input.into());
            self
        }
        /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the input data to pass to the algorithm. Use the <code>InputFilter</code> parameter to exclude fields, such as an ID column, from the input. If you want SageMaker to pass the entire input dataset to the algorithm, accept the default value <code>$</code>.</p>
        /// <p>Examples: <code>"$"</code>, <code>"$[1:]"</code>, <code>"$.features"</code> </p>
        pub fn set_input_filter(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.input_filter = input;
            self
        }
        /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the joined dataset to save in the output file for a batch transform job. If you want SageMaker to store the entire input dataset in the output file, leave the default value, <code>$</code>. If you specify indexes that aren't within the dimension size of the joined dataset, you get an error.</p>
        /// <p>Examples: <code>"$"</code>, <code>"$[0,5:]"</code>, <code>"$['id','SageMakerOutput']"</code> </p>
        pub fn output_filter(mut self, input: impl Into<std::string::String>) -> Self {
            self.output_filter = Some(input.into());
            self
        }
        /// <p>A <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#data-processing-operators">JSONPath</a> expression used to select a portion of the joined dataset to save in the output file for a batch transform job. If you want SageMaker to store the entire input dataset in the output file, leave the default value, <code>$</code>. If you specify indexes that aren't within the dimension size of the joined dataset, you get an error.</p>
        /// <p>Examples: <code>"$"</code>, <code>"$[0,5:]"</code>, <code>"$['id','SageMakerOutput']"</code> </p>
        pub fn set_output_filter(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.output_filter = input;
            self
        }
        /// <p>Specifies the source of the data to join with the transformed data. The valid values are <code>None</code> and <code>Input</code>. The default value is <code>None</code>, which specifies not to join the input with the transformed data. If you want the batch transform job to join the original input data with the transformed data, set <code>JoinSource</code> to <code>Input</code>. You can specify <code>OutputFilter</code> as an additional filter to select a portion of the joined dataset and store it in the output file.</p>
        /// <p>For JSON or JSONLines objects, such as a JSON array, SageMaker adds the transformed data to the input JSON object in an attribute called <code>SageMakerOutput</code>. The joined result for JSON must be a key-value pair object. If the input is not a key-value pair object, SageMaker creates a new JSON file. In the new JSON file, and the input data is stored under the <code>SageMakerInput</code> key and the results are stored in <code>SageMakerOutput</code>.</p>
        /// <p>For CSV data, SageMaker takes each row as a JSON array and joins the transformed data with the input by appending each transformed row to the end of the input. The joined data has the original input data followed by the transformed data and the output is a CSV file.</p>
        /// <p>For information on how joining in applied, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#batch-transform-data-processing-workflow">Workflow for Associating Inferences with Input Records</a>.</p>
        pub fn join_source(mut self, input: crate::model::JoinSource) -> Self {
            self.join_source = Some(input);
            self
        }
        /// <p>Specifies the source of the data to join with the transformed data. The valid values are <code>None</code> and <code>Input</code>. The default value is <code>None</code>, which specifies not to join the input with the transformed data. If you want the batch transform job to join the original input data with the transformed data, set <code>JoinSource</code> to <code>Input</code>. You can specify <code>OutputFilter</code> as an additional filter to select a portion of the joined dataset and store it in the output file.</p>
        /// <p>For JSON or JSONLines objects, such as a JSON array, SageMaker adds the transformed data to the input JSON object in an attribute called <code>SageMakerOutput</code>. The joined result for JSON must be a key-value pair object. If the input is not a key-value pair object, SageMaker creates a new JSON file. In the new JSON file, and the input data is stored under the <code>SageMakerInput</code> key and the results are stored in <code>SageMakerOutput</code>.</p>
        /// <p>For CSV data, SageMaker takes each row as a JSON array and joins the transformed data with the input by appending each transformed row to the end of the input. The joined data has the original input data followed by the transformed data and the output is a CSV file.</p>
        /// <p>For information on how joining in applied, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#batch-transform-data-processing-workflow">Workflow for Associating Inferences with Input Records</a>.</p>
        pub fn set_join_source(
            mut self,
            input: std::option::Option<crate::model::JoinSource>,
        ) -> Self {
            self.join_source = input;
            self
        }
        /// Consumes the builder and constructs a [`DataProcessing`](crate::model::DataProcessing).
        pub fn build(self) -> crate::model::DataProcessing {
            crate::model::DataProcessing {
                input_filter: self.input_filter,
                output_filter: self.output_filter,
                join_source: self.join_source,
            }
        }
    }
}
impl DataProcessing {
    /// Creates a new builder-style object to manufacture [`DataProcessing`](crate::model::DataProcessing).
    pub fn builder() -> crate::model::data_processing::Builder {
        crate::model::data_processing::Builder::default()
    }
}

/// When writing a match expression against `JoinSource`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let joinsource = unimplemented!();
/// match joinsource {
///     JoinSource::Input => { /* ... */ },
///     JoinSource::None => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `joinsource` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `JoinSource::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `JoinSource::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `JoinSource::NewFeature` is defined.
/// Specifically, when `joinsource` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `JoinSource::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum JoinSource {
    #[allow(missing_docs)] // documentation missing in model
    Input,
    #[allow(missing_docs)] // documentation missing in model
    None,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for JoinSource {
    fn from(s: &str) -> Self {
        match s {
            "Input" => JoinSource::Input,
            "None" => JoinSource::None,
            other => JoinSource::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for JoinSource {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(JoinSource::from(s))
    }
}
impl JoinSource {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            JoinSource::Input => "Input",
            JoinSource::None => "None",
            JoinSource::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Input", "None"]
    }
}
impl AsRef<str> for JoinSource {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the resources, including ML instance types and ML instance count, to use for transform job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformResources {
    /// <p>The ML compute instance type for the transform job. If you are using built-in algorithms to transform moderately sized datasets, we recommend using ml.m4.xlarge or <code>ml.m5.large</code>instance types.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::TransformInstanceType>,
    /// <p>The number of ML compute instances to use in the transform job. The default value is <code>1</code>, and the maximum is <code>100</code>. For distributed transform jobs, specify a value greater than <code>1</code>.</p>
    #[doc(hidden)]
    pub instance_count: std::option::Option<i32>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt model data on the storage volume attached to the ML compute instance(s) that run the batch transform job.</p> <note>
    /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
    /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
    /// </note>
    /// <p> The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
}
impl TransformResources {
    /// <p>The ML compute instance type for the transform job. If you are using built-in algorithms to transform moderately sized datasets, we recommend using ml.m4.xlarge or <code>ml.m5.large</code>instance types.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::TransformInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The number of ML compute instances to use in the transform job. The default value is <code>1</code>, and the maximum is <code>100</code>. For distributed transform jobs, specify a value greater than <code>1</code>.</p>
    pub fn instance_count(&self) -> std::option::Option<i32> {
        self.instance_count
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt model data on the storage volume attached to the ML compute instance(s) that run the batch transform job.</p> <note>
    /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
    /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
    /// </note>
    /// <p> The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
}
/// See [`TransformResources`](crate::model::TransformResources).
pub mod transform_resources {

    /// A builder for [`TransformResources`](crate::model::TransformResources).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::TransformInstanceType>,
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The ML compute instance type for the transform job. If you are using built-in algorithms to transform moderately sized datasets, we recommend using ml.m4.xlarge or <code>ml.m5.large</code>instance types.</p>
        pub fn instance_type(mut self, input: crate::model::TransformInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The ML compute instance type for the transform job. If you are using built-in algorithms to transform moderately sized datasets, we recommend using ml.m4.xlarge or <code>ml.m5.large</code>instance types.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::TransformInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The number of ML compute instances to use in the transform job. The default value is <code>1</code>, and the maximum is <code>100</code>. For distributed transform jobs, specify a value greater than <code>1</code>.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of ML compute instances to use in the transform job. The default value is <code>1</code>, and the maximum is <code>100</code>. For distributed transform jobs, specify a value greater than <code>1</code>.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt model data on the storage volume attached to the ML compute instance(s) that run the batch transform job.</p> <note>
        /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
        /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
        /// </note>
        /// <p> The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt model data on the storage volume attached to the ML compute instance(s) that run the batch transform job.</p> <note>
        /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
        /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
        /// </note>
        /// <p> The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformResources`](crate::model::TransformResources).
        pub fn build(self) -> crate::model::TransformResources {
            crate::model::TransformResources {
                instance_type: self.instance_type,
                instance_count: self.instance_count,
                volume_kms_key_id: self.volume_kms_key_id,
            }
        }
    }
}
impl TransformResources {
    /// Creates a new builder-style object to manufacture [`TransformResources`](crate::model::TransformResources).
    pub fn builder() -> crate::model::transform_resources::Builder {
        crate::model::transform_resources::Builder::default()
    }
}

/// <p>Describes the results of a transform job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformOutput {
    /// <p>The Amazon S3 path where you want Amazon SageMaker to store the results of the transform job. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
    /// <p>For every S3 object used as input for the transform job, batch transform stores the transformed data with an .<code>out</code> suffix in a corresponding subfolder in the location in the output prefix. For example, for the input data stored at <code>s3://bucket-name/input-name-prefix/dataset01/data.csv</code>, batch transform stores the transformed data at <code>s3://bucket-name/output-name-prefix/input-name-prefix/data.csv.out</code>. Batch transform doesn't upload partially processed objects. For an input S3 object that contains multiple records, it creates an .<code>out</code> file only if the transform job succeeds on the entire file. When the input contains multiple S3 objects, the batch transform job processes the listed S3 objects and uploads only the output for successfully processed objects. If any object fails in the transform job batch transform marks the job as failed to prompt investigation.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>The MIME type used to specify the output data. Amazon SageMaker uses the MIME type with each http call to transfer data from the transform job.</p>
    #[doc(hidden)]
    pub accept: std::option::Option<std::string::String>,
    /// <p>Defines how to assemble the results of the transform job as a single S3 object. Choose a format that is most convenient to you. To concatenate the results in binary format, specify <code>None</code>. To add a newline character at the end of every transformed record, specify <code>Line</code>.</p>
    #[doc(hidden)]
    pub assemble_with: std::option::Option<crate::model::AssemblyType>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html">CreateModel</a> request. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl TransformOutput {
    /// <p>The Amazon S3 path where you want Amazon SageMaker to store the results of the transform job. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
    /// <p>For every S3 object used as input for the transform job, batch transform stores the transformed data with an .<code>out</code> suffix in a corresponding subfolder in the location in the output prefix. For example, for the input data stored at <code>s3://bucket-name/input-name-prefix/dataset01/data.csv</code>, batch transform stores the transformed data at <code>s3://bucket-name/output-name-prefix/input-name-prefix/data.csv.out</code>. Batch transform doesn't upload partially processed objects. For an input S3 object that contains multiple records, it creates an .<code>out</code> file only if the transform job succeeds on the entire file. When the input contains multiple S3 objects, the batch transform job processes the listed S3 objects and uploads only the output for successfully processed objects. If any object fails in the transform job batch transform marks the job as failed to prompt investigation.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>The MIME type used to specify the output data. Amazon SageMaker uses the MIME type with each http call to transfer data from the transform job.</p>
    pub fn accept(&self) -> std::option::Option<&str> {
        self.accept.as_deref()
    }
    /// <p>Defines how to assemble the results of the transform job as a single S3 object. Choose a format that is most convenient to you. To concatenate the results in binary format, specify <code>None</code>. To add a newline character at the end of every transformed record, specify <code>Line</code>.</p>
    pub fn assemble_with(&self) -> std::option::Option<&crate::model::AssemblyType> {
        self.assemble_with.as_ref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html">CreateModel</a> request. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`TransformOutput`](crate::model::TransformOutput).
pub mod transform_output {

    /// A builder for [`TransformOutput`](crate::model::TransformOutput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) accept: std::option::Option<std::string::String>,
        pub(crate) assemble_with: std::option::Option<crate::model::AssemblyType>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 path where you want Amazon SageMaker to store the results of the transform job. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
        /// <p>For every S3 object used as input for the transform job, batch transform stores the transformed data with an .<code>out</code> suffix in a corresponding subfolder in the location in the output prefix. For example, for the input data stored at <code>s3://bucket-name/input-name-prefix/dataset01/data.csv</code>, batch transform stores the transformed data at <code>s3://bucket-name/output-name-prefix/input-name-prefix/data.csv.out</code>. Batch transform doesn't upload partially processed objects. For an input S3 object that contains multiple records, it creates an .<code>out</code> file only if the transform job succeeds on the entire file. When the input contains multiple S3 objects, the batch transform job processes the listed S3 objects and uploads only the output for successfully processed objects. If any object fails in the transform job batch transform marks the job as failed to prompt investigation.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 path where you want Amazon SageMaker to store the results of the transform job. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
        /// <p>For every S3 object used as input for the transform job, batch transform stores the transformed data with an .<code>out</code> suffix in a corresponding subfolder in the location in the output prefix. For example, for the input data stored at <code>s3://bucket-name/input-name-prefix/dataset01/data.csv</code>, batch transform stores the transformed data at <code>s3://bucket-name/output-name-prefix/input-name-prefix/data.csv.out</code>. Batch transform doesn't upload partially processed objects. For an input S3 object that contains multiple records, it creates an .<code>out</code> file only if the transform job succeeds on the entire file. When the input contains multiple S3 objects, the batch transform job processes the listed S3 objects and uploads only the output for successfully processed objects. If any object fails in the transform job batch transform marks the job as failed to prompt investigation.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>The MIME type used to specify the output data. Amazon SageMaker uses the MIME type with each http call to transfer data from the transform job.</p>
        pub fn accept(mut self, input: impl Into<std::string::String>) -> Self {
            self.accept = Some(input.into());
            self
        }
        /// <p>The MIME type used to specify the output data. Amazon SageMaker uses the MIME type with each http call to transfer data from the transform job.</p>
        pub fn set_accept(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.accept = input;
            self
        }
        /// <p>Defines how to assemble the results of the transform job as a single S3 object. Choose a format that is most convenient to you. To concatenate the results in binary format, specify <code>None</code>. To add a newline character at the end of every transformed record, specify <code>Line</code>.</p>
        pub fn assemble_with(mut self, input: crate::model::AssemblyType) -> Self {
            self.assemble_with = Some(input);
            self
        }
        /// <p>Defines how to assemble the results of the transform job as a single S3 object. Choose a format that is most convenient to you. To concatenate the results in binary format, specify <code>None</code>. To add a newline character at the end of every transformed record, specify <code>Line</code>.</p>
        pub fn set_assemble_with(
            mut self,
            input: std::option::Option<crate::model::AssemblyType>,
        ) -> Self {
            self.assemble_with = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html">CreateModel</a> request. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html">CreateModel</a> request. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformOutput`](crate::model::TransformOutput).
        pub fn build(self) -> crate::model::TransformOutput {
            crate::model::TransformOutput {
                s3_output_path: self.s3_output_path,
                accept: self.accept,
                assemble_with: self.assemble_with,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl TransformOutput {
    /// Creates a new builder-style object to manufacture [`TransformOutput`](crate::model::TransformOutput).
    pub fn builder() -> crate::model::transform_output::Builder {
        crate::model::transform_output::Builder::default()
    }
}

/// When writing a match expression against `AssemblyType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let assemblytype = unimplemented!();
/// match assemblytype {
///     AssemblyType::Line => { /* ... */ },
///     AssemblyType::None => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `assemblytype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AssemblyType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AssemblyType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AssemblyType::NewFeature` is defined.
/// Specifically, when `assemblytype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AssemblyType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AssemblyType {
    #[allow(missing_docs)] // documentation missing in model
    Line,
    #[allow(missing_docs)] // documentation missing in model
    None,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AssemblyType {
    fn from(s: &str) -> Self {
        match s {
            "Line" => AssemblyType::Line,
            "None" => AssemblyType::None,
            other => AssemblyType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AssemblyType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AssemblyType::from(s))
    }
}
impl AssemblyType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AssemblyType::Line => "Line",
            AssemblyType::None => "None",
            AssemblyType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Line", "None"]
    }
}
impl AsRef<str> for AssemblyType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the input source of a transform job and the way the transform job consumes it.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformInput {
    /// <p>Describes the location of the channel data, which is, the S3 location of the input data that the model can consume.</p>
    #[doc(hidden)]
    pub data_source: std::option::Option<crate::model::TransformDataSource>,
    /// <p>The multipurpose internet mail extension (MIME) type of the data. Amazon SageMaker uses the MIME type with each http call to transfer data to the transform job.</p>
    #[doc(hidden)]
    pub content_type: std::option::Option<std::string::String>,
    /// <p>If your transform data is compressed, specify the compression type. Amazon SageMaker automatically decompresses the data for the transform job accordingly. The default value is <code>None</code>.</p>
    #[doc(hidden)]
    pub compression_type: std::option::Option<crate::model::CompressionType>,
    /// <p>The method to use to split the transform job's data files into smaller batches. Splitting is necessary when the total size of each object is too large to fit in a single request. You can also use data splitting to improve performance by processing multiple concurrent mini-batches. The default value for <code>SplitType</code> is <code>None</code>, which indicates that input data files are not split, and request payloads contain the entire contents of an input object. Set the value of this parameter to <code>Line</code> to split records on a newline character boundary. <code>SplitType</code> also supports a number of record-oriented binary data formats. Currently, the supported record formats are:</p>
    /// <ul>
    /// <li> <p>RecordIO</p> </li>
    /// <li> <p>TFRecord</p> </li>
    /// </ul>
    /// <p>When splitting is enabled, the size of a mini-batch depends on the values of the <code>BatchStrategy</code> and <code>MaxPayloadInMB</code> parameters. When the value of <code>BatchStrategy</code> is <code>MultiRecord</code>, Amazon SageMaker sends the maximum number of records in each request, up to the <code>MaxPayloadInMB</code> limit. If the value of <code>BatchStrategy</code> is <code>SingleRecord</code>, Amazon SageMaker sends individual records in each request.</p> <note>
    /// <p>Some data formats represent a record as a binary payload wrapped with extra padding bytes. When splitting is applied to a binary data format, padding is removed if the value of <code>BatchStrategy</code> is set to <code>SingleRecord</code>. Padding is not removed if the value of <code>BatchStrategy</code> is set to <code>MultiRecord</code>.</p>
    /// <p>For more information about <code>RecordIO</code>, see <a href="https://mxnet.apache.org/api/faq/recordio">Create a Dataset Using RecordIO</a> in the MXNet documentation. For more information about <code>TFRecord</code>, see <a href="https://www.tensorflow.org/guide/data#consuming_tfrecord_data">Consuming TFRecord data</a> in the TensorFlow documentation.</p>
    /// </note>
    #[doc(hidden)]
    pub split_type: std::option::Option<crate::model::SplitType>,
}
impl TransformInput {
    /// <p>Describes the location of the channel data, which is, the S3 location of the input data that the model can consume.</p>
    pub fn data_source(&self) -> std::option::Option<&crate::model::TransformDataSource> {
        self.data_source.as_ref()
    }
    /// <p>The multipurpose internet mail extension (MIME) type of the data. Amazon SageMaker uses the MIME type with each http call to transfer data to the transform job.</p>
    pub fn content_type(&self) -> std::option::Option<&str> {
        self.content_type.as_deref()
    }
    /// <p>If your transform data is compressed, specify the compression type. Amazon SageMaker automatically decompresses the data for the transform job accordingly. The default value is <code>None</code>.</p>
    pub fn compression_type(&self) -> std::option::Option<&crate::model::CompressionType> {
        self.compression_type.as_ref()
    }
    /// <p>The method to use to split the transform job's data files into smaller batches. Splitting is necessary when the total size of each object is too large to fit in a single request. You can also use data splitting to improve performance by processing multiple concurrent mini-batches. The default value for <code>SplitType</code> is <code>None</code>, which indicates that input data files are not split, and request payloads contain the entire contents of an input object. Set the value of this parameter to <code>Line</code> to split records on a newline character boundary. <code>SplitType</code> also supports a number of record-oriented binary data formats. Currently, the supported record formats are:</p>
    /// <ul>
    /// <li> <p>RecordIO</p> </li>
    /// <li> <p>TFRecord</p> </li>
    /// </ul>
    /// <p>When splitting is enabled, the size of a mini-batch depends on the values of the <code>BatchStrategy</code> and <code>MaxPayloadInMB</code> parameters. When the value of <code>BatchStrategy</code> is <code>MultiRecord</code>, Amazon SageMaker sends the maximum number of records in each request, up to the <code>MaxPayloadInMB</code> limit. If the value of <code>BatchStrategy</code> is <code>SingleRecord</code>, Amazon SageMaker sends individual records in each request.</p> <note>
    /// <p>Some data formats represent a record as a binary payload wrapped with extra padding bytes. When splitting is applied to a binary data format, padding is removed if the value of <code>BatchStrategy</code> is set to <code>SingleRecord</code>. Padding is not removed if the value of <code>BatchStrategy</code> is set to <code>MultiRecord</code>.</p>
    /// <p>For more information about <code>RecordIO</code>, see <a href="https://mxnet.apache.org/api/faq/recordio">Create a Dataset Using RecordIO</a> in the MXNet documentation. For more information about <code>TFRecord</code>, see <a href="https://www.tensorflow.org/guide/data#consuming_tfrecord_data">Consuming TFRecord data</a> in the TensorFlow documentation.</p>
    /// </note>
    pub fn split_type(&self) -> std::option::Option<&crate::model::SplitType> {
        self.split_type.as_ref()
    }
}
/// See [`TransformInput`](crate::model::TransformInput).
pub mod transform_input {

    /// A builder for [`TransformInput`](crate::model::TransformInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) data_source: std::option::Option<crate::model::TransformDataSource>,
        pub(crate) content_type: std::option::Option<std::string::String>,
        pub(crate) compression_type: std::option::Option<crate::model::CompressionType>,
        pub(crate) split_type: std::option::Option<crate::model::SplitType>,
    }
    impl Builder {
        /// <p>Describes the location of the channel data, which is, the S3 location of the input data that the model can consume.</p>
        pub fn data_source(mut self, input: crate::model::TransformDataSource) -> Self {
            self.data_source = Some(input);
            self
        }
        /// <p>Describes the location of the channel data, which is, the S3 location of the input data that the model can consume.</p>
        pub fn set_data_source(
            mut self,
            input: std::option::Option<crate::model::TransformDataSource>,
        ) -> Self {
            self.data_source = input;
            self
        }
        /// <p>The multipurpose internet mail extension (MIME) type of the data. Amazon SageMaker uses the MIME type with each http call to transfer data to the transform job.</p>
        pub fn content_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_type = Some(input.into());
            self
        }
        /// <p>The multipurpose internet mail extension (MIME) type of the data. Amazon SageMaker uses the MIME type with each http call to transfer data to the transform job.</p>
        pub fn set_content_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content_type = input;
            self
        }
        /// <p>If your transform data is compressed, specify the compression type. Amazon SageMaker automatically decompresses the data for the transform job accordingly. The default value is <code>None</code>.</p>
        pub fn compression_type(mut self, input: crate::model::CompressionType) -> Self {
            self.compression_type = Some(input);
            self
        }
        /// <p>If your transform data is compressed, specify the compression type. Amazon SageMaker automatically decompresses the data for the transform job accordingly. The default value is <code>None</code>.</p>
        pub fn set_compression_type(
            mut self,
            input: std::option::Option<crate::model::CompressionType>,
        ) -> Self {
            self.compression_type = input;
            self
        }
        /// <p>The method to use to split the transform job's data files into smaller batches. Splitting is necessary when the total size of each object is too large to fit in a single request. You can also use data splitting to improve performance by processing multiple concurrent mini-batches. The default value for <code>SplitType</code> is <code>None</code>, which indicates that input data files are not split, and request payloads contain the entire contents of an input object. Set the value of this parameter to <code>Line</code> to split records on a newline character boundary. <code>SplitType</code> also supports a number of record-oriented binary data formats. Currently, the supported record formats are:</p>
        /// <ul>
        /// <li> <p>RecordIO</p> </li>
        /// <li> <p>TFRecord</p> </li>
        /// </ul>
        /// <p>When splitting is enabled, the size of a mini-batch depends on the values of the <code>BatchStrategy</code> and <code>MaxPayloadInMB</code> parameters. When the value of <code>BatchStrategy</code> is <code>MultiRecord</code>, Amazon SageMaker sends the maximum number of records in each request, up to the <code>MaxPayloadInMB</code> limit. If the value of <code>BatchStrategy</code> is <code>SingleRecord</code>, Amazon SageMaker sends individual records in each request.</p> <note>
        /// <p>Some data formats represent a record as a binary payload wrapped with extra padding bytes. When splitting is applied to a binary data format, padding is removed if the value of <code>BatchStrategy</code> is set to <code>SingleRecord</code>. Padding is not removed if the value of <code>BatchStrategy</code> is set to <code>MultiRecord</code>.</p>
        /// <p>For more information about <code>RecordIO</code>, see <a href="https://mxnet.apache.org/api/faq/recordio">Create a Dataset Using RecordIO</a> in the MXNet documentation. For more information about <code>TFRecord</code>, see <a href="https://www.tensorflow.org/guide/data#consuming_tfrecord_data">Consuming TFRecord data</a> in the TensorFlow documentation.</p>
        /// </note>
        pub fn split_type(mut self, input: crate::model::SplitType) -> Self {
            self.split_type = Some(input);
            self
        }
        /// <p>The method to use to split the transform job's data files into smaller batches. Splitting is necessary when the total size of each object is too large to fit in a single request. You can also use data splitting to improve performance by processing multiple concurrent mini-batches. The default value for <code>SplitType</code> is <code>None</code>, which indicates that input data files are not split, and request payloads contain the entire contents of an input object. Set the value of this parameter to <code>Line</code> to split records on a newline character boundary. <code>SplitType</code> also supports a number of record-oriented binary data formats. Currently, the supported record formats are:</p>
        /// <ul>
        /// <li> <p>RecordIO</p> </li>
        /// <li> <p>TFRecord</p> </li>
        /// </ul>
        /// <p>When splitting is enabled, the size of a mini-batch depends on the values of the <code>BatchStrategy</code> and <code>MaxPayloadInMB</code> parameters. When the value of <code>BatchStrategy</code> is <code>MultiRecord</code>, Amazon SageMaker sends the maximum number of records in each request, up to the <code>MaxPayloadInMB</code> limit. If the value of <code>BatchStrategy</code> is <code>SingleRecord</code>, Amazon SageMaker sends individual records in each request.</p> <note>
        /// <p>Some data formats represent a record as a binary payload wrapped with extra padding bytes. When splitting is applied to a binary data format, padding is removed if the value of <code>BatchStrategy</code> is set to <code>SingleRecord</code>. Padding is not removed if the value of <code>BatchStrategy</code> is set to <code>MultiRecord</code>.</p>
        /// <p>For more information about <code>RecordIO</code>, see <a href="https://mxnet.apache.org/api/faq/recordio">Create a Dataset Using RecordIO</a> in the MXNet documentation. For more information about <code>TFRecord</code>, see <a href="https://www.tensorflow.org/guide/data#consuming_tfrecord_data">Consuming TFRecord data</a> in the TensorFlow documentation.</p>
        /// </note>
        pub fn set_split_type(
            mut self,
            input: std::option::Option<crate::model::SplitType>,
        ) -> Self {
            self.split_type = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformInput`](crate::model::TransformInput).
        pub fn build(self) -> crate::model::TransformInput {
            crate::model::TransformInput {
                data_source: self.data_source,
                content_type: self.content_type,
                compression_type: self.compression_type,
                split_type: self.split_type,
            }
        }
    }
}
impl TransformInput {
    /// Creates a new builder-style object to manufacture [`TransformInput`](crate::model::TransformInput).
    pub fn builder() -> crate::model::transform_input::Builder {
        crate::model::transform_input::Builder::default()
    }
}

/// When writing a match expression against `SplitType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let splittype = unimplemented!();
/// match splittype {
///     SplitType::Line => { /* ... */ },
///     SplitType::None => { /* ... */ },
///     SplitType::Recordio => { /* ... */ },
///     SplitType::Tfrecord => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `splittype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SplitType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SplitType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SplitType::NewFeature` is defined.
/// Specifically, when `splittype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SplitType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SplitType {
    #[allow(missing_docs)] // documentation missing in model
    Line,
    #[allow(missing_docs)] // documentation missing in model
    None,
    #[allow(missing_docs)] // documentation missing in model
    Recordio,
    #[allow(missing_docs)] // documentation missing in model
    Tfrecord,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SplitType {
    fn from(s: &str) -> Self {
        match s {
            "Line" => SplitType::Line,
            "None" => SplitType::None,
            "RecordIO" => SplitType::Recordio,
            "TFRecord" => SplitType::Tfrecord,
            other => SplitType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SplitType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SplitType::from(s))
    }
}
impl SplitType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SplitType::Line => "Line",
            SplitType::None => "None",
            SplitType::Recordio => "RecordIO",
            SplitType::Tfrecord => "TFRecord",
            SplitType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Line", "None", "RecordIO", "TFRecord"]
    }
}
impl AsRef<str> for SplitType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `CompressionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let compressiontype = unimplemented!();
/// match compressiontype {
///     CompressionType::Gzip => { /* ... */ },
///     CompressionType::None => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `compressiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CompressionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CompressionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CompressionType::NewFeature` is defined.
/// Specifically, when `compressiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CompressionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CompressionType {
    #[allow(missing_docs)] // documentation missing in model
    Gzip,
    #[allow(missing_docs)] // documentation missing in model
    None,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CompressionType {
    fn from(s: &str) -> Self {
        match s {
            "Gzip" => CompressionType::Gzip,
            "None" => CompressionType::None,
            other => CompressionType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for CompressionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CompressionType::from(s))
    }
}
impl CompressionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CompressionType::Gzip => "Gzip",
            CompressionType::None => "None",
            CompressionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Gzip", "None"]
    }
}
impl AsRef<str> for CompressionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the location of the channel data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformDataSource {
    /// <p>The S3 location of the data source that is associated with a channel.</p>
    #[doc(hidden)]
    pub s3_data_source: std::option::Option<crate::model::TransformS3DataSource>,
}
impl TransformDataSource {
    /// <p>The S3 location of the data source that is associated with a channel.</p>
    pub fn s3_data_source(&self) -> std::option::Option<&crate::model::TransformS3DataSource> {
        self.s3_data_source.as_ref()
    }
}
/// See [`TransformDataSource`](crate::model::TransformDataSource).
pub mod transform_data_source {

    /// A builder for [`TransformDataSource`](crate::model::TransformDataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_source: std::option::Option<crate::model::TransformS3DataSource>,
    }
    impl Builder {
        /// <p>The S3 location of the data source that is associated with a channel.</p>
        pub fn s3_data_source(mut self, input: crate::model::TransformS3DataSource) -> Self {
            self.s3_data_source = Some(input);
            self
        }
        /// <p>The S3 location of the data source that is associated with a channel.</p>
        pub fn set_s3_data_source(
            mut self,
            input: std::option::Option<crate::model::TransformS3DataSource>,
        ) -> Self {
            self.s3_data_source = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformDataSource`](crate::model::TransformDataSource).
        pub fn build(self) -> crate::model::TransformDataSource {
            crate::model::TransformDataSource {
                s3_data_source: self.s3_data_source,
            }
        }
    }
}
impl TransformDataSource {
    /// Creates a new builder-style object to manufacture [`TransformDataSource`](crate::model::TransformDataSource).
    pub fn builder() -> crate::model::transform_data_source::Builder {
        crate::model::transform_data_source::Builder::default()
    }
}

/// <p>Describes the S3 data source.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformS3DataSource {
    /// <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>
    #[doc(hidden)]
    pub s3_data_type: std::option::Option<crate::model::S3DataType>,
    /// <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>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl TransformS3DataSource {
    /// <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>
    pub fn s3_data_type(&self) -> std::option::Option<&crate::model::S3DataType> {
        self.s3_data_type.as_ref()
    }
    /// <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>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`TransformS3DataSource`](crate::model::TransformS3DataSource).
pub mod transform_s3_data_source {

    /// A builder for [`TransformS3DataSource`](crate::model::TransformS3DataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_type: std::option::Option<crate::model::S3DataType>,
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <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>
        pub fn s3_data_type(mut self, input: crate::model::S3DataType) -> Self {
            self.s3_data_type = Some(input);
            self
        }
        /// <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>
        pub fn set_s3_data_type(
            mut self,
            input: std::option::Option<crate::model::S3DataType>,
        ) -> Self {
            self.s3_data_type = input;
            self
        }
        /// <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>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <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>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformS3DataSource`](crate::model::TransformS3DataSource).
        pub fn build(self) -> crate::model::TransformS3DataSource {
            crate::model::TransformS3DataSource {
                s3_data_type: self.s3_data_type,
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl TransformS3DataSource {
    /// Creates a new builder-style object to manufacture [`TransformS3DataSource`](crate::model::TransformS3DataSource).
    pub fn builder() -> crate::model::transform_s3_data_source::Builder {
        crate::model::transform_s3_data_source::Builder::default()
    }
}

/// When writing a match expression against `S3DataType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let s3datatype = unimplemented!();
/// match s3datatype {
///     S3DataType::AugmentedManifestFile => { /* ... */ },
///     S3DataType::ManifestFile => { /* ... */ },
///     S3DataType::S3Prefix => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `s3datatype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `S3DataType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `S3DataType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `S3DataType::NewFeature` is defined.
/// Specifically, when `s3datatype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `S3DataType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum S3DataType {
    #[allow(missing_docs)] // documentation missing in model
    AugmentedManifestFile,
    #[allow(missing_docs)] // documentation missing in model
    ManifestFile,
    #[allow(missing_docs)] // documentation missing in model
    S3Prefix,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for S3DataType {
    fn from(s: &str) -> Self {
        match s {
            "AugmentedManifestFile" => S3DataType::AugmentedManifestFile,
            "ManifestFile" => S3DataType::ManifestFile,
            "S3Prefix" => S3DataType::S3Prefix,
            other => S3DataType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for S3DataType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(S3DataType::from(s))
    }
}
impl S3DataType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            S3DataType::AugmentedManifestFile => "AugmentedManifestFile",
            S3DataType::ManifestFile => "ManifestFile",
            S3DataType::S3Prefix => "S3Prefix",
            S3DataType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["AugmentedManifestFile", "ManifestFile", "S3Prefix"]
    }
}
impl AsRef<str> for S3DataType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `BatchStrategy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let batchstrategy = unimplemented!();
/// match batchstrategy {
///     BatchStrategy::MultiRecord => { /* ... */ },
///     BatchStrategy::SingleRecord => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `batchstrategy` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `BatchStrategy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `BatchStrategy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `BatchStrategy::NewFeature` is defined.
/// Specifically, when `batchstrategy` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `BatchStrategy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum BatchStrategy {
    #[allow(missing_docs)] // documentation missing in model
    MultiRecord,
    #[allow(missing_docs)] // documentation missing in model
    SingleRecord,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for BatchStrategy {
    fn from(s: &str) -> Self {
        match s {
            "MultiRecord" => BatchStrategy::MultiRecord,
            "SingleRecord" => BatchStrategy::SingleRecord,
            other => BatchStrategy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for BatchStrategy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(BatchStrategy::from(s))
    }
}
impl BatchStrategy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            BatchStrategy::MultiRecord => "MultiRecord",
            BatchStrategy::SingleRecord => "SingleRecord",
            BatchStrategy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["MultiRecord", "SingleRecord"]
    }
}
impl AsRef<str> for BatchStrategy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configures the timeout and maximum number of retries for processing a transform job invocation.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelClientConfig {
    /// <p>The timeout value in seconds for an invocation request. The default value is 600.</p>
    #[doc(hidden)]
    pub invocations_timeout_in_seconds: std::option::Option<i32>,
    /// <p>The maximum number of retries when invocation requests are failing. The default value is 3.</p>
    #[doc(hidden)]
    pub invocations_max_retries: std::option::Option<i32>,
}
impl ModelClientConfig {
    /// <p>The timeout value in seconds for an invocation request. The default value is 600.</p>
    pub fn invocations_timeout_in_seconds(&self) -> std::option::Option<i32> {
        self.invocations_timeout_in_seconds
    }
    /// <p>The maximum number of retries when invocation requests are failing. The default value is 3.</p>
    pub fn invocations_max_retries(&self) -> std::option::Option<i32> {
        self.invocations_max_retries
    }
}
/// See [`ModelClientConfig`](crate::model::ModelClientConfig).
pub mod model_client_config {

    /// A builder for [`ModelClientConfig`](crate::model::ModelClientConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) invocations_timeout_in_seconds: std::option::Option<i32>,
        pub(crate) invocations_max_retries: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The timeout value in seconds for an invocation request. The default value is 600.</p>
        pub fn invocations_timeout_in_seconds(mut self, input: i32) -> Self {
            self.invocations_timeout_in_seconds = Some(input);
            self
        }
        /// <p>The timeout value in seconds for an invocation request. The default value is 600.</p>
        pub fn set_invocations_timeout_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.invocations_timeout_in_seconds = input;
            self
        }
        /// <p>The maximum number of retries when invocation requests are failing. The default value is 3.</p>
        pub fn invocations_max_retries(mut self, input: i32) -> Self {
            self.invocations_max_retries = Some(input);
            self
        }
        /// <p>The maximum number of retries when invocation requests are failing. The default value is 3.</p>
        pub fn set_invocations_max_retries(mut self, input: std::option::Option<i32>) -> Self {
            self.invocations_max_retries = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelClientConfig`](crate::model::ModelClientConfig).
        pub fn build(self) -> crate::model::ModelClientConfig {
            crate::model::ModelClientConfig {
                invocations_timeout_in_seconds: self.invocations_timeout_in_seconds,
                invocations_max_retries: self.invocations_max_retries,
            }
        }
    }
}
impl ModelClientConfig {
    /// Creates a new builder-style object to manufacture [`ModelClientConfig`](crate::model::ModelClientConfig).
    pub fn builder() -> crate::model::model_client_config::Builder {
        crate::model::model_client_config::Builder::default()
    }
}

/// When writing a match expression against `TransformJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let transformjobstatus = unimplemented!();
/// match transformjobstatus {
///     TransformJobStatus::Completed => { /* ... */ },
///     TransformJobStatus::Failed => { /* ... */ },
///     TransformJobStatus::InProgress => { /* ... */ },
///     TransformJobStatus::Stopped => { /* ... */ },
///     TransformJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `transformjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TransformJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TransformJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TransformJobStatus::NewFeature` is defined.
/// Specifically, when `transformjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TransformJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TransformJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TransformJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => TransformJobStatus::Completed,
            "Failed" => TransformJobStatus::Failed,
            "InProgress" => TransformJobStatus::InProgress,
            "Stopped" => TransformJobStatus::Stopped,
            "Stopping" => TransformJobStatus::Stopping,
            other => {
                TransformJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for TransformJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TransformJobStatus::from(s))
    }
}
impl TransformJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TransformJobStatus::Completed => "Completed",
            TransformJobStatus::Failed => "Failed",
            TransformJobStatus::InProgress => "InProgress",
            TransformJobStatus::Stopped => "Stopped",
            TransformJobStatus::Stopping => "Stopping",
            TransformJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for TransformJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>An endpoint that hosts a model displayed in the Amazon SageMaker Model Dashboard.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDashboardEndpoint {
    /// <p>The endpoint name.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that indicates when the endpoint was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last time the endpoint was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The endpoint status.</p>
    #[doc(hidden)]
    pub endpoint_status: std::option::Option<crate::model::EndpointStatus>,
}
impl ModelDashboardEndpoint {
    /// <p>The endpoint name.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
    pub fn endpoint_arn(&self) -> std::option::Option<&str> {
        self.endpoint_arn.as_deref()
    }
    /// <p>A timestamp that indicates when the endpoint was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last time the endpoint was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The endpoint status.</p>
    pub fn endpoint_status(&self) -> std::option::Option<&crate::model::EndpointStatus> {
        self.endpoint_status.as_ref()
    }
}
/// See [`ModelDashboardEndpoint`](crate::model::ModelDashboardEndpoint).
pub mod model_dashboard_endpoint {

    /// A builder for [`ModelDashboardEndpoint`](crate::model::ModelDashboardEndpoint).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) endpoint_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) endpoint_status: std::option::Option<crate::model::EndpointStatus>,
    }
    impl Builder {
        /// <p>The endpoint name.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The endpoint name.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
        pub fn endpoint_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
        pub fn set_endpoint_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.endpoint_arn = input;
            self
        }
        /// <p>A timestamp that indicates when the endpoint was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the endpoint was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last time the endpoint was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last time the endpoint was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The endpoint status.</p>
        pub fn endpoint_status(mut self, input: crate::model::EndpointStatus) -> Self {
            self.endpoint_status = Some(input);
            self
        }
        /// <p>The endpoint status.</p>
        pub fn set_endpoint_status(
            mut self,
            input: std::option::Option<crate::model::EndpointStatus>,
        ) -> Self {
            self.endpoint_status = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDashboardEndpoint`](crate::model::ModelDashboardEndpoint).
        pub fn build(self) -> crate::model::ModelDashboardEndpoint {
            crate::model::ModelDashboardEndpoint {
                endpoint_name: self.endpoint_name,
                endpoint_arn: self.endpoint_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                endpoint_status: self.endpoint_status,
            }
        }
    }
}
impl ModelDashboardEndpoint {
    /// Creates a new builder-style object to manufacture [`ModelDashboardEndpoint`](crate::model::ModelDashboardEndpoint).
    pub fn builder() -> crate::model::model_dashboard_endpoint::Builder {
        crate::model::model_dashboard_endpoint::Builder::default()
    }
}

/// When writing a match expression against `EndpointStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let endpointstatus = unimplemented!();
/// match endpointstatus {
///     EndpointStatus::Creating => { /* ... */ },
///     EndpointStatus::Deleting => { /* ... */ },
///     EndpointStatus::Failed => { /* ... */ },
///     EndpointStatus::InService => { /* ... */ },
///     EndpointStatus::OutOfService => { /* ... */ },
///     EndpointStatus::RollingBack => { /* ... */ },
///     EndpointStatus::SystemUpdating => { /* ... */ },
///     EndpointStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `endpointstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `EndpointStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `EndpointStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `EndpointStatus::NewFeature` is defined.
/// Specifically, when `endpointstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `EndpointStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum EndpointStatus {
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    OutOfService,
    #[allow(missing_docs)] // documentation missing in model
    RollingBack,
    #[allow(missing_docs)] // documentation missing in model
    SystemUpdating,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for EndpointStatus {
    fn from(s: &str) -> Self {
        match s {
            "Creating" => EndpointStatus::Creating,
            "Deleting" => EndpointStatus::Deleting,
            "Failed" => EndpointStatus::Failed,
            "InService" => EndpointStatus::InService,
            "OutOfService" => EndpointStatus::OutOfService,
            "RollingBack" => EndpointStatus::RollingBack,
            "SystemUpdating" => EndpointStatus::SystemUpdating,
            "Updating" => EndpointStatus::Updating,
            other => EndpointStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for EndpointStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(EndpointStatus::from(s))
    }
}
impl EndpointStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            EndpointStatus::Creating => "Creating",
            EndpointStatus::Deleting => "Deleting",
            EndpointStatus::Failed => "Failed",
            EndpointStatus::InService => "InService",
            EndpointStatus::OutOfService => "OutOfService",
            EndpointStatus::RollingBack => "RollingBack",
            EndpointStatus::SystemUpdating => "SystemUpdating",
            EndpointStatus::Updating => "Updating",
            EndpointStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Creating",
            "Deleting",
            "Failed",
            "InService",
            "OutOfService",
            "RollingBack",
            "SystemUpdating",
            "Updating",
        ]
    }
}
impl AsRef<str> for EndpointStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The properties of a model as returned by the <code>Search</code> API.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Model {
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>Describes the container, as part of model definition.</p>
    #[doc(hidden)]
    pub primary_container: std::option::Option<crate::model::ContainerDefinition>,
    /// <p>The containers in the inference pipeline.</p>
    #[doc(hidden)]
    pub containers: std::option::Option<std::vec::Vec<crate::model::ContainerDefinition>>,
    /// <p>Specifies details about how containers in a multi-container endpoint are run.</p>
    #[doc(hidden)]
    pub inference_execution_config: std::option::Option<crate::model::InferenceExecutionConfig>,
    /// <p>The Amazon Resource Name (ARN) of the IAM role that you specified for the model.</p>
    #[doc(hidden)]
    pub execution_role_arn: std::option::Option<std::string::String>,
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
    /// <p>A timestamp that indicates when the model was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The Amazon Resource Name (ARN) of the model.</p>
    #[doc(hidden)]
    pub model_arn: std::option::Option<std::string::String>,
    /// <p>Isolates the model container. No inbound or outbound network calls can be made to or from the model container.</p>
    #[doc(hidden)]
    pub enable_network_isolation: bool,
    /// <p>A list of key-value pairs associated with the model. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl Model {
    /// <p>The name of the model.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>Describes the container, as part of model definition.</p>
    pub fn primary_container(&self) -> std::option::Option<&crate::model::ContainerDefinition> {
        self.primary_container.as_ref()
    }
    /// <p>The containers in the inference pipeline.</p>
    pub fn containers(&self) -> std::option::Option<&[crate::model::ContainerDefinition]> {
        self.containers.as_deref()
    }
    /// <p>Specifies details about how containers in a multi-container endpoint are run.</p>
    pub fn inference_execution_config(
        &self,
    ) -> std::option::Option<&crate::model::InferenceExecutionConfig> {
        self.inference_execution_config.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the IAM role that you specified for the model.</p>
    pub fn execution_role_arn(&self) -> std::option::Option<&str> {
        self.execution_role_arn.as_deref()
    }
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
    /// <p>A timestamp that indicates when the model was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model.</p>
    pub fn model_arn(&self) -> std::option::Option<&str> {
        self.model_arn.as_deref()
    }
    /// <p>Isolates the model container. No inbound or outbound network calls can be made to or from the model container.</p>
    pub fn enable_network_isolation(&self) -> bool {
        self.enable_network_isolation
    }
    /// <p>A list of key-value pairs associated with the model. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`Model`](crate::model::Model).
pub mod model {

    /// A builder for [`Model`](crate::model::Model).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) primary_container: std::option::Option<crate::model::ContainerDefinition>,
        pub(crate) containers:
            std::option::Option<std::vec::Vec<crate::model::ContainerDefinition>>,
        pub(crate) inference_execution_config:
            std::option::Option<crate::model::InferenceExecutionConfig>,
        pub(crate) execution_role_arn: std::option::Option<std::string::String>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) model_arn: std::option::Option<std::string::String>,
        pub(crate) enable_network_isolation: std::option::Option<bool>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The name of the model.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>Describes the container, as part of model definition.</p>
        pub fn primary_container(mut self, input: crate::model::ContainerDefinition) -> Self {
            self.primary_container = Some(input);
            self
        }
        /// <p>Describes the container, as part of model definition.</p>
        pub fn set_primary_container(
            mut self,
            input: std::option::Option<crate::model::ContainerDefinition>,
        ) -> Self {
            self.primary_container = input;
            self
        }
        /// Appends an item to `containers`.
        ///
        /// To override the contents of this collection use [`set_containers`](Self::set_containers).
        ///
        /// <p>The containers in the inference pipeline.</p>
        pub fn containers(mut self, input: crate::model::ContainerDefinition) -> Self {
            let mut v = self.containers.unwrap_or_default();
            v.push(input);
            self.containers = Some(v);
            self
        }
        /// <p>The containers in the inference pipeline.</p>
        pub fn set_containers(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ContainerDefinition>>,
        ) -> Self {
            self.containers = input;
            self
        }
        /// <p>Specifies details about how containers in a multi-container endpoint are run.</p>
        pub fn inference_execution_config(
            mut self,
            input: crate::model::InferenceExecutionConfig,
        ) -> Self {
            self.inference_execution_config = Some(input);
            self
        }
        /// <p>Specifies details about how containers in a multi-container endpoint are run.</p>
        pub fn set_inference_execution_config(
            mut self,
            input: std::option::Option<crate::model::InferenceExecutionConfig>,
        ) -> Self {
            self.inference_execution_config = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the IAM role that you specified for the model.</p>
        pub fn execution_role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.execution_role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the IAM role that you specified for the model.</p>
        pub fn set_execution_role_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.execution_role_arn = input;
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// <p>A timestamp that indicates when the model was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the model was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model.</p>
        pub fn model_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model.</p>
        pub fn set_model_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_arn = input;
            self
        }
        /// <p>Isolates the model container. No inbound or outbound network calls can be made to or from the model container.</p>
        pub fn enable_network_isolation(mut self, input: bool) -> Self {
            self.enable_network_isolation = Some(input);
            self
        }
        /// <p>Isolates the model container. No inbound or outbound network calls can be made to or from the model container.</p>
        pub fn set_enable_network_isolation(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_network_isolation = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of key-value pairs associated with the model. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of key-value pairs associated with the model. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`Model`](crate::model::Model).
        pub fn build(self) -> crate::model::Model {
            crate::model::Model {
                model_name: self.model_name,
                primary_container: self.primary_container,
                containers: self.containers,
                inference_execution_config: self.inference_execution_config,
                execution_role_arn: self.execution_role_arn,
                vpc_config: self.vpc_config,
                creation_time: self.creation_time,
                model_arn: self.model_arn,
                enable_network_isolation: self.enable_network_isolation.unwrap_or_default(),
                tags: self.tags,
            }
        }
    }
}
impl Model {
    /// Creates a new builder-style object to manufacture [`Model`](crate::model::Model).
    pub fn builder() -> crate::model::model::Builder {
        crate::model::model::Builder::default()
    }
}

/// <p>Specifies details about how containers in a multi-container endpoint are run.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceExecutionConfig {
    /// <p>How containers in a multi-container are run. The following values are valid.</p>
    /// <ul>
    /// <li> <p> <code>SERIAL</code> - Containers run as a serial pipeline.</p> </li>
    /// <li> <p> <code>DIRECT</code> - Only the individual container that you specify is run.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub mode: std::option::Option<crate::model::InferenceExecutionMode>,
}
impl InferenceExecutionConfig {
    /// <p>How containers in a multi-container are run. The following values are valid.</p>
    /// <ul>
    /// <li> <p> <code>SERIAL</code> - Containers run as a serial pipeline.</p> </li>
    /// <li> <p> <code>DIRECT</code> - Only the individual container that you specify is run.</p> </li>
    /// </ul>
    pub fn mode(&self) -> std::option::Option<&crate::model::InferenceExecutionMode> {
        self.mode.as_ref()
    }
}
/// See [`InferenceExecutionConfig`](crate::model::InferenceExecutionConfig).
pub mod inference_execution_config {

    /// A builder for [`InferenceExecutionConfig`](crate::model::InferenceExecutionConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) mode: std::option::Option<crate::model::InferenceExecutionMode>,
    }
    impl Builder {
        /// <p>How containers in a multi-container are run. The following values are valid.</p>
        /// <ul>
        /// <li> <p> <code>SERIAL</code> - Containers run as a serial pipeline.</p> </li>
        /// <li> <p> <code>DIRECT</code> - Only the individual container that you specify is run.</p> </li>
        /// </ul>
        pub fn mode(mut self, input: crate::model::InferenceExecutionMode) -> Self {
            self.mode = Some(input);
            self
        }
        /// <p>How containers in a multi-container are run. The following values are valid.</p>
        /// <ul>
        /// <li> <p> <code>SERIAL</code> - Containers run as a serial pipeline.</p> </li>
        /// <li> <p> <code>DIRECT</code> - Only the individual container that you specify is run.</p> </li>
        /// </ul>
        pub fn set_mode(
            mut self,
            input: std::option::Option<crate::model::InferenceExecutionMode>,
        ) -> Self {
            self.mode = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceExecutionConfig`](crate::model::InferenceExecutionConfig).
        pub fn build(self) -> crate::model::InferenceExecutionConfig {
            crate::model::InferenceExecutionConfig { mode: self.mode }
        }
    }
}
impl InferenceExecutionConfig {
    /// Creates a new builder-style object to manufacture [`InferenceExecutionConfig`](crate::model::InferenceExecutionConfig).
    pub fn builder() -> crate::model::inference_execution_config::Builder {
        crate::model::inference_execution_config::Builder::default()
    }
}

/// When writing a match expression against `InferenceExecutionMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let inferenceexecutionmode = unimplemented!();
/// match inferenceexecutionmode {
///     InferenceExecutionMode::Direct => { /* ... */ },
///     InferenceExecutionMode::Serial => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `inferenceexecutionmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `InferenceExecutionMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `InferenceExecutionMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `InferenceExecutionMode::NewFeature` is defined.
/// Specifically, when `inferenceexecutionmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `InferenceExecutionMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum InferenceExecutionMode {
    #[allow(missing_docs)] // documentation missing in model
    Direct,
    #[allow(missing_docs)] // documentation missing in model
    Serial,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for InferenceExecutionMode {
    fn from(s: &str) -> Self {
        match s {
            "Direct" => InferenceExecutionMode::Direct,
            "Serial" => InferenceExecutionMode::Serial,
            other => {
                InferenceExecutionMode::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for InferenceExecutionMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(InferenceExecutionMode::from(s))
    }
}
impl InferenceExecutionMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            InferenceExecutionMode::Direct => "Direct",
            InferenceExecutionMode::Serial => "Serial",
            InferenceExecutionMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Direct", "Serial"]
    }
}
impl AsRef<str> for InferenceExecutionMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the container, as part of model definition.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ContainerDefinition {
    /// <p>This parameter is ignored for models that contain only a <code>PrimaryContainer</code>.</p>
    /// <p>When a <code>ContainerDefinition</code> is part of an inference pipeline, the value of the parameter uniquely identifies the container for the purposes of logging and metrics. For information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/inference-pipeline-logs-metrics.html">Use Logs and Metrics to Monitor an Inference Pipeline</a>. If you don't specify a value for this parameter for a <code>ContainerDefinition</code> that is part of an inference pipeline, a unique name is automatically assigned based on the position of the <code>ContainerDefinition</code> in the pipeline. If you specify a value for the <code>ContainerHostName</code> for any <code>ContainerDefinition</code> that is part of an inference pipeline, you must specify a value for the <code>ContainerHostName</code> parameter of every <code>ContainerDefinition</code> in that pipeline.</p>
    #[doc(hidden)]
    pub container_hostname: std::option::Option<std::string::String>,
    /// <p>The path where inference code is stored. This can be either in Amazon EC2 Container Registry or in a Docker registry that is accessible from the same VPC that you configure for your endpoint. If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a> </p>
    #[doc(hidden)]
    pub image: std::option::Option<std::string::String>,
    /// <p>Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC). For information about storing containers in a private Docker registry, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-containers-inference-private.html">Use a Private Docker Registry for Real-Time Inference Containers</a> </p>
    #[doc(hidden)]
    pub image_config: std::option::Option<crate::model::ImageConfig>,
    /// <p>Whether the container hosts a single model or multiple models.</p>
    #[doc(hidden)]
    pub mode: std::option::Option<crate::model::ContainerMode>,
    /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix). The S3 path is required for SageMaker built-in algorithms, but not if you use your own algorithms. For more information on built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Common Parameters</a>. </p> <note>
    /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model or endpoint you are creating.</p>
    /// </note>
    /// <p>If you provide a value for this parameter, SageMaker uses Amazon Web Services Security Token Service to download model artifacts from the S3 path you provide. Amazon Web Services STS is activated in your IAM user account by default. If you previously deactivated Amazon Web Services STS for a region, you need to reactivate Amazon Web Services STS for that region. For more information, see <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html">Activating and Deactivating Amazon Web Services STS in an Amazon Web Services Region</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p> <important>
    /// <p>If you use a built-in algorithm to create a model, SageMaker requires that you provide a S3 path to the model artifacts in <code>ModelDataUrl</code>.</p>
    /// </important>
    #[doc(hidden)]
    pub model_data_url: std::option::Option<std::string::String>,
    /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map. </p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>The name or Amazon Resource Name (ARN) of the model package to use to create the model.</p>
    #[doc(hidden)]
    pub model_package_name: std::option::Option<std::string::String>,
    /// <p>The inference specification name in the model package version.</p>
    #[doc(hidden)]
    pub inference_specification_name: std::option::Option<std::string::String>,
    /// <p>Specifies additional configuration for multi-model endpoints.</p>
    #[doc(hidden)]
    pub multi_model_config: std::option::Option<crate::model::MultiModelConfig>,
}
impl ContainerDefinition {
    /// <p>This parameter is ignored for models that contain only a <code>PrimaryContainer</code>.</p>
    /// <p>When a <code>ContainerDefinition</code> is part of an inference pipeline, the value of the parameter uniquely identifies the container for the purposes of logging and metrics. For information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/inference-pipeline-logs-metrics.html">Use Logs and Metrics to Monitor an Inference Pipeline</a>. If you don't specify a value for this parameter for a <code>ContainerDefinition</code> that is part of an inference pipeline, a unique name is automatically assigned based on the position of the <code>ContainerDefinition</code> in the pipeline. If you specify a value for the <code>ContainerHostName</code> for any <code>ContainerDefinition</code> that is part of an inference pipeline, you must specify a value for the <code>ContainerHostName</code> parameter of every <code>ContainerDefinition</code> in that pipeline.</p>
    pub fn container_hostname(&self) -> std::option::Option<&str> {
        self.container_hostname.as_deref()
    }
    /// <p>The path where inference code is stored. This can be either in Amazon EC2 Container Registry or in a Docker registry that is accessible from the same VPC that you configure for your endpoint. If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a> </p>
    pub fn image(&self) -> std::option::Option<&str> {
        self.image.as_deref()
    }
    /// <p>Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC). For information about storing containers in a private Docker registry, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-containers-inference-private.html">Use a Private Docker Registry for Real-Time Inference Containers</a> </p>
    pub fn image_config(&self) -> std::option::Option<&crate::model::ImageConfig> {
        self.image_config.as_ref()
    }
    /// <p>Whether the container hosts a single model or multiple models.</p>
    pub fn mode(&self) -> std::option::Option<&crate::model::ContainerMode> {
        self.mode.as_ref()
    }
    /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix). The S3 path is required for SageMaker built-in algorithms, but not if you use your own algorithms. For more information on built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Common Parameters</a>. </p> <note>
    /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model or endpoint you are creating.</p>
    /// </note>
    /// <p>If you provide a value for this parameter, SageMaker uses Amazon Web Services Security Token Service to download model artifacts from the S3 path you provide. Amazon Web Services STS is activated in your IAM user account by default. If you previously deactivated Amazon Web Services STS for a region, you need to reactivate Amazon Web Services STS for that region. For more information, see <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html">Activating and Deactivating Amazon Web Services STS in an Amazon Web Services Region</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p> <important>
    /// <p>If you use a built-in algorithm to create a model, SageMaker requires that you provide a S3 path to the model artifacts in <code>ModelDataUrl</code>.</p>
    /// </important>
    pub fn model_data_url(&self) -> std::option::Option<&str> {
        self.model_data_url.as_deref()
    }
    /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map. </p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>The name or Amazon Resource Name (ARN) of the model package to use to create the model.</p>
    pub fn model_package_name(&self) -> std::option::Option<&str> {
        self.model_package_name.as_deref()
    }
    /// <p>The inference specification name in the model package version.</p>
    pub fn inference_specification_name(&self) -> std::option::Option<&str> {
        self.inference_specification_name.as_deref()
    }
    /// <p>Specifies additional configuration for multi-model endpoints.</p>
    pub fn multi_model_config(&self) -> std::option::Option<&crate::model::MultiModelConfig> {
        self.multi_model_config.as_ref()
    }
}
/// See [`ContainerDefinition`](crate::model::ContainerDefinition).
pub mod container_definition {

    /// A builder for [`ContainerDefinition`](crate::model::ContainerDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) container_hostname: std::option::Option<std::string::String>,
        pub(crate) image: std::option::Option<std::string::String>,
        pub(crate) image_config: std::option::Option<crate::model::ImageConfig>,
        pub(crate) mode: std::option::Option<crate::model::ContainerMode>,
        pub(crate) model_data_url: std::option::Option<std::string::String>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) model_package_name: std::option::Option<std::string::String>,
        pub(crate) inference_specification_name: std::option::Option<std::string::String>,
        pub(crate) multi_model_config: std::option::Option<crate::model::MultiModelConfig>,
    }
    impl Builder {
        /// <p>This parameter is ignored for models that contain only a <code>PrimaryContainer</code>.</p>
        /// <p>When a <code>ContainerDefinition</code> is part of an inference pipeline, the value of the parameter uniquely identifies the container for the purposes of logging and metrics. For information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/inference-pipeline-logs-metrics.html">Use Logs and Metrics to Monitor an Inference Pipeline</a>. If you don't specify a value for this parameter for a <code>ContainerDefinition</code> that is part of an inference pipeline, a unique name is automatically assigned based on the position of the <code>ContainerDefinition</code> in the pipeline. If you specify a value for the <code>ContainerHostName</code> for any <code>ContainerDefinition</code> that is part of an inference pipeline, you must specify a value for the <code>ContainerHostName</code> parameter of every <code>ContainerDefinition</code> in that pipeline.</p>
        pub fn container_hostname(mut self, input: impl Into<std::string::String>) -> Self {
            self.container_hostname = Some(input.into());
            self
        }
        /// <p>This parameter is ignored for models that contain only a <code>PrimaryContainer</code>.</p>
        /// <p>When a <code>ContainerDefinition</code> is part of an inference pipeline, the value of the parameter uniquely identifies the container for the purposes of logging and metrics. For information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/inference-pipeline-logs-metrics.html">Use Logs and Metrics to Monitor an Inference Pipeline</a>. If you don't specify a value for this parameter for a <code>ContainerDefinition</code> that is part of an inference pipeline, a unique name is automatically assigned based on the position of the <code>ContainerDefinition</code> in the pipeline. If you specify a value for the <code>ContainerHostName</code> for any <code>ContainerDefinition</code> that is part of an inference pipeline, you must specify a value for the <code>ContainerHostName</code> parameter of every <code>ContainerDefinition</code> in that pipeline.</p>
        pub fn set_container_hostname(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.container_hostname = input;
            self
        }
        /// <p>The path where inference code is stored. This can be either in Amazon EC2 Container Registry or in a Docker registry that is accessible from the same VPC that you configure for your endpoint. If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a> </p>
        pub fn image(mut self, input: impl Into<std::string::String>) -> Self {
            self.image = Some(input.into());
            self
        }
        /// <p>The path where inference code is stored. This can be either in Amazon EC2 Container Registry or in a Docker registry that is accessible from the same VPC that you configure for your endpoint. If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a> </p>
        pub fn set_image(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image = input;
            self
        }
        /// <p>Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC). For information about storing containers in a private Docker registry, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-containers-inference-private.html">Use a Private Docker Registry for Real-Time Inference Containers</a> </p>
        pub fn image_config(mut self, input: crate::model::ImageConfig) -> Self {
            self.image_config = Some(input);
            self
        }
        /// <p>Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC). For information about storing containers in a private Docker registry, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-containers-inference-private.html">Use a Private Docker Registry for Real-Time Inference Containers</a> </p>
        pub fn set_image_config(
            mut self,
            input: std::option::Option<crate::model::ImageConfig>,
        ) -> Self {
            self.image_config = input;
            self
        }
        /// <p>Whether the container hosts a single model or multiple models.</p>
        pub fn mode(mut self, input: crate::model::ContainerMode) -> Self {
            self.mode = Some(input);
            self
        }
        /// <p>Whether the container hosts a single model or multiple models.</p>
        pub fn set_mode(mut self, input: std::option::Option<crate::model::ContainerMode>) -> Self {
            self.mode = input;
            self
        }
        /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix). The S3 path is required for SageMaker built-in algorithms, but not if you use your own algorithms. For more information on built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Common Parameters</a>. </p> <note>
        /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model or endpoint you are creating.</p>
        /// </note>
        /// <p>If you provide a value for this parameter, SageMaker uses Amazon Web Services Security Token Service to download model artifacts from the S3 path you provide. Amazon Web Services STS is activated in your IAM user account by default. If you previously deactivated Amazon Web Services STS for a region, you need to reactivate Amazon Web Services STS for that region. For more information, see <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html">Activating and Deactivating Amazon Web Services STS in an Amazon Web Services Region</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p> <important>
        /// <p>If you use a built-in algorithm to create a model, SageMaker requires that you provide a S3 path to the model artifacts in <code>ModelDataUrl</code>.</p>
        /// </important>
        pub fn model_data_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_data_url = Some(input.into());
            self
        }
        /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix). The S3 path is required for SageMaker built-in algorithms, but not if you use your own algorithms. For more information on built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Common Parameters</a>. </p> <note>
        /// <p>The model artifacts must be in an S3 bucket that is in the same region as the model or endpoint you are creating.</p>
        /// </note>
        /// <p>If you provide a value for this parameter, SageMaker uses Amazon Web Services Security Token Service to download model artifacts from the S3 path you provide. Amazon Web Services STS is activated in your IAM user account by default. If you previously deactivated Amazon Web Services STS for a region, you need to reactivate Amazon Web Services STS for that region. For more information, see <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html">Activating and Deactivating Amazon Web Services STS in an Amazon Web Services Region</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p> <important>
        /// <p>If you use a built-in algorithm to create a model, SageMaker requires that you provide a S3 path to the model artifacts in <code>ModelDataUrl</code>.</p>
        /// </important>
        pub fn set_model_data_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_data_url = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map. </p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>The environment variables to set in the Docker container. Each key and value in the <code>Environment</code> string to string map can have length of up to 1024. We support up to 16 entries in the map. </p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>The name or Amazon Resource Name (ARN) of the model package to use to create the model.</p>
        pub fn model_package_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_name = Some(input.into());
            self
        }
        /// <p>The name or Amazon Resource Name (ARN) of the model package to use to create the model.</p>
        pub fn set_model_package_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_name = input;
            self
        }
        /// <p>The inference specification name in the model package version.</p>
        pub fn inference_specification_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.inference_specification_name = Some(input.into());
            self
        }
        /// <p>The inference specification name in the model package version.</p>
        pub fn set_inference_specification_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.inference_specification_name = input;
            self
        }
        /// <p>Specifies additional configuration for multi-model endpoints.</p>
        pub fn multi_model_config(mut self, input: crate::model::MultiModelConfig) -> Self {
            self.multi_model_config = Some(input);
            self
        }
        /// <p>Specifies additional configuration for multi-model endpoints.</p>
        pub fn set_multi_model_config(
            mut self,
            input: std::option::Option<crate::model::MultiModelConfig>,
        ) -> Self {
            self.multi_model_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ContainerDefinition`](crate::model::ContainerDefinition).
        pub fn build(self) -> crate::model::ContainerDefinition {
            crate::model::ContainerDefinition {
                container_hostname: self.container_hostname,
                image: self.image,
                image_config: self.image_config,
                mode: self.mode,
                model_data_url: self.model_data_url,
                environment: self.environment,
                model_package_name: self.model_package_name,
                inference_specification_name: self.inference_specification_name,
                multi_model_config: self.multi_model_config,
            }
        }
    }
}
impl ContainerDefinition {
    /// Creates a new builder-style object to manufacture [`ContainerDefinition`](crate::model::ContainerDefinition).
    pub fn builder() -> crate::model::container_definition::Builder {
        crate::model::container_definition::Builder::default()
    }
}

/// <p>Specifies additional configuration for hosting multi-model endpoints.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MultiModelConfig {
    /// <p>Whether to cache models for a multi-model endpoint. By default, multi-model endpoints cache models so that a model does not have to be loaded into memory each time it is invoked. Some use cases do not benefit from model caching. For example, if an endpoint hosts a large number of models that are each invoked infrequently, the endpoint might perform better if you disable model caching. To disable model caching, set the value of this parameter to <code>Disabled</code>.</p>
    #[doc(hidden)]
    pub model_cache_setting: std::option::Option<crate::model::ModelCacheSetting>,
}
impl MultiModelConfig {
    /// <p>Whether to cache models for a multi-model endpoint. By default, multi-model endpoints cache models so that a model does not have to be loaded into memory each time it is invoked. Some use cases do not benefit from model caching. For example, if an endpoint hosts a large number of models that are each invoked infrequently, the endpoint might perform better if you disable model caching. To disable model caching, set the value of this parameter to <code>Disabled</code>.</p>
    pub fn model_cache_setting(&self) -> std::option::Option<&crate::model::ModelCacheSetting> {
        self.model_cache_setting.as_ref()
    }
}
/// See [`MultiModelConfig`](crate::model::MultiModelConfig).
pub mod multi_model_config {

    /// A builder for [`MultiModelConfig`](crate::model::MultiModelConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_cache_setting: std::option::Option<crate::model::ModelCacheSetting>,
    }
    impl Builder {
        /// <p>Whether to cache models for a multi-model endpoint. By default, multi-model endpoints cache models so that a model does not have to be loaded into memory each time it is invoked. Some use cases do not benefit from model caching. For example, if an endpoint hosts a large number of models that are each invoked infrequently, the endpoint might perform better if you disable model caching. To disable model caching, set the value of this parameter to <code>Disabled</code>.</p>
        pub fn model_cache_setting(mut self, input: crate::model::ModelCacheSetting) -> Self {
            self.model_cache_setting = Some(input);
            self
        }
        /// <p>Whether to cache models for a multi-model endpoint. By default, multi-model endpoints cache models so that a model does not have to be loaded into memory each time it is invoked. Some use cases do not benefit from model caching. For example, if an endpoint hosts a large number of models that are each invoked infrequently, the endpoint might perform better if you disable model caching. To disable model caching, set the value of this parameter to <code>Disabled</code>.</p>
        pub fn set_model_cache_setting(
            mut self,
            input: std::option::Option<crate::model::ModelCacheSetting>,
        ) -> Self {
            self.model_cache_setting = input;
            self
        }
        /// Consumes the builder and constructs a [`MultiModelConfig`](crate::model::MultiModelConfig).
        pub fn build(self) -> crate::model::MultiModelConfig {
            crate::model::MultiModelConfig {
                model_cache_setting: self.model_cache_setting,
            }
        }
    }
}
impl MultiModelConfig {
    /// Creates a new builder-style object to manufacture [`MultiModelConfig`](crate::model::MultiModelConfig).
    pub fn builder() -> crate::model::multi_model_config::Builder {
        crate::model::multi_model_config::Builder::default()
    }
}

/// When writing a match expression against `ModelCacheSetting`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcachesetting = unimplemented!();
/// match modelcachesetting {
///     ModelCacheSetting::Disabled => { /* ... */ },
///     ModelCacheSetting::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcachesetting` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCacheSetting::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCacheSetting::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCacheSetting::NewFeature` is defined.
/// Specifically, when `modelcachesetting` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCacheSetting::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCacheSetting {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCacheSetting {
    fn from(s: &str) -> Self {
        match s {
            "Disabled" => ModelCacheSetting::Disabled,
            "Enabled" => ModelCacheSetting::Enabled,
            other => {
                ModelCacheSetting::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelCacheSetting {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCacheSetting::from(s))
    }
}
impl ModelCacheSetting {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCacheSetting::Disabled => "Disabled",
            ModelCacheSetting::Enabled => "Enabled",
            ModelCacheSetting::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Disabled", "Enabled"]
    }
}
impl AsRef<str> for ModelCacheSetting {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ContainerMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let containermode = unimplemented!();
/// match containermode {
///     ContainerMode::MultiModel => { /* ... */ },
///     ContainerMode::SingleModel => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `containermode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ContainerMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ContainerMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ContainerMode::NewFeature` is defined.
/// Specifically, when `containermode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ContainerMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ContainerMode {
    #[allow(missing_docs)] // documentation missing in model
    MultiModel,
    #[allow(missing_docs)] // documentation missing in model
    SingleModel,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ContainerMode {
    fn from(s: &str) -> Self {
        match s {
            "MultiModel" => ContainerMode::MultiModel,
            "SingleModel" => ContainerMode::SingleModel,
            other => ContainerMode::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ContainerMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ContainerMode::from(s))
    }
}
impl ContainerMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ContainerMode::MultiModel => "MultiModel",
            ContainerMode::SingleModel => "SingleModel",
            ContainerMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["MultiModel", "SingleModel"]
    }
}
impl AsRef<str> for ContainerMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ImageConfig {
    /// <p>Set this to one of the following values:</p>
    /// <ul>
    /// <li> <p> <code>Platform</code> - The model image is hosted in Amazon ECR.</p> </li>
    /// <li> <p> <code>Vpc</code> - The model image is hosted in a private Docker registry in your VPC.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub repository_access_mode: std::option::Option<crate::model::RepositoryAccessMode>,
    /// <p>(Optional) Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified <code>Vpc</code> as the value for the <code>RepositoryAccessMode</code> field, and the private Docker registry where the model image is hosted requires authentication.</p>
    #[doc(hidden)]
    pub repository_auth_config: std::option::Option<crate::model::RepositoryAuthConfig>,
}
impl ImageConfig {
    /// <p>Set this to one of the following values:</p>
    /// <ul>
    /// <li> <p> <code>Platform</code> - The model image is hosted in Amazon ECR.</p> </li>
    /// <li> <p> <code>Vpc</code> - The model image is hosted in a private Docker registry in your VPC.</p> </li>
    /// </ul>
    pub fn repository_access_mode(
        &self,
    ) -> std::option::Option<&crate::model::RepositoryAccessMode> {
        self.repository_access_mode.as_ref()
    }
    /// <p>(Optional) Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified <code>Vpc</code> as the value for the <code>RepositoryAccessMode</code> field, and the private Docker registry where the model image is hosted requires authentication.</p>
    pub fn repository_auth_config(
        &self,
    ) -> std::option::Option<&crate::model::RepositoryAuthConfig> {
        self.repository_auth_config.as_ref()
    }
}
/// See [`ImageConfig`](crate::model::ImageConfig).
pub mod image_config {

    /// A builder for [`ImageConfig`](crate::model::ImageConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) repository_access_mode: std::option::Option<crate::model::RepositoryAccessMode>,
        pub(crate) repository_auth_config: std::option::Option<crate::model::RepositoryAuthConfig>,
    }
    impl Builder {
        /// <p>Set this to one of the following values:</p>
        /// <ul>
        /// <li> <p> <code>Platform</code> - The model image is hosted in Amazon ECR.</p> </li>
        /// <li> <p> <code>Vpc</code> - The model image is hosted in a private Docker registry in your VPC.</p> </li>
        /// </ul>
        pub fn repository_access_mode(mut self, input: crate::model::RepositoryAccessMode) -> Self {
            self.repository_access_mode = Some(input);
            self
        }
        /// <p>Set this to one of the following values:</p>
        /// <ul>
        /// <li> <p> <code>Platform</code> - The model image is hosted in Amazon ECR.</p> </li>
        /// <li> <p> <code>Vpc</code> - The model image is hosted in a private Docker registry in your VPC.</p> </li>
        /// </ul>
        pub fn set_repository_access_mode(
            mut self,
            input: std::option::Option<crate::model::RepositoryAccessMode>,
        ) -> Self {
            self.repository_access_mode = input;
            self
        }
        /// <p>(Optional) Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified <code>Vpc</code> as the value for the <code>RepositoryAccessMode</code> field, and the private Docker registry where the model image is hosted requires authentication.</p>
        pub fn repository_auth_config(mut self, input: crate::model::RepositoryAuthConfig) -> Self {
            self.repository_auth_config = Some(input);
            self
        }
        /// <p>(Optional) Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified <code>Vpc</code> as the value for the <code>RepositoryAccessMode</code> field, and the private Docker registry where the model image is hosted requires authentication.</p>
        pub fn set_repository_auth_config(
            mut self,
            input: std::option::Option<crate::model::RepositoryAuthConfig>,
        ) -> Self {
            self.repository_auth_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ImageConfig`](crate::model::ImageConfig).
        pub fn build(self) -> crate::model::ImageConfig {
            crate::model::ImageConfig {
                repository_access_mode: self.repository_access_mode,
                repository_auth_config: self.repository_auth_config,
            }
        }
    }
}
impl ImageConfig {
    /// Creates a new builder-style object to manufacture [`ImageConfig`](crate::model::ImageConfig).
    pub fn builder() -> crate::model::image_config::Builder {
        crate::model::image_config::Builder::default()
    }
}

/// <p>Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified <code>Vpc</code> as the value for the <code>RepositoryAccessMode</code> field of the <code>ImageConfig</code> object that you passed to a call to <code>CreateModel</code> and the private Docker registry where the model image is hosted requires authentication.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RepositoryAuthConfig {
    /// <p>The Amazon Resource Name (ARN) of an Amazon Web Services Lambda function that provides credentials to authenticate to the private Docker registry where your model image is hosted. For information about how to create an Amazon Web Services Lambda function, see <a href="https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html">Create a Lambda function with the console</a> in the <i>Amazon Web Services Lambda Developer Guide</i>.</p>
    #[doc(hidden)]
    pub repository_credentials_provider_arn: std::option::Option<std::string::String>,
}
impl RepositoryAuthConfig {
    /// <p>The Amazon Resource Name (ARN) of an Amazon Web Services Lambda function that provides credentials to authenticate to the private Docker registry where your model image is hosted. For information about how to create an Amazon Web Services Lambda function, see <a href="https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html">Create a Lambda function with the console</a> in the <i>Amazon Web Services Lambda Developer Guide</i>.</p>
    pub fn repository_credentials_provider_arn(&self) -> std::option::Option<&str> {
        self.repository_credentials_provider_arn.as_deref()
    }
}
/// See [`RepositoryAuthConfig`](crate::model::RepositoryAuthConfig).
pub mod repository_auth_config {

    /// A builder for [`RepositoryAuthConfig`](crate::model::RepositoryAuthConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) repository_credentials_provider_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of an Amazon Web Services Lambda function that provides credentials to authenticate to the private Docker registry where your model image is hosted. For information about how to create an Amazon Web Services Lambda function, see <a href="https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html">Create a Lambda function with the console</a> in the <i>Amazon Web Services Lambda Developer Guide</i>.</p>
        pub fn repository_credentials_provider_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.repository_credentials_provider_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of an Amazon Web Services Lambda function that provides credentials to authenticate to the private Docker registry where your model image is hosted. For information about how to create an Amazon Web Services Lambda function, see <a href="https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html">Create a Lambda function with the console</a> in the <i>Amazon Web Services Lambda Developer Guide</i>.</p>
        pub fn set_repository_credentials_provider_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.repository_credentials_provider_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`RepositoryAuthConfig`](crate::model::RepositoryAuthConfig).
        pub fn build(self) -> crate::model::RepositoryAuthConfig {
            crate::model::RepositoryAuthConfig {
                repository_credentials_provider_arn: self.repository_credentials_provider_arn,
            }
        }
    }
}
impl RepositoryAuthConfig {
    /// Creates a new builder-style object to manufacture [`RepositoryAuthConfig`](crate::model::RepositoryAuthConfig).
    pub fn builder() -> crate::model::repository_auth_config::Builder {
        crate::model::repository_auth_config::Builder::default()
    }
}

/// When writing a match expression against `RepositoryAccessMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let repositoryaccessmode = unimplemented!();
/// match repositoryaccessmode {
///     RepositoryAccessMode::Platform => { /* ... */ },
///     RepositoryAccessMode::Vpc => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `repositoryaccessmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RepositoryAccessMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RepositoryAccessMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RepositoryAccessMode::NewFeature` is defined.
/// Specifically, when `repositoryaccessmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RepositoryAccessMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RepositoryAccessMode {
    #[allow(missing_docs)] // documentation missing in model
    Platform,
    #[allow(missing_docs)] // documentation missing in model
    Vpc,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RepositoryAccessMode {
    fn from(s: &str) -> Self {
        match s {
            "Platform" => RepositoryAccessMode::Platform,
            "Vpc" => RepositoryAccessMode::Vpc,
            other => {
                RepositoryAccessMode::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for RepositoryAccessMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RepositoryAccessMode::from(s))
    }
}
impl RepositoryAccessMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RepositoryAccessMode::Platform => "Platform",
            RepositoryAccessMode::Vpc => "Vpc",
            RepositoryAccessMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Platform", "Vpc"]
    }
}
impl AsRef<str> for RepositoryAccessMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>An entity returned by the <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_SearchRecord.html">SearchRecord</a> API containing the properties of a hyperparameter tuning job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningJobSearchEntity {
    /// <p>The name of a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_arn: std::option::Option<std::string::String>,
    /// <p>Configures a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_config:
        std::option::Option<crate::model::HyperParameterTuningJobConfig>,
    /// <p>Defines the training jobs launched by a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub training_job_definition:
        std::option::Option<crate::model::HyperParameterTrainingJobDefinition>,
    /// <p>The job definitions included in a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub training_job_definitions:
        std::option::Option<std::vec::Vec<crate::model::HyperParameterTrainingJobDefinition>>,
    /// <p>The status of a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_status:
        std::option::Option<crate::model::HyperParameterTuningJobStatus>,
    /// <p>The time that a hyperparameter tuning job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that a hyperparameter tuning job ended.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that a hyperparameter tuning job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The numbers of training jobs launched by a hyperparameter tuning job, categorized by status.</p>
    #[doc(hidden)]
    pub training_job_status_counters: std::option::Option<crate::model::TrainingJobStatusCounters>,
    /// <p>Specifies the number of training jobs that this hyperparameter tuning job launched, categorized by the status of their objective metric. The objective metric status shows whether the final objective metric for the training job has been evaluated by the tuning job and used in the hyperparameter tuning process.</p>
    #[doc(hidden)]
    pub objective_status_counters: std::option::Option<crate::model::ObjectiveStatusCounters>,
    /// <p>The container for the summary information about a training job.</p>
    #[doc(hidden)]
    pub best_training_job: std::option::Option<crate::model::HyperParameterTrainingJobSummary>,
    /// <p>The container for the summary information about a training job.</p>
    #[doc(hidden)]
    pub overall_best_training_job:
        std::option::Option<crate::model::HyperParameterTrainingJobSummary>,
    /// <p>Specifies the configuration for a hyperparameter tuning job that uses one or more previous hyperparameter tuning jobs as a starting point. The results of previous tuning jobs are used to inform which combinations of hyperparameters to search over in the new tuning job.</p>
    /// <p>All training jobs launched by the new hyperparameter tuning job are evaluated by using the objective metric, and the training job that performs the best is compared to the best training jobs from the parent tuning jobs. From these, the training job that performs the best as measured by the objective metric is returned as the overall best training job.</p> <note>
    /// <p>All training jobs launched by parent hyperparameter tuning jobs and the new hyperparameter tuning jobs count against the limit of training jobs for the tuning job.</p>
    /// </note>
    #[doc(hidden)]
    pub warm_start_config:
        std::option::Option<crate::model::HyperParameterTuningJobWarmStartConfig>,
    /// <p>The error that was created when a hyperparameter tuning job failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The tags associated with a hyperparameter tuning job. For more information see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl HyperParameterTuningJobSearchEntity {
    /// <p>The name of a hyperparameter tuning job.</p>
    pub fn hyper_parameter_tuning_job_name(&self) -> std::option::Option<&str> {
        self.hyper_parameter_tuning_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of a hyperparameter tuning job.</p>
    pub fn hyper_parameter_tuning_job_arn(&self) -> std::option::Option<&str> {
        self.hyper_parameter_tuning_job_arn.as_deref()
    }
    /// <p>Configures a hyperparameter tuning job.</p>
    pub fn hyper_parameter_tuning_job_config(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobConfig> {
        self.hyper_parameter_tuning_job_config.as_ref()
    }
    /// <p>Defines the training jobs launched by a hyperparameter tuning job.</p>
    pub fn training_job_definition(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTrainingJobDefinition> {
        self.training_job_definition.as_ref()
    }
    /// <p>The job definitions included in a hyperparameter tuning job.</p>
    pub fn training_job_definitions(
        &self,
    ) -> std::option::Option<&[crate::model::HyperParameterTrainingJobDefinition]> {
        self.training_job_definitions.as_deref()
    }
    /// <p>The status of a hyperparameter tuning job.</p>
    pub fn hyper_parameter_tuning_job_status(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobStatus> {
        self.hyper_parameter_tuning_job_status.as_ref()
    }
    /// <p>The time that a hyperparameter tuning job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time that a hyperparameter tuning job ended.</p>
    pub fn hyper_parameter_tuning_end_time(
        &self,
    ) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.hyper_parameter_tuning_end_time.as_ref()
    }
    /// <p>The time that a hyperparameter tuning job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The numbers of training jobs launched by a hyperparameter tuning job, categorized by status.</p>
    pub fn training_job_status_counters(
        &self,
    ) -> std::option::Option<&crate::model::TrainingJobStatusCounters> {
        self.training_job_status_counters.as_ref()
    }
    /// <p>Specifies the number of training jobs that this hyperparameter tuning job launched, categorized by the status of their objective metric. The objective metric status shows whether the final objective metric for the training job has been evaluated by the tuning job and used in the hyperparameter tuning process.</p>
    pub fn objective_status_counters(
        &self,
    ) -> std::option::Option<&crate::model::ObjectiveStatusCounters> {
        self.objective_status_counters.as_ref()
    }
    /// <p>The container for the summary information about a training job.</p>
    pub fn best_training_job(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTrainingJobSummary> {
        self.best_training_job.as_ref()
    }
    /// <p>The container for the summary information about a training job.</p>
    pub fn overall_best_training_job(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTrainingJobSummary> {
        self.overall_best_training_job.as_ref()
    }
    /// <p>Specifies the configuration for a hyperparameter tuning job that uses one or more previous hyperparameter tuning jobs as a starting point. The results of previous tuning jobs are used to inform which combinations of hyperparameters to search over in the new tuning job.</p>
    /// <p>All training jobs launched by the new hyperparameter tuning job are evaluated by using the objective metric, and the training job that performs the best is compared to the best training jobs from the parent tuning jobs. From these, the training job that performs the best as measured by the objective metric is returned as the overall best training job.</p> <note>
    /// <p>All training jobs launched by parent hyperparameter tuning jobs and the new hyperparameter tuning jobs count against the limit of training jobs for the tuning job.</p>
    /// </note>
    pub fn warm_start_config(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobWarmStartConfig> {
        self.warm_start_config.as_ref()
    }
    /// <p>The error that was created when a hyperparameter tuning job failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The tags associated with a hyperparameter tuning job. For more information see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`HyperParameterTuningJobSearchEntity`](crate::model::HyperParameterTuningJobSearchEntity).
pub mod hyper_parameter_tuning_job_search_entity {

    /// A builder for [`HyperParameterTuningJobSearchEntity`](crate::model::HyperParameterTuningJobSearchEntity).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) hyper_parameter_tuning_job_name: std::option::Option<std::string::String>,
        pub(crate) hyper_parameter_tuning_job_arn: std::option::Option<std::string::String>,
        pub(crate) hyper_parameter_tuning_job_config:
            std::option::Option<crate::model::HyperParameterTuningJobConfig>,
        pub(crate) training_job_definition:
            std::option::Option<crate::model::HyperParameterTrainingJobDefinition>,
        pub(crate) training_job_definitions:
            std::option::Option<std::vec::Vec<crate::model::HyperParameterTrainingJobDefinition>>,
        pub(crate) hyper_parameter_tuning_job_status:
            std::option::Option<crate::model::HyperParameterTuningJobStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) hyper_parameter_tuning_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_job_status_counters:
            std::option::Option<crate::model::TrainingJobStatusCounters>,
        pub(crate) objective_status_counters:
            std::option::Option<crate::model::ObjectiveStatusCounters>,
        pub(crate) best_training_job:
            std::option::Option<crate::model::HyperParameterTrainingJobSummary>,
        pub(crate) overall_best_training_job:
            std::option::Option<crate::model::HyperParameterTrainingJobSummary>,
        pub(crate) warm_start_config:
            std::option::Option<crate::model::HyperParameterTuningJobWarmStartConfig>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The name of a hyperparameter tuning job.</p>
        pub fn hyper_parameter_tuning_job_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_name = Some(input.into());
            self
        }
        /// <p>The name of a hyperparameter tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a hyperparameter tuning job.</p>
        pub fn hyper_parameter_tuning_job_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a hyperparameter tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_arn = input;
            self
        }
        /// <p>Configures a hyperparameter tuning job.</p>
        pub fn hyper_parameter_tuning_job_config(
            mut self,
            input: crate::model::HyperParameterTuningJobConfig,
        ) -> Self {
            self.hyper_parameter_tuning_job_config = Some(input);
            self
        }
        /// <p>Configures a hyperparameter tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_config(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobConfig>,
        ) -> Self {
            self.hyper_parameter_tuning_job_config = input;
            self
        }
        /// <p>Defines the training jobs launched by a hyperparameter tuning job.</p>
        pub fn training_job_definition(
            mut self,
            input: crate::model::HyperParameterTrainingJobDefinition,
        ) -> Self {
            self.training_job_definition = Some(input);
            self
        }
        /// <p>Defines the training jobs launched by a hyperparameter tuning job.</p>
        pub fn set_training_job_definition(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTrainingJobDefinition>,
        ) -> Self {
            self.training_job_definition = input;
            self
        }
        /// Appends an item to `training_job_definitions`.
        ///
        /// To override the contents of this collection use [`set_training_job_definitions`](Self::set_training_job_definitions).
        ///
        /// <p>The job definitions included in a hyperparameter tuning job.</p>
        pub fn training_job_definitions(
            mut self,
            input: crate::model::HyperParameterTrainingJobDefinition,
        ) -> Self {
            let mut v = self.training_job_definitions.unwrap_or_default();
            v.push(input);
            self.training_job_definitions = Some(v);
            self
        }
        /// <p>The job definitions included in a hyperparameter tuning job.</p>
        pub fn set_training_job_definitions(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::HyperParameterTrainingJobDefinition>,
            >,
        ) -> Self {
            self.training_job_definitions = input;
            self
        }
        /// <p>The status of a hyperparameter tuning job.</p>
        pub fn hyper_parameter_tuning_job_status(
            mut self,
            input: crate::model::HyperParameterTuningJobStatus,
        ) -> Self {
            self.hyper_parameter_tuning_job_status = Some(input);
            self
        }
        /// <p>The status of a hyperparameter tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_status(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobStatus>,
        ) -> Self {
            self.hyper_parameter_tuning_job_status = input;
            self
        }
        /// <p>The time that a hyperparameter tuning job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that a hyperparameter tuning job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time that a hyperparameter tuning job ended.</p>
        pub fn hyper_parameter_tuning_end_time(
            mut self,
            input: aws_smithy_types::DateTime,
        ) -> Self {
            self.hyper_parameter_tuning_end_time = Some(input);
            self
        }
        /// <p>The time that a hyperparameter tuning job ended.</p>
        pub fn set_hyper_parameter_tuning_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.hyper_parameter_tuning_end_time = input;
            self
        }
        /// <p>The time that a hyperparameter tuning job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time that a hyperparameter tuning job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The numbers of training jobs launched by a hyperparameter tuning job, categorized by status.</p>
        pub fn training_job_status_counters(
            mut self,
            input: crate::model::TrainingJobStatusCounters,
        ) -> Self {
            self.training_job_status_counters = Some(input);
            self
        }
        /// <p>The numbers of training jobs launched by a hyperparameter tuning job, categorized by status.</p>
        pub fn set_training_job_status_counters(
            mut self,
            input: std::option::Option<crate::model::TrainingJobStatusCounters>,
        ) -> Self {
            self.training_job_status_counters = input;
            self
        }
        /// <p>Specifies the number of training jobs that this hyperparameter tuning job launched, categorized by the status of their objective metric. The objective metric status shows whether the final objective metric for the training job has been evaluated by the tuning job and used in the hyperparameter tuning process.</p>
        pub fn objective_status_counters(
            mut self,
            input: crate::model::ObjectiveStatusCounters,
        ) -> Self {
            self.objective_status_counters = Some(input);
            self
        }
        /// <p>Specifies the number of training jobs that this hyperparameter tuning job launched, categorized by the status of their objective metric. The objective metric status shows whether the final objective metric for the training job has been evaluated by the tuning job and used in the hyperparameter tuning process.</p>
        pub fn set_objective_status_counters(
            mut self,
            input: std::option::Option<crate::model::ObjectiveStatusCounters>,
        ) -> Self {
            self.objective_status_counters = input;
            self
        }
        /// <p>The container for the summary information about a training job.</p>
        pub fn best_training_job(
            mut self,
            input: crate::model::HyperParameterTrainingJobSummary,
        ) -> Self {
            self.best_training_job = Some(input);
            self
        }
        /// <p>The container for the summary information about a training job.</p>
        pub fn set_best_training_job(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTrainingJobSummary>,
        ) -> Self {
            self.best_training_job = input;
            self
        }
        /// <p>The container for the summary information about a training job.</p>
        pub fn overall_best_training_job(
            mut self,
            input: crate::model::HyperParameterTrainingJobSummary,
        ) -> Self {
            self.overall_best_training_job = Some(input);
            self
        }
        /// <p>The container for the summary information about a training job.</p>
        pub fn set_overall_best_training_job(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTrainingJobSummary>,
        ) -> Self {
            self.overall_best_training_job = input;
            self
        }
        /// <p>Specifies the configuration for a hyperparameter tuning job that uses one or more previous hyperparameter tuning jobs as a starting point. The results of previous tuning jobs are used to inform which combinations of hyperparameters to search over in the new tuning job.</p>
        /// <p>All training jobs launched by the new hyperparameter tuning job are evaluated by using the objective metric, and the training job that performs the best is compared to the best training jobs from the parent tuning jobs. From these, the training job that performs the best as measured by the objective metric is returned as the overall best training job.</p> <note>
        /// <p>All training jobs launched by parent hyperparameter tuning jobs and the new hyperparameter tuning jobs count against the limit of training jobs for the tuning job.</p>
        /// </note>
        pub fn warm_start_config(
            mut self,
            input: crate::model::HyperParameterTuningJobWarmStartConfig,
        ) -> Self {
            self.warm_start_config = Some(input);
            self
        }
        /// <p>Specifies the configuration for a hyperparameter tuning job that uses one or more previous hyperparameter tuning jobs as a starting point. The results of previous tuning jobs are used to inform which combinations of hyperparameters to search over in the new tuning job.</p>
        /// <p>All training jobs launched by the new hyperparameter tuning job are evaluated by using the objective metric, and the training job that performs the best is compared to the best training jobs from the parent tuning jobs. From these, the training job that performs the best as measured by the objective metric is returned as the overall best training job.</p> <note>
        /// <p>All training jobs launched by parent hyperparameter tuning jobs and the new hyperparameter tuning jobs count against the limit of training jobs for the tuning job.</p>
        /// </note>
        pub fn set_warm_start_config(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobWarmStartConfig>,
        ) -> Self {
            self.warm_start_config = input;
            self
        }
        /// <p>The error that was created when a hyperparameter tuning job failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The error that was created when a hyperparameter tuning job failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>The tags associated with a hyperparameter tuning job. For more information see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>The tags associated with a hyperparameter tuning job. For more information see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningJobSearchEntity`](crate::model::HyperParameterTuningJobSearchEntity).
        pub fn build(self) -> crate::model::HyperParameterTuningJobSearchEntity {
            crate::model::HyperParameterTuningJobSearchEntity {
                hyper_parameter_tuning_job_name: self.hyper_parameter_tuning_job_name,
                hyper_parameter_tuning_job_arn: self.hyper_parameter_tuning_job_arn,
                hyper_parameter_tuning_job_config: self.hyper_parameter_tuning_job_config,
                training_job_definition: self.training_job_definition,
                training_job_definitions: self.training_job_definitions,
                hyper_parameter_tuning_job_status: self.hyper_parameter_tuning_job_status,
                creation_time: self.creation_time,
                hyper_parameter_tuning_end_time: self.hyper_parameter_tuning_end_time,
                last_modified_time: self.last_modified_time,
                training_job_status_counters: self.training_job_status_counters,
                objective_status_counters: self.objective_status_counters,
                best_training_job: self.best_training_job,
                overall_best_training_job: self.overall_best_training_job,
                warm_start_config: self.warm_start_config,
                failure_reason: self.failure_reason,
                tags: self.tags,
            }
        }
    }
}
impl HyperParameterTuningJobSearchEntity {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningJobSearchEntity`](crate::model::HyperParameterTuningJobSearchEntity).
    pub fn builder() -> crate::model::hyper_parameter_tuning_job_search_entity::Builder {
        crate::model::hyper_parameter_tuning_job_search_entity::Builder::default()
    }
}

/// <p>Specifies the configuration for a hyperparameter tuning job that uses one or more previous hyperparameter tuning jobs as a starting point. The results of previous tuning jobs are used to inform which combinations of hyperparameters to search over in the new tuning job.</p>
/// <p>All training jobs launched by the new hyperparameter tuning job are evaluated by using the objective metric, and the training job that performs the best is compared to the best training jobs from the parent tuning jobs. From these, the training job that performs the best as measured by the objective metric is returned as the overall best training job.</p> <note>
/// <p>All training jobs launched by parent hyperparameter tuning jobs and the new hyperparameter tuning jobs count against the limit of training jobs for the tuning job.</p>
/// </note>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningJobWarmStartConfig {
    /// <p>An array of hyperparameter tuning jobs that are used as the starting point for the new hyperparameter tuning job. For more information about warm starting a hyperparameter tuning job, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-warm-start.html">Using a Previous Hyperparameter Tuning Job as a Starting Point</a>.</p>
    /// <p>Hyperparameter tuning jobs created before October 1, 2018 cannot be used as parent jobs for warm start tuning jobs.</p>
    #[doc(hidden)]
    pub parent_hyper_parameter_tuning_jobs:
        std::option::Option<std::vec::Vec<crate::model::ParentHyperParameterTuningJob>>,
    /// <p>Specifies one of the following:</p>
    /// <dl>
    /// <dt>
    /// IDENTICAL_DATA_AND_ALGORITHM
    /// </dt>
    /// <dd>
    /// <p>The new hyperparameter tuning job uses the same input data and training image as the parent tuning jobs. You can change the hyperparameter ranges to search and the maximum number of training jobs that the hyperparameter tuning job launches. You cannot use a new version of the training algorithm, unless the changes in the new version do not affect the algorithm itself. For example, changes that improve logging or adding support for a different data format are allowed. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
    /// </dd>
    /// <dt>
    /// TRANSFER_LEARNING
    /// </dt>
    /// <dd>
    /// <p>The new hyperparameter tuning job can include input data, hyperparameter ranges, maximum number of concurrent training jobs, and maximum number of training jobs that are different than those of its parent hyperparameter tuning jobs. The training image can also be a different version from the version used in the parent hyperparameter tuning job. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
    /// </dd>
    /// </dl>
    #[doc(hidden)]
    pub warm_start_type: std::option::Option<crate::model::HyperParameterTuningJobWarmStartType>,
}
impl HyperParameterTuningJobWarmStartConfig {
    /// <p>An array of hyperparameter tuning jobs that are used as the starting point for the new hyperparameter tuning job. For more information about warm starting a hyperparameter tuning job, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-warm-start.html">Using a Previous Hyperparameter Tuning Job as a Starting Point</a>.</p>
    /// <p>Hyperparameter tuning jobs created before October 1, 2018 cannot be used as parent jobs for warm start tuning jobs.</p>
    pub fn parent_hyper_parameter_tuning_jobs(
        &self,
    ) -> std::option::Option<&[crate::model::ParentHyperParameterTuningJob]> {
        self.parent_hyper_parameter_tuning_jobs.as_deref()
    }
    /// <p>Specifies one of the following:</p>
    /// <dl>
    /// <dt>
    /// IDENTICAL_DATA_AND_ALGORITHM
    /// </dt>
    /// <dd>
    /// <p>The new hyperparameter tuning job uses the same input data and training image as the parent tuning jobs. You can change the hyperparameter ranges to search and the maximum number of training jobs that the hyperparameter tuning job launches. You cannot use a new version of the training algorithm, unless the changes in the new version do not affect the algorithm itself. For example, changes that improve logging or adding support for a different data format are allowed. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
    /// </dd>
    /// <dt>
    /// TRANSFER_LEARNING
    /// </dt>
    /// <dd>
    /// <p>The new hyperparameter tuning job can include input data, hyperparameter ranges, maximum number of concurrent training jobs, and maximum number of training jobs that are different than those of its parent hyperparameter tuning jobs. The training image can also be a different version from the version used in the parent hyperparameter tuning job. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
    /// </dd>
    /// </dl>
    pub fn warm_start_type(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobWarmStartType> {
        self.warm_start_type.as_ref()
    }
}
/// See [`HyperParameterTuningJobWarmStartConfig`](crate::model::HyperParameterTuningJobWarmStartConfig).
pub mod hyper_parameter_tuning_job_warm_start_config {

    /// A builder for [`HyperParameterTuningJobWarmStartConfig`](crate::model::HyperParameterTuningJobWarmStartConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) parent_hyper_parameter_tuning_jobs:
            std::option::Option<std::vec::Vec<crate::model::ParentHyperParameterTuningJob>>,
        pub(crate) warm_start_type:
            std::option::Option<crate::model::HyperParameterTuningJobWarmStartType>,
    }
    impl Builder {
        /// Appends an item to `parent_hyper_parameter_tuning_jobs`.
        ///
        /// To override the contents of this collection use [`set_parent_hyper_parameter_tuning_jobs`](Self::set_parent_hyper_parameter_tuning_jobs).
        ///
        /// <p>An array of hyperparameter tuning jobs that are used as the starting point for the new hyperparameter tuning job. For more information about warm starting a hyperparameter tuning job, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-warm-start.html">Using a Previous Hyperparameter Tuning Job as a Starting Point</a>.</p>
        /// <p>Hyperparameter tuning jobs created before October 1, 2018 cannot be used as parent jobs for warm start tuning jobs.</p>
        pub fn parent_hyper_parameter_tuning_jobs(
            mut self,
            input: crate::model::ParentHyperParameterTuningJob,
        ) -> Self {
            let mut v = self.parent_hyper_parameter_tuning_jobs.unwrap_or_default();
            v.push(input);
            self.parent_hyper_parameter_tuning_jobs = Some(v);
            self
        }
        /// <p>An array of hyperparameter tuning jobs that are used as the starting point for the new hyperparameter tuning job. For more information about warm starting a hyperparameter tuning job, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-warm-start.html">Using a Previous Hyperparameter Tuning Job as a Starting Point</a>.</p>
        /// <p>Hyperparameter tuning jobs created before October 1, 2018 cannot be used as parent jobs for warm start tuning jobs.</p>
        pub fn set_parent_hyper_parameter_tuning_jobs(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ParentHyperParameterTuningJob>>,
        ) -> Self {
            self.parent_hyper_parameter_tuning_jobs = input;
            self
        }
        /// <p>Specifies one of the following:</p>
        /// <dl>
        /// <dt>
        /// IDENTICAL_DATA_AND_ALGORITHM
        /// </dt>
        /// <dd>
        /// <p>The new hyperparameter tuning job uses the same input data and training image as the parent tuning jobs. You can change the hyperparameter ranges to search and the maximum number of training jobs that the hyperparameter tuning job launches. You cannot use a new version of the training algorithm, unless the changes in the new version do not affect the algorithm itself. For example, changes that improve logging or adding support for a different data format are allowed. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
        /// </dd>
        /// <dt>
        /// TRANSFER_LEARNING
        /// </dt>
        /// <dd>
        /// <p>The new hyperparameter tuning job can include input data, hyperparameter ranges, maximum number of concurrent training jobs, and maximum number of training jobs that are different than those of its parent hyperparameter tuning jobs. The training image can also be a different version from the version used in the parent hyperparameter tuning job. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
        /// </dd>
        /// </dl>
        pub fn warm_start_type(
            mut self,
            input: crate::model::HyperParameterTuningJobWarmStartType,
        ) -> Self {
            self.warm_start_type = Some(input);
            self
        }
        /// <p>Specifies one of the following:</p>
        /// <dl>
        /// <dt>
        /// IDENTICAL_DATA_AND_ALGORITHM
        /// </dt>
        /// <dd>
        /// <p>The new hyperparameter tuning job uses the same input data and training image as the parent tuning jobs. You can change the hyperparameter ranges to search and the maximum number of training jobs that the hyperparameter tuning job launches. You cannot use a new version of the training algorithm, unless the changes in the new version do not affect the algorithm itself. For example, changes that improve logging or adding support for a different data format are allowed. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
        /// </dd>
        /// <dt>
        /// TRANSFER_LEARNING
        /// </dt>
        /// <dd>
        /// <p>The new hyperparameter tuning job can include input data, hyperparameter ranges, maximum number of concurrent training jobs, and maximum number of training jobs that are different than those of its parent hyperparameter tuning jobs. The training image can also be a different version from the version used in the parent hyperparameter tuning job. You can also change hyperparameters from tunable to static, and from static to tunable, but the total number of static plus tunable hyperparameters must remain the same as it is in all parent jobs. The objective metric for the new tuning job must be the same as for all parent jobs.</p>
        /// </dd>
        /// </dl>
        pub fn set_warm_start_type(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobWarmStartType>,
        ) -> Self {
            self.warm_start_type = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningJobWarmStartConfig`](crate::model::HyperParameterTuningJobWarmStartConfig).
        pub fn build(self) -> crate::model::HyperParameterTuningJobWarmStartConfig {
            crate::model::HyperParameterTuningJobWarmStartConfig {
                parent_hyper_parameter_tuning_jobs: self.parent_hyper_parameter_tuning_jobs,
                warm_start_type: self.warm_start_type,
            }
        }
    }
}
impl HyperParameterTuningJobWarmStartConfig {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningJobWarmStartConfig`](crate::model::HyperParameterTuningJobWarmStartConfig).
    pub fn builder() -> crate::model::hyper_parameter_tuning_job_warm_start_config::Builder {
        crate::model::hyper_parameter_tuning_job_warm_start_config::Builder::default()
    }
}

/// When writing a match expression against `HyperParameterTuningJobWarmStartType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparametertuningjobwarmstarttype = unimplemented!();
/// match hyperparametertuningjobwarmstarttype {
///     HyperParameterTuningJobWarmStartType::IdenticalDataAndAlgorithm => { /* ... */ },
///     HyperParameterTuningJobWarmStartType::TransferLearning => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparametertuningjobwarmstarttype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterTuningJobWarmStartType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterTuningJobWarmStartType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterTuningJobWarmStartType::NewFeature` is defined.
/// Specifically, when `hyperparametertuningjobwarmstarttype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterTuningJobWarmStartType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterTuningJobWarmStartType {
    #[allow(missing_docs)] // documentation missing in model
    IdenticalDataAndAlgorithm,
    #[allow(missing_docs)] // documentation missing in model
    TransferLearning,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterTuningJobWarmStartType {
    fn from(s: &str) -> Self {
        match s {
            "IdenticalDataAndAlgorithm" => {
                HyperParameterTuningJobWarmStartType::IdenticalDataAndAlgorithm
            }
            "TransferLearning" => HyperParameterTuningJobWarmStartType::TransferLearning,
            other => HyperParameterTuningJobWarmStartType::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for HyperParameterTuningJobWarmStartType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterTuningJobWarmStartType::from(s))
    }
}
impl HyperParameterTuningJobWarmStartType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterTuningJobWarmStartType::IdenticalDataAndAlgorithm => {
                "IdenticalDataAndAlgorithm"
            }
            HyperParameterTuningJobWarmStartType::TransferLearning => "TransferLearning",
            HyperParameterTuningJobWarmStartType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["IdenticalDataAndAlgorithm", "TransferLearning"]
    }
}
impl AsRef<str> for HyperParameterTuningJobWarmStartType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A previously completed or stopped hyperparameter tuning job to be used as a starting point for a new hyperparameter tuning job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ParentHyperParameterTuningJob {
    /// <p>The name of the hyperparameter tuning job to be used as a starting point for a new hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_name: std::option::Option<std::string::String>,
}
impl ParentHyperParameterTuningJob {
    /// <p>The name of the hyperparameter tuning job to be used as a starting point for a new hyperparameter tuning job.</p>
    pub fn hyper_parameter_tuning_job_name(&self) -> std::option::Option<&str> {
        self.hyper_parameter_tuning_job_name.as_deref()
    }
}
/// See [`ParentHyperParameterTuningJob`](crate::model::ParentHyperParameterTuningJob).
pub mod parent_hyper_parameter_tuning_job {

    /// A builder for [`ParentHyperParameterTuningJob`](crate::model::ParentHyperParameterTuningJob).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) hyper_parameter_tuning_job_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the hyperparameter tuning job to be used as a starting point for a new hyperparameter tuning job.</p>
        pub fn hyper_parameter_tuning_job_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_name = Some(input.into());
            self
        }
        /// <p>The name of the hyperparameter tuning job to be used as a starting point for a new hyperparameter tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_name = input;
            self
        }
        /// Consumes the builder and constructs a [`ParentHyperParameterTuningJob`](crate::model::ParentHyperParameterTuningJob).
        pub fn build(self) -> crate::model::ParentHyperParameterTuningJob {
            crate::model::ParentHyperParameterTuningJob {
                hyper_parameter_tuning_job_name: self.hyper_parameter_tuning_job_name,
            }
        }
    }
}
impl ParentHyperParameterTuningJob {
    /// Creates a new builder-style object to manufacture [`ParentHyperParameterTuningJob`](crate::model::ParentHyperParameterTuningJob).
    pub fn builder() -> crate::model::parent_hyper_parameter_tuning_job::Builder {
        crate::model::parent_hyper_parameter_tuning_job::Builder::default()
    }
}

/// <p>The container for the summary information about a training job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTrainingJobSummary {
    /// <p>The training job definition name.</p>
    #[doc(hidden)]
    pub training_job_definition_name: std::option::Option<std::string::String>,
    /// <p>The name of the training job.</p>
    #[doc(hidden)]
    pub training_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the training job.</p>
    #[doc(hidden)]
    pub training_job_arn: std::option::Option<std::string::String>,
    /// <p>The HyperParameter tuning job that launched the training job.</p>
    #[doc(hidden)]
    pub tuning_job_name: std::option::Option<std::string::String>,
    /// <p>The date and time that the training job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the training job started.</p>
    #[doc(hidden)]
    pub training_start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Specifies the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
    #[doc(hidden)]
    pub training_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the training job.</p>
    #[doc(hidden)]
    pub training_job_status: std::option::Option<crate::model::TrainingJobStatus>,
    /// <p>A list of the hyperparameters for which you specified ranges to search.</p>
    #[doc(hidden)]
    pub tuned_hyper_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>The reason that the training job failed. </p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The <code>FinalHyperParameterTuningJobObjectiveMetric</code> object that specifies the value of the objective metric of the tuning job that launched this training job.</p>
    #[doc(hidden)]
    pub final_hyper_parameter_tuning_job_objective_metric:
        std::option::Option<crate::model::FinalHyperParameterTuningJobObjectiveMetric>,
    /// <p>The status of the objective metric for the training job:</p>
    /// <ul>
    /// <li> <p>Succeeded: The final objective metric for the training job was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p> </li>
    /// </ul>
    /// <ul>
    /// <li> <p>Pending: The training job is in progress and evaluation of its final objective metric is pending.</p> </li>
    /// </ul>
    /// <ul>
    /// <li> <p>Failed: The final objective metric for the training job was not evaluated, and was not used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub objective_status: std::option::Option<crate::model::ObjectiveStatus>,
}
impl HyperParameterTrainingJobSummary {
    /// <p>The training job definition name.</p>
    pub fn training_job_definition_name(&self) -> std::option::Option<&str> {
        self.training_job_definition_name.as_deref()
    }
    /// <p>The name of the training job.</p>
    pub fn training_job_name(&self) -> std::option::Option<&str> {
        self.training_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the training job.</p>
    pub fn training_job_arn(&self) -> std::option::Option<&str> {
        self.training_job_arn.as_deref()
    }
    /// <p>The HyperParameter tuning job that launched the training job.</p>
    pub fn tuning_job_name(&self) -> std::option::Option<&str> {
        self.tuning_job_name.as_deref()
    }
    /// <p>The date and time that the training job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The date and time that the training job started.</p>
    pub fn training_start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.training_start_time.as_ref()
    }
    /// <p>Specifies the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
    pub fn training_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.training_end_time.as_ref()
    }
    /// <p>The status of the training job.</p>
    pub fn training_job_status(&self) -> std::option::Option<&crate::model::TrainingJobStatus> {
        self.training_job_status.as_ref()
    }
    /// <p>A list of the hyperparameters for which you specified ranges to search.</p>
    pub fn tuned_hyper_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.tuned_hyper_parameters.as_ref()
    }
    /// <p>The reason that the training job failed. </p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The <code>FinalHyperParameterTuningJobObjectiveMetric</code> object that specifies the value of the objective metric of the tuning job that launched this training job.</p>
    pub fn final_hyper_parameter_tuning_job_objective_metric(
        &self,
    ) -> std::option::Option<&crate::model::FinalHyperParameterTuningJobObjectiveMetric> {
        self.final_hyper_parameter_tuning_job_objective_metric
            .as_ref()
    }
    /// <p>The status of the objective metric for the training job:</p>
    /// <ul>
    /// <li> <p>Succeeded: The final objective metric for the training job was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p> </li>
    /// </ul>
    /// <ul>
    /// <li> <p>Pending: The training job is in progress and evaluation of its final objective metric is pending.</p> </li>
    /// </ul>
    /// <ul>
    /// <li> <p>Failed: The final objective metric for the training job was not evaluated, and was not used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p> </li>
    /// </ul>
    pub fn objective_status(&self) -> std::option::Option<&crate::model::ObjectiveStatus> {
        self.objective_status.as_ref()
    }
}
/// See [`HyperParameterTrainingJobSummary`](crate::model::HyperParameterTrainingJobSummary).
pub mod hyper_parameter_training_job_summary {

    /// A builder for [`HyperParameterTrainingJobSummary`](crate::model::HyperParameterTrainingJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_job_definition_name: std::option::Option<std::string::String>,
        pub(crate) training_job_name: std::option::Option<std::string::String>,
        pub(crate) training_job_arn: std::option::Option<std::string::String>,
        pub(crate) tuning_job_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_job_status: std::option::Option<crate::model::TrainingJobStatus>,
        pub(crate) tuned_hyper_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) final_hyper_parameter_tuning_job_objective_metric:
            std::option::Option<crate::model::FinalHyperParameterTuningJobObjectiveMetric>,
        pub(crate) objective_status: std::option::Option<crate::model::ObjectiveStatus>,
    }
    impl Builder {
        /// <p>The training job definition name.</p>
        pub fn training_job_definition_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.training_job_definition_name = Some(input.into());
            self
        }
        /// <p>The training job definition name.</p>
        pub fn set_training_job_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_definition_name = input;
            self
        }
        /// <p>The name of the training job.</p>
        pub fn training_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_name = Some(input.into());
            self
        }
        /// <p>The name of the training job.</p>
        pub fn set_training_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job.</p>
        pub fn training_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job.</p>
        pub fn set_training_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_arn = input;
            self
        }
        /// <p>The HyperParameter tuning job that launched the training job.</p>
        pub fn tuning_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.tuning_job_name = Some(input.into());
            self
        }
        /// <p>The HyperParameter tuning job that launched the training job.</p>
        pub fn set_tuning_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.tuning_job_name = input;
            self
        }
        /// <p>The date and time that the training job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the training job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The date and time that the training job started.</p>
        pub fn training_start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.training_start_time = Some(input);
            self
        }
        /// <p>The date and time that the training job started.</p>
        pub fn set_training_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.training_start_time = input;
            self
        }
        /// <p>Specifies the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
        pub fn training_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.training_end_time = Some(input);
            self
        }
        /// <p>Specifies the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
        pub fn set_training_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.training_end_time = input;
            self
        }
        /// <p>The status of the training job.</p>
        pub fn training_job_status(mut self, input: crate::model::TrainingJobStatus) -> Self {
            self.training_job_status = Some(input);
            self
        }
        /// <p>The status of the training job.</p>
        pub fn set_training_job_status(
            mut self,
            input: std::option::Option<crate::model::TrainingJobStatus>,
        ) -> Self {
            self.training_job_status = input;
            self
        }
        /// Adds a key-value pair to `tuned_hyper_parameters`.
        ///
        /// To override the contents of this collection use [`set_tuned_hyper_parameters`](Self::set_tuned_hyper_parameters).
        ///
        /// <p>A list of the hyperparameters for which you specified ranges to search.</p>
        pub fn tuned_hyper_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.tuned_hyper_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.tuned_hyper_parameters = Some(hash_map);
            self
        }
        /// <p>A list of the hyperparameters for which you specified ranges to search.</p>
        pub fn set_tuned_hyper_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.tuned_hyper_parameters = input;
            self
        }
        /// <p>The reason that the training job failed. </p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The reason that the training job failed. </p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The <code>FinalHyperParameterTuningJobObjectiveMetric</code> object that specifies the value of the objective metric of the tuning job that launched this training job.</p>
        pub fn final_hyper_parameter_tuning_job_objective_metric(
            mut self,
            input: crate::model::FinalHyperParameterTuningJobObjectiveMetric,
        ) -> Self {
            self.final_hyper_parameter_tuning_job_objective_metric = Some(input);
            self
        }
        /// <p>The <code>FinalHyperParameterTuningJobObjectiveMetric</code> object that specifies the value of the objective metric of the tuning job that launched this training job.</p>
        pub fn set_final_hyper_parameter_tuning_job_objective_metric(
            mut self,
            input: std::option::Option<crate::model::FinalHyperParameterTuningJobObjectiveMetric>,
        ) -> Self {
            self.final_hyper_parameter_tuning_job_objective_metric = input;
            self
        }
        /// <p>The status of the objective metric for the training job:</p>
        /// <ul>
        /// <li> <p>Succeeded: The final objective metric for the training job was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p> </li>
        /// </ul>
        /// <ul>
        /// <li> <p>Pending: The training job is in progress and evaluation of its final objective metric is pending.</p> </li>
        /// </ul>
        /// <ul>
        /// <li> <p>Failed: The final objective metric for the training job was not evaluated, and was not used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p> </li>
        /// </ul>
        pub fn objective_status(mut self, input: crate::model::ObjectiveStatus) -> Self {
            self.objective_status = Some(input);
            self
        }
        /// <p>The status of the objective metric for the training job:</p>
        /// <ul>
        /// <li> <p>Succeeded: The final objective metric for the training job was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p> </li>
        /// </ul>
        /// <ul>
        /// <li> <p>Pending: The training job is in progress and evaluation of its final objective metric is pending.</p> </li>
        /// </ul>
        /// <ul>
        /// <li> <p>Failed: The final objective metric for the training job was not evaluated, and was not used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p> </li>
        /// </ul>
        pub fn set_objective_status(
            mut self,
            input: std::option::Option<crate::model::ObjectiveStatus>,
        ) -> Self {
            self.objective_status = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTrainingJobSummary`](crate::model::HyperParameterTrainingJobSummary).
        pub fn build(self) -> crate::model::HyperParameterTrainingJobSummary {
            crate::model::HyperParameterTrainingJobSummary {
                training_job_definition_name: self.training_job_definition_name,
                training_job_name: self.training_job_name,
                training_job_arn: self.training_job_arn,
                tuning_job_name: self.tuning_job_name,
                creation_time: self.creation_time,
                training_start_time: self.training_start_time,
                training_end_time: self.training_end_time,
                training_job_status: self.training_job_status,
                tuned_hyper_parameters: self.tuned_hyper_parameters,
                failure_reason: self.failure_reason,
                final_hyper_parameter_tuning_job_objective_metric: self
                    .final_hyper_parameter_tuning_job_objective_metric,
                objective_status: self.objective_status,
            }
        }
    }
}
impl HyperParameterTrainingJobSummary {
    /// Creates a new builder-style object to manufacture [`HyperParameterTrainingJobSummary`](crate::model::HyperParameterTrainingJobSummary).
    pub fn builder() -> crate::model::hyper_parameter_training_job_summary::Builder {
        crate::model::hyper_parameter_training_job_summary::Builder::default()
    }
}

/// When writing a match expression against `ObjectiveStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let objectivestatus = unimplemented!();
/// match objectivestatus {
///     ObjectiveStatus::Failed => { /* ... */ },
///     ObjectiveStatus::Pending => { /* ... */ },
///     ObjectiveStatus::Succeeded => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `objectivestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ObjectiveStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ObjectiveStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ObjectiveStatus::NewFeature` is defined.
/// Specifically, when `objectivestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ObjectiveStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ObjectiveStatus {
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    Succeeded,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ObjectiveStatus {
    fn from(s: &str) -> Self {
        match s {
            "Failed" => ObjectiveStatus::Failed,
            "Pending" => ObjectiveStatus::Pending,
            "Succeeded" => ObjectiveStatus::Succeeded,
            other => ObjectiveStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ObjectiveStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ObjectiveStatus::from(s))
    }
}
impl ObjectiveStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ObjectiveStatus::Failed => "Failed",
            ObjectiveStatus::Pending => "Pending",
            ObjectiveStatus::Succeeded => "Succeeded",
            ObjectiveStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Failed", "Pending", "Succeeded"]
    }
}
impl AsRef<str> for ObjectiveStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Shows the final value for the objective metric for a training job that was launched by a hyperparameter tuning job. You define the objective metric in the <code>HyperParameterTuningJobObjective</code> parameter of <code>HyperParameterTuningJobConfig</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FinalHyperParameterTuningJobObjectiveMetric {
    /// <p>Whether to minimize or maximize the objective metric. Valid values are Minimize and Maximize.</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::HyperParameterTuningJobObjectiveType>,
    /// <p>The name of the objective metric.</p>
    #[doc(hidden)]
    pub metric_name: std::option::Option<std::string::String>,
    /// <p>The value of the objective metric.</p>
    #[doc(hidden)]
    pub value: f32,
}
impl FinalHyperParameterTuningJobObjectiveMetric {
    /// <p>Whether to minimize or maximize the objective metric. Valid values are Minimize and Maximize.</p>
    pub fn r#type(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobObjectiveType> {
        self.r#type.as_ref()
    }
    /// <p>The name of the objective metric.</p>
    pub fn metric_name(&self) -> std::option::Option<&str> {
        self.metric_name.as_deref()
    }
    /// <p>The value of the objective metric.</p>
    pub fn value(&self) -> f32 {
        self.value
    }
}
/// See [`FinalHyperParameterTuningJobObjectiveMetric`](crate::model::FinalHyperParameterTuningJobObjectiveMetric).
pub mod final_hyper_parameter_tuning_job_objective_metric {

    /// A builder for [`FinalHyperParameterTuningJobObjectiveMetric`](crate::model::FinalHyperParameterTuningJobObjectiveMetric).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r#type: std::option::Option<crate::model::HyperParameterTuningJobObjectiveType>,
        pub(crate) metric_name: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<f32>,
    }
    impl Builder {
        /// <p>Whether to minimize or maximize the objective metric. Valid values are Minimize and Maximize.</p>
        pub fn r#type(mut self, input: crate::model::HyperParameterTuningJobObjectiveType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>Whether to minimize or maximize the objective metric. Valid values are Minimize and Maximize.</p>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobObjectiveType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The name of the objective metric.</p>
        pub fn metric_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.metric_name = Some(input.into());
            self
        }
        /// <p>The name of the objective metric.</p>
        pub fn set_metric_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.metric_name = input;
            self
        }
        /// <p>The value of the objective metric.</p>
        pub fn value(mut self, input: f32) -> Self {
            self.value = Some(input);
            self
        }
        /// <p>The value of the objective metric.</p>
        pub fn set_value(mut self, input: std::option::Option<f32>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`FinalHyperParameterTuningJobObjectiveMetric`](crate::model::FinalHyperParameterTuningJobObjectiveMetric).
        pub fn build(self) -> crate::model::FinalHyperParameterTuningJobObjectiveMetric {
            crate::model::FinalHyperParameterTuningJobObjectiveMetric {
                r#type: self.r#type,
                metric_name: self.metric_name,
                value: self.value.unwrap_or_default(),
            }
        }
    }
}
impl FinalHyperParameterTuningJobObjectiveMetric {
    /// Creates a new builder-style object to manufacture [`FinalHyperParameterTuningJobObjectiveMetric`](crate::model::FinalHyperParameterTuningJobObjectiveMetric).
    pub fn builder() -> crate::model::final_hyper_parameter_tuning_job_objective_metric::Builder {
        crate::model::final_hyper_parameter_tuning_job_objective_metric::Builder::default()
    }
}

/// When writing a match expression against `HyperParameterTuningJobObjectiveType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparametertuningjobobjectivetype = unimplemented!();
/// match hyperparametertuningjobobjectivetype {
///     HyperParameterTuningJobObjectiveType::Maximize => { /* ... */ },
///     HyperParameterTuningJobObjectiveType::Minimize => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparametertuningjobobjectivetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterTuningJobObjectiveType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterTuningJobObjectiveType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterTuningJobObjectiveType::NewFeature` is defined.
/// Specifically, when `hyperparametertuningjobobjectivetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterTuningJobObjectiveType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterTuningJobObjectiveType {
    #[allow(missing_docs)] // documentation missing in model
    Maximize,
    #[allow(missing_docs)] // documentation missing in model
    Minimize,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterTuningJobObjectiveType {
    fn from(s: &str) -> Self {
        match s {
            "Maximize" => HyperParameterTuningJobObjectiveType::Maximize,
            "Minimize" => HyperParameterTuningJobObjectiveType::Minimize,
            other => HyperParameterTuningJobObjectiveType::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for HyperParameterTuningJobObjectiveType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterTuningJobObjectiveType::from(s))
    }
}
impl HyperParameterTuningJobObjectiveType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterTuningJobObjectiveType::Maximize => "Maximize",
            HyperParameterTuningJobObjectiveType::Minimize => "Minimize",
            HyperParameterTuningJobObjectiveType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Maximize", "Minimize"]
    }
}
impl AsRef<str> for HyperParameterTuningJobObjectiveType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TrainingJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let trainingjobstatus = unimplemented!();
/// match trainingjobstatus {
///     TrainingJobStatus::Completed => { /* ... */ },
///     TrainingJobStatus::Failed => { /* ... */ },
///     TrainingJobStatus::InProgress => { /* ... */ },
///     TrainingJobStatus::Stopped => { /* ... */ },
///     TrainingJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `trainingjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrainingJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrainingJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrainingJobStatus::NewFeature` is defined.
/// Specifically, when `trainingjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrainingJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrainingJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrainingJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => TrainingJobStatus::Completed,
            "Failed" => TrainingJobStatus::Failed,
            "InProgress" => TrainingJobStatus::InProgress,
            "Stopped" => TrainingJobStatus::Stopped,
            "Stopping" => TrainingJobStatus::Stopping,
            other => {
                TrainingJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for TrainingJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrainingJobStatus::from(s))
    }
}
impl TrainingJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrainingJobStatus::Completed => "Completed",
            TrainingJobStatus::Failed => "Failed",
            TrainingJobStatus::InProgress => "InProgress",
            TrainingJobStatus::Stopped => "Stopped",
            TrainingJobStatus::Stopping => "Stopping",
            TrainingJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for TrainingJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies the number of training jobs that this hyperparameter tuning job launched, categorized by the status of their objective metric. The objective metric status shows whether the final objective metric for the training job has been evaluated by the tuning job and used in the hyperparameter tuning process.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ObjectiveStatusCounters {
    /// <p>The number of training jobs whose final objective metric was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p>
    #[doc(hidden)]
    pub succeeded: i32,
    /// <p>The number of training jobs that are in progress and pending evaluation of their final objective metric.</p>
    #[doc(hidden)]
    pub pending: i32,
    /// <p>The number of training jobs whose final objective metric was not evaluated and used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p>
    #[doc(hidden)]
    pub failed: i32,
}
impl ObjectiveStatusCounters {
    /// <p>The number of training jobs whose final objective metric was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p>
    pub fn succeeded(&self) -> i32 {
        self.succeeded
    }
    /// <p>The number of training jobs that are in progress and pending evaluation of their final objective metric.</p>
    pub fn pending(&self) -> i32 {
        self.pending
    }
    /// <p>The number of training jobs whose final objective metric was not evaluated and used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p>
    pub fn failed(&self) -> i32 {
        self.failed
    }
}
/// See [`ObjectiveStatusCounters`](crate::model::ObjectiveStatusCounters).
pub mod objective_status_counters {

    /// A builder for [`ObjectiveStatusCounters`](crate::model::ObjectiveStatusCounters).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) succeeded: std::option::Option<i32>,
        pub(crate) pending: std::option::Option<i32>,
        pub(crate) failed: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The number of training jobs whose final objective metric was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p>
        pub fn succeeded(mut self, input: i32) -> Self {
            self.succeeded = Some(input);
            self
        }
        /// <p>The number of training jobs whose final objective metric was evaluated by the hyperparameter tuning job and used in the hyperparameter tuning process.</p>
        pub fn set_succeeded(mut self, input: std::option::Option<i32>) -> Self {
            self.succeeded = input;
            self
        }
        /// <p>The number of training jobs that are in progress and pending evaluation of their final objective metric.</p>
        pub fn pending(mut self, input: i32) -> Self {
            self.pending = Some(input);
            self
        }
        /// <p>The number of training jobs that are in progress and pending evaluation of their final objective metric.</p>
        pub fn set_pending(mut self, input: std::option::Option<i32>) -> Self {
            self.pending = input;
            self
        }
        /// <p>The number of training jobs whose final objective metric was not evaluated and used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p>
        pub fn failed(mut self, input: i32) -> Self {
            self.failed = Some(input);
            self
        }
        /// <p>The number of training jobs whose final objective metric was not evaluated and used in the hyperparameter tuning process. This typically occurs when the training job failed or did not emit an objective metric.</p>
        pub fn set_failed(mut self, input: std::option::Option<i32>) -> Self {
            self.failed = input;
            self
        }
        /// Consumes the builder and constructs a [`ObjectiveStatusCounters`](crate::model::ObjectiveStatusCounters).
        pub fn build(self) -> crate::model::ObjectiveStatusCounters {
            crate::model::ObjectiveStatusCounters {
                succeeded: self.succeeded.unwrap_or_default(),
                pending: self.pending.unwrap_or_default(),
                failed: self.failed.unwrap_or_default(),
            }
        }
    }
}
impl ObjectiveStatusCounters {
    /// Creates a new builder-style object to manufacture [`ObjectiveStatusCounters`](crate::model::ObjectiveStatusCounters).
    pub fn builder() -> crate::model::objective_status_counters::Builder {
        crate::model::objective_status_counters::Builder::default()
    }
}

/// <p>The numbers of training jobs launched by a hyperparameter tuning job, categorized by status.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrainingJobStatusCounters {
    /// <p>The number of completed training jobs launched by the hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub completed: i32,
    /// <p>The number of in-progress training jobs launched by a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub in_progress: i32,
    /// <p>The number of training jobs that failed, but can be retried. A failed training job can be retried only if it failed because an internal service error occurred.</p>
    #[doc(hidden)]
    pub retryable_error: i32,
    /// <p>The number of training jobs that failed and can't be retried. A failed training job can't be retried if it failed because a client error occurred.</p>
    #[doc(hidden)]
    pub non_retryable_error: i32,
    /// <p>The number of training jobs launched by a hyperparameter tuning job that were manually stopped.</p>
    #[doc(hidden)]
    pub stopped: i32,
}
impl TrainingJobStatusCounters {
    /// <p>The number of completed training jobs launched by the hyperparameter tuning job.</p>
    pub fn completed(&self) -> i32 {
        self.completed
    }
    /// <p>The number of in-progress training jobs launched by a hyperparameter tuning job.</p>
    pub fn in_progress(&self) -> i32 {
        self.in_progress
    }
    /// <p>The number of training jobs that failed, but can be retried. A failed training job can be retried only if it failed because an internal service error occurred.</p>
    pub fn retryable_error(&self) -> i32 {
        self.retryable_error
    }
    /// <p>The number of training jobs that failed and can't be retried. A failed training job can't be retried if it failed because a client error occurred.</p>
    pub fn non_retryable_error(&self) -> i32 {
        self.non_retryable_error
    }
    /// <p>The number of training jobs launched by a hyperparameter tuning job that were manually stopped.</p>
    pub fn stopped(&self) -> i32 {
        self.stopped
    }
}
/// See [`TrainingJobStatusCounters`](crate::model::TrainingJobStatusCounters).
pub mod training_job_status_counters {

    /// A builder for [`TrainingJobStatusCounters`](crate::model::TrainingJobStatusCounters).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) completed: std::option::Option<i32>,
        pub(crate) in_progress: std::option::Option<i32>,
        pub(crate) retryable_error: std::option::Option<i32>,
        pub(crate) non_retryable_error: std::option::Option<i32>,
        pub(crate) stopped: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The number of completed training jobs launched by the hyperparameter tuning job.</p>
        pub fn completed(mut self, input: i32) -> Self {
            self.completed = Some(input);
            self
        }
        /// <p>The number of completed training jobs launched by the hyperparameter tuning job.</p>
        pub fn set_completed(mut self, input: std::option::Option<i32>) -> Self {
            self.completed = input;
            self
        }
        /// <p>The number of in-progress training jobs launched by a hyperparameter tuning job.</p>
        pub fn in_progress(mut self, input: i32) -> Self {
            self.in_progress = Some(input);
            self
        }
        /// <p>The number of in-progress training jobs launched by a hyperparameter tuning job.</p>
        pub fn set_in_progress(mut self, input: std::option::Option<i32>) -> Self {
            self.in_progress = input;
            self
        }
        /// <p>The number of training jobs that failed, but can be retried. A failed training job can be retried only if it failed because an internal service error occurred.</p>
        pub fn retryable_error(mut self, input: i32) -> Self {
            self.retryable_error = Some(input);
            self
        }
        /// <p>The number of training jobs that failed, but can be retried. A failed training job can be retried only if it failed because an internal service error occurred.</p>
        pub fn set_retryable_error(mut self, input: std::option::Option<i32>) -> Self {
            self.retryable_error = input;
            self
        }
        /// <p>The number of training jobs that failed and can't be retried. A failed training job can't be retried if it failed because a client error occurred.</p>
        pub fn non_retryable_error(mut self, input: i32) -> Self {
            self.non_retryable_error = Some(input);
            self
        }
        /// <p>The number of training jobs that failed and can't be retried. A failed training job can't be retried if it failed because a client error occurred.</p>
        pub fn set_non_retryable_error(mut self, input: std::option::Option<i32>) -> Self {
            self.non_retryable_error = input;
            self
        }
        /// <p>The number of training jobs launched by a hyperparameter tuning job that were manually stopped.</p>
        pub fn stopped(mut self, input: i32) -> Self {
            self.stopped = Some(input);
            self
        }
        /// <p>The number of training jobs launched by a hyperparameter tuning job that were manually stopped.</p>
        pub fn set_stopped(mut self, input: std::option::Option<i32>) -> Self {
            self.stopped = input;
            self
        }
        /// Consumes the builder and constructs a [`TrainingJobStatusCounters`](crate::model::TrainingJobStatusCounters).
        pub fn build(self) -> crate::model::TrainingJobStatusCounters {
            crate::model::TrainingJobStatusCounters {
                completed: self.completed.unwrap_or_default(),
                in_progress: self.in_progress.unwrap_or_default(),
                retryable_error: self.retryable_error.unwrap_or_default(),
                non_retryable_error: self.non_retryable_error.unwrap_or_default(),
                stopped: self.stopped.unwrap_or_default(),
            }
        }
    }
}
impl TrainingJobStatusCounters {
    /// Creates a new builder-style object to manufacture [`TrainingJobStatusCounters`](crate::model::TrainingJobStatusCounters).
    pub fn builder() -> crate::model::training_job_status_counters::Builder {
        crate::model::training_job_status_counters::Builder::default()
    }
}

/// When writing a match expression against `HyperParameterTuningJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparametertuningjobstatus = unimplemented!();
/// match hyperparametertuningjobstatus {
///     HyperParameterTuningJobStatus::Completed => { /* ... */ },
///     HyperParameterTuningJobStatus::Failed => { /* ... */ },
///     HyperParameterTuningJobStatus::InProgress => { /* ... */ },
///     HyperParameterTuningJobStatus::Stopped => { /* ... */ },
///     HyperParameterTuningJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparametertuningjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterTuningJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterTuningJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterTuningJobStatus::NewFeature` is defined.
/// Specifically, when `hyperparametertuningjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterTuningJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterTuningJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterTuningJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => HyperParameterTuningJobStatus::Completed,
            "Failed" => HyperParameterTuningJobStatus::Failed,
            "InProgress" => HyperParameterTuningJobStatus::InProgress,
            "Stopped" => HyperParameterTuningJobStatus::Stopped,
            "Stopping" => HyperParameterTuningJobStatus::Stopping,
            other => HyperParameterTuningJobStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for HyperParameterTuningJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterTuningJobStatus::from(s))
    }
}
impl HyperParameterTuningJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterTuningJobStatus::Completed => "Completed",
            HyperParameterTuningJobStatus::Failed => "Failed",
            HyperParameterTuningJobStatus::InProgress => "InProgress",
            HyperParameterTuningJobStatus::Stopped => "Stopped",
            HyperParameterTuningJobStatus::Stopping => "Stopping",
            HyperParameterTuningJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for HyperParameterTuningJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Defines the training jobs launched by a hyperparameter tuning job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTrainingJobDefinition {
    /// <p>The job definition name.</p>
    #[doc(hidden)]
    pub definition_name: std::option::Option<std::string::String>,
    /// <p>Defines the objective metric for a hyperparameter tuning job. Hyperparameter tuning uses the value of this metric to evaluate the training jobs it launches, and returns the training job that results in either the highest or lowest value for this metric, depending on the value you specify for the <code>Type</code> parameter.</p>
    #[doc(hidden)]
    pub tuning_objective: std::option::Option<crate::model::HyperParameterTuningJobObjective>,
    /// <p>Specifies ranges of integer, continuous, and categorical hyperparameters that a hyperparameter tuning job searches. The hyperparameter tuning job launches training jobs with hyperparameter values within these ranges to find the combination of values that result in the training job with the best performance as measured by the objective metric of the hyperparameter tuning job.</p> <note>
    /// <p>The maximum number of items specified for <code>Array Members</code> refers to the maximum number of hyperparameters for each range and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of hyperparameters for all the ranges can't exceed the maximum number specified.</p>
    /// </note>
    #[doc(hidden)]
    pub hyper_parameter_ranges: std::option::Option<crate::model::ParameterRanges>,
    /// <p>Specifies the values of hyperparameters that do not change for the tuning job.</p>
    #[doc(hidden)]
    pub static_hyper_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>The <code>HyperParameterAlgorithmSpecification</code> object that specifies the resource algorithm to use for the training jobs that the tuning job launches.</p>
    #[doc(hidden)]
    pub algorithm_specification:
        std::option::Option<crate::model::HyperParameterAlgorithmSpecification>,
    /// <p>The Amazon Resource Name (ARN) of the IAM role associated with the training jobs that the tuning job launches.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>An array of <code>Channel</code> objects that specify the input for the training jobs that the tuning job launches.</p>
    #[doc(hidden)]
    pub input_data_config: std::option::Option<std::vec::Vec<crate::model::Channel>>,
    /// <p>The <code>VpcConfig</code> object that specifies the VPC that you want the training jobs that this hyperparameter tuning job launches to connect to. Control access to and from your training container by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
    /// <p>Specifies the path to the Amazon S3 bucket where you store model artifacts from the training jobs that the tuning job launches.</p>
    #[doc(hidden)]
    pub output_data_config: std::option::Option<crate::model::OutputDataConfig>,
    /// <p>The resources, including the compute instances and storage volumes, to use for the training jobs that the tuning job launches.</p>
    /// <p>Storage volumes store model artifacts and incremental states. Training algorithms might also use storage volumes for scratch space. If you want SageMaker to use the storage volume to store the training data, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. For distributed training algorithms, specify an instance count greater than 1.</p> <note>
    /// <p>If you want to use hyperparameter optimization with instance type flexibility, use <code>HyperParameterTuningResourceConfig</code> instead.</p>
    /// </note>
    #[doc(hidden)]
    pub resource_config: std::option::Option<crate::model::ResourceConfig>,
    /// <p>Specifies a limit to how long a model hyperparameter training job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
    #[doc(hidden)]
    pub stopping_condition: std::option::Option<crate::model::StoppingCondition>,
    /// <p>Isolates the training container. No inbound or outbound network calls can be made, except for calls between peers within a training cluster for distributed training. If network isolation is used for training jobs that are configured to use a VPC, SageMaker downloads and uploads customer data and model artifacts through the specified VPC, but the training container does not have network access.</p>
    #[doc(hidden)]
    pub enable_network_isolation: bool,
    /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
    #[doc(hidden)]
    pub enable_inter_container_traffic_encryption: bool,
    /// <p>A Boolean indicating whether managed spot training is enabled (<code>True</code>) or not (<code>False</code>).</p>
    #[doc(hidden)]
    pub enable_managed_spot_training: bool,
    /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
    #[doc(hidden)]
    pub checkpoint_config: std::option::Option<crate::model::CheckpointConfig>,
    /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
    #[doc(hidden)]
    pub retry_strategy: std::option::Option<crate::model::RetryStrategy>,
    /// <p>The configuration for the hyperparameter tuning resources, including the compute instances and storage volumes, used for training jobs launched by the tuning job. By default, storage volumes hold model artifacts and incremental states. Choose <code>File</code> for <code>TrainingInputMode</code> in the <code>AlgorithmSpecification</code> parameter to additionally store training data in the storage volume (optional).</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_resource_config:
        std::option::Option<crate::model::HyperParameterTuningResourceConfig>,
    /// <p>An environment variable that you can pass into the SageMaker <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html">CreateTrainingJob</a> API. You can use an existing <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment">environment variable from the training container</a> or use your own. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Define metrics and variables</a> for more information.</p> <note>
    /// <p>The maximum number of items specified for <code>Map Entries</code> refers to the maximum number of environment variables for each <code>TrainingJobDefinition</code> and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of environment variables for all the training job definitions can't exceed the maximum number specified.</p>
    /// </note>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl HyperParameterTrainingJobDefinition {
    /// <p>The job definition name.</p>
    pub fn definition_name(&self) -> std::option::Option<&str> {
        self.definition_name.as_deref()
    }
    /// <p>Defines the objective metric for a hyperparameter tuning job. Hyperparameter tuning uses the value of this metric to evaluate the training jobs it launches, and returns the training job that results in either the highest or lowest value for this metric, depending on the value you specify for the <code>Type</code> parameter.</p>
    pub fn tuning_objective(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobObjective> {
        self.tuning_objective.as_ref()
    }
    /// <p>Specifies ranges of integer, continuous, and categorical hyperparameters that a hyperparameter tuning job searches. The hyperparameter tuning job launches training jobs with hyperparameter values within these ranges to find the combination of values that result in the training job with the best performance as measured by the objective metric of the hyperparameter tuning job.</p> <note>
    /// <p>The maximum number of items specified for <code>Array Members</code> refers to the maximum number of hyperparameters for each range and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of hyperparameters for all the ranges can't exceed the maximum number specified.</p>
    /// </note>
    pub fn hyper_parameter_ranges(&self) -> std::option::Option<&crate::model::ParameterRanges> {
        self.hyper_parameter_ranges.as_ref()
    }
    /// <p>Specifies the values of hyperparameters that do not change for the tuning job.</p>
    pub fn static_hyper_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.static_hyper_parameters.as_ref()
    }
    /// <p>The <code>HyperParameterAlgorithmSpecification</code> object that specifies the resource algorithm to use for the training jobs that the tuning job launches.</p>
    pub fn algorithm_specification(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterAlgorithmSpecification> {
        self.algorithm_specification.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the IAM role associated with the training jobs that the tuning job launches.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>An array of <code>Channel</code> objects that specify the input for the training jobs that the tuning job launches.</p>
    pub fn input_data_config(&self) -> std::option::Option<&[crate::model::Channel]> {
        self.input_data_config.as_deref()
    }
    /// <p>The <code>VpcConfig</code> object that specifies the VPC that you want the training jobs that this hyperparameter tuning job launches to connect to. Control access to and from your training container by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
    /// <p>Specifies the path to the Amazon S3 bucket where you store model artifacts from the training jobs that the tuning job launches.</p>
    pub fn output_data_config(&self) -> std::option::Option<&crate::model::OutputDataConfig> {
        self.output_data_config.as_ref()
    }
    /// <p>The resources, including the compute instances and storage volumes, to use for the training jobs that the tuning job launches.</p>
    /// <p>Storage volumes store model artifacts and incremental states. Training algorithms might also use storage volumes for scratch space. If you want SageMaker to use the storage volume to store the training data, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. For distributed training algorithms, specify an instance count greater than 1.</p> <note>
    /// <p>If you want to use hyperparameter optimization with instance type flexibility, use <code>HyperParameterTuningResourceConfig</code> instead.</p>
    /// </note>
    pub fn resource_config(&self) -> std::option::Option<&crate::model::ResourceConfig> {
        self.resource_config.as_ref()
    }
    /// <p>Specifies a limit to how long a model hyperparameter training job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
    pub fn stopping_condition(&self) -> std::option::Option<&crate::model::StoppingCondition> {
        self.stopping_condition.as_ref()
    }
    /// <p>Isolates the training container. No inbound or outbound network calls can be made, except for calls between peers within a training cluster for distributed training. If network isolation is used for training jobs that are configured to use a VPC, SageMaker downloads and uploads customer data and model artifacts through the specified VPC, but the training container does not have network access.</p>
    pub fn enable_network_isolation(&self) -> bool {
        self.enable_network_isolation
    }
    /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
    pub fn enable_inter_container_traffic_encryption(&self) -> bool {
        self.enable_inter_container_traffic_encryption
    }
    /// <p>A Boolean indicating whether managed spot training is enabled (<code>True</code>) or not (<code>False</code>).</p>
    pub fn enable_managed_spot_training(&self) -> bool {
        self.enable_managed_spot_training
    }
    /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
    pub fn checkpoint_config(&self) -> std::option::Option<&crate::model::CheckpointConfig> {
        self.checkpoint_config.as_ref()
    }
    /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
    pub fn retry_strategy(&self) -> std::option::Option<&crate::model::RetryStrategy> {
        self.retry_strategy.as_ref()
    }
    /// <p>The configuration for the hyperparameter tuning resources, including the compute instances and storage volumes, used for training jobs launched by the tuning job. By default, storage volumes hold model artifacts and incremental states. Choose <code>File</code> for <code>TrainingInputMode</code> in the <code>AlgorithmSpecification</code> parameter to additionally store training data in the storage volume (optional).</p>
    pub fn hyper_parameter_tuning_resource_config(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningResourceConfig> {
        self.hyper_parameter_tuning_resource_config.as_ref()
    }
    /// <p>An environment variable that you can pass into the SageMaker <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html">CreateTrainingJob</a> API. You can use an existing <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment">environment variable from the training container</a> or use your own. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Define metrics and variables</a> for more information.</p> <note>
    /// <p>The maximum number of items specified for <code>Map Entries</code> refers to the maximum number of environment variables for each <code>TrainingJobDefinition</code> and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of environment variables for all the training job definitions can't exceed the maximum number specified.</p>
    /// </note>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
}
/// See [`HyperParameterTrainingJobDefinition`](crate::model::HyperParameterTrainingJobDefinition).
pub mod hyper_parameter_training_job_definition {

    /// A builder for [`HyperParameterTrainingJobDefinition`](crate::model::HyperParameterTrainingJobDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) definition_name: std::option::Option<std::string::String>,
        pub(crate) tuning_objective:
            std::option::Option<crate::model::HyperParameterTuningJobObjective>,
        pub(crate) hyper_parameter_ranges: std::option::Option<crate::model::ParameterRanges>,
        pub(crate) static_hyper_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) algorithm_specification:
            std::option::Option<crate::model::HyperParameterAlgorithmSpecification>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) input_data_config: std::option::Option<std::vec::Vec<crate::model::Channel>>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
        pub(crate) output_data_config: std::option::Option<crate::model::OutputDataConfig>,
        pub(crate) resource_config: std::option::Option<crate::model::ResourceConfig>,
        pub(crate) stopping_condition: std::option::Option<crate::model::StoppingCondition>,
        pub(crate) enable_network_isolation: std::option::Option<bool>,
        pub(crate) enable_inter_container_traffic_encryption: std::option::Option<bool>,
        pub(crate) enable_managed_spot_training: std::option::Option<bool>,
        pub(crate) checkpoint_config: std::option::Option<crate::model::CheckpointConfig>,
        pub(crate) retry_strategy: std::option::Option<crate::model::RetryStrategy>,
        pub(crate) hyper_parameter_tuning_resource_config:
            std::option::Option<crate::model::HyperParameterTuningResourceConfig>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The job definition name.</p>
        pub fn definition_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.definition_name = Some(input.into());
            self
        }
        /// <p>The job definition name.</p>
        pub fn set_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.definition_name = input;
            self
        }
        /// <p>Defines the objective metric for a hyperparameter tuning job. Hyperparameter tuning uses the value of this metric to evaluate the training jobs it launches, and returns the training job that results in either the highest or lowest value for this metric, depending on the value you specify for the <code>Type</code> parameter.</p>
        pub fn tuning_objective(
            mut self,
            input: crate::model::HyperParameterTuningJobObjective,
        ) -> Self {
            self.tuning_objective = Some(input);
            self
        }
        /// <p>Defines the objective metric for a hyperparameter tuning job. Hyperparameter tuning uses the value of this metric to evaluate the training jobs it launches, and returns the training job that results in either the highest or lowest value for this metric, depending on the value you specify for the <code>Type</code> parameter.</p>
        pub fn set_tuning_objective(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobObjective>,
        ) -> Self {
            self.tuning_objective = input;
            self
        }
        /// <p>Specifies ranges of integer, continuous, and categorical hyperparameters that a hyperparameter tuning job searches. The hyperparameter tuning job launches training jobs with hyperparameter values within these ranges to find the combination of values that result in the training job with the best performance as measured by the objective metric of the hyperparameter tuning job.</p> <note>
        /// <p>The maximum number of items specified for <code>Array Members</code> refers to the maximum number of hyperparameters for each range and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of hyperparameters for all the ranges can't exceed the maximum number specified.</p>
        /// </note>
        pub fn hyper_parameter_ranges(mut self, input: crate::model::ParameterRanges) -> Self {
            self.hyper_parameter_ranges = Some(input);
            self
        }
        /// <p>Specifies ranges of integer, continuous, and categorical hyperparameters that a hyperparameter tuning job searches. The hyperparameter tuning job launches training jobs with hyperparameter values within these ranges to find the combination of values that result in the training job with the best performance as measured by the objective metric of the hyperparameter tuning job.</p> <note>
        /// <p>The maximum number of items specified for <code>Array Members</code> refers to the maximum number of hyperparameters for each range and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of hyperparameters for all the ranges can't exceed the maximum number specified.</p>
        /// </note>
        pub fn set_hyper_parameter_ranges(
            mut self,
            input: std::option::Option<crate::model::ParameterRanges>,
        ) -> Self {
            self.hyper_parameter_ranges = input;
            self
        }
        /// Adds a key-value pair to `static_hyper_parameters`.
        ///
        /// To override the contents of this collection use [`set_static_hyper_parameters`](Self::set_static_hyper_parameters).
        ///
        /// <p>Specifies the values of hyperparameters that do not change for the tuning job.</p>
        pub fn static_hyper_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.static_hyper_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.static_hyper_parameters = Some(hash_map);
            self
        }
        /// <p>Specifies the values of hyperparameters that do not change for the tuning job.</p>
        pub fn set_static_hyper_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.static_hyper_parameters = input;
            self
        }
        /// <p>The <code>HyperParameterAlgorithmSpecification</code> object that specifies the resource algorithm to use for the training jobs that the tuning job launches.</p>
        pub fn algorithm_specification(
            mut self,
            input: crate::model::HyperParameterAlgorithmSpecification,
        ) -> Self {
            self.algorithm_specification = Some(input);
            self
        }
        /// <p>The <code>HyperParameterAlgorithmSpecification</code> object that specifies the resource algorithm to use for the training jobs that the tuning job launches.</p>
        pub fn set_algorithm_specification(
            mut self,
            input: std::option::Option<crate::model::HyperParameterAlgorithmSpecification>,
        ) -> Self {
            self.algorithm_specification = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the IAM role associated with the training jobs that the tuning job launches.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the IAM role associated with the training jobs that the tuning job launches.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// Appends an item to `input_data_config`.
        ///
        /// To override the contents of this collection use [`set_input_data_config`](Self::set_input_data_config).
        ///
        /// <p>An array of <code>Channel</code> objects that specify the input for the training jobs that the tuning job launches.</p>
        pub fn input_data_config(mut self, input: crate::model::Channel) -> Self {
            let mut v = self.input_data_config.unwrap_or_default();
            v.push(input);
            self.input_data_config = Some(v);
            self
        }
        /// <p>An array of <code>Channel</code> objects that specify the input for the training jobs that the tuning job launches.</p>
        pub fn set_input_data_config(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Channel>>,
        ) -> Self {
            self.input_data_config = input;
            self
        }
        /// <p>The <code>VpcConfig</code> object that specifies the VPC that you want the training jobs that this hyperparameter tuning job launches to connect to. Control access to and from your training container by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>The <code>VpcConfig</code> object that specifies the VPC that you want the training jobs that this hyperparameter tuning job launches to connect to. Control access to and from your training container by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// <p>Specifies the path to the Amazon S3 bucket where you store model artifacts from the training jobs that the tuning job launches.</p>
        pub fn output_data_config(mut self, input: crate::model::OutputDataConfig) -> Self {
            self.output_data_config = Some(input);
            self
        }
        /// <p>Specifies the path to the Amazon S3 bucket where you store model artifacts from the training jobs that the tuning job launches.</p>
        pub fn set_output_data_config(
            mut self,
            input: std::option::Option<crate::model::OutputDataConfig>,
        ) -> Self {
            self.output_data_config = input;
            self
        }
        /// <p>The resources, including the compute instances and storage volumes, to use for the training jobs that the tuning job launches.</p>
        /// <p>Storage volumes store model artifacts and incremental states. Training algorithms might also use storage volumes for scratch space. If you want SageMaker to use the storage volume to store the training data, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. For distributed training algorithms, specify an instance count greater than 1.</p> <note>
        /// <p>If you want to use hyperparameter optimization with instance type flexibility, use <code>HyperParameterTuningResourceConfig</code> instead.</p>
        /// </note>
        pub fn resource_config(mut self, input: crate::model::ResourceConfig) -> Self {
            self.resource_config = Some(input);
            self
        }
        /// <p>The resources, including the compute instances and storage volumes, to use for the training jobs that the tuning job launches.</p>
        /// <p>Storage volumes store model artifacts and incremental states. Training algorithms might also use storage volumes for scratch space. If you want SageMaker to use the storage volume to store the training data, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. For distributed training algorithms, specify an instance count greater than 1.</p> <note>
        /// <p>If you want to use hyperparameter optimization with instance type flexibility, use <code>HyperParameterTuningResourceConfig</code> instead.</p>
        /// </note>
        pub fn set_resource_config(
            mut self,
            input: std::option::Option<crate::model::ResourceConfig>,
        ) -> Self {
            self.resource_config = input;
            self
        }
        /// <p>Specifies a limit to how long a model hyperparameter training job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
        pub fn stopping_condition(mut self, input: crate::model::StoppingCondition) -> Self {
            self.stopping_condition = Some(input);
            self
        }
        /// <p>Specifies a limit to how long a model hyperparameter training job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
        pub fn set_stopping_condition(
            mut self,
            input: std::option::Option<crate::model::StoppingCondition>,
        ) -> Self {
            self.stopping_condition = input;
            self
        }
        /// <p>Isolates the training container. No inbound or outbound network calls can be made, except for calls between peers within a training cluster for distributed training. If network isolation is used for training jobs that are configured to use a VPC, SageMaker downloads and uploads customer data and model artifacts through the specified VPC, but the training container does not have network access.</p>
        pub fn enable_network_isolation(mut self, input: bool) -> Self {
            self.enable_network_isolation = Some(input);
            self
        }
        /// <p>Isolates the training container. No inbound or outbound network calls can be made, except for calls between peers within a training cluster for distributed training. If network isolation is used for training jobs that are configured to use a VPC, SageMaker downloads and uploads customer data and model artifacts through the specified VPC, but the training container does not have network access.</p>
        pub fn set_enable_network_isolation(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_network_isolation = input;
            self
        }
        /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
        pub fn enable_inter_container_traffic_encryption(mut self, input: bool) -> Self {
            self.enable_inter_container_traffic_encryption = Some(input);
            self
        }
        /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
        pub fn set_enable_inter_container_traffic_encryption(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_inter_container_traffic_encryption = input;
            self
        }
        /// <p>A Boolean indicating whether managed spot training is enabled (<code>True</code>) or not (<code>False</code>).</p>
        pub fn enable_managed_spot_training(mut self, input: bool) -> Self {
            self.enable_managed_spot_training = Some(input);
            self
        }
        /// <p>A Boolean indicating whether managed spot training is enabled (<code>True</code>) or not (<code>False</code>).</p>
        pub fn set_enable_managed_spot_training(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_managed_spot_training = input;
            self
        }
        /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
        pub fn checkpoint_config(mut self, input: crate::model::CheckpointConfig) -> Self {
            self.checkpoint_config = Some(input);
            self
        }
        /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
        pub fn set_checkpoint_config(
            mut self,
            input: std::option::Option<crate::model::CheckpointConfig>,
        ) -> Self {
            self.checkpoint_config = input;
            self
        }
        /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
        pub fn retry_strategy(mut self, input: crate::model::RetryStrategy) -> Self {
            self.retry_strategy = Some(input);
            self
        }
        /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
        pub fn set_retry_strategy(
            mut self,
            input: std::option::Option<crate::model::RetryStrategy>,
        ) -> Self {
            self.retry_strategy = input;
            self
        }
        /// <p>The configuration for the hyperparameter tuning resources, including the compute instances and storage volumes, used for training jobs launched by the tuning job. By default, storage volumes hold model artifacts and incremental states. Choose <code>File</code> for <code>TrainingInputMode</code> in the <code>AlgorithmSpecification</code> parameter to additionally store training data in the storage volume (optional).</p>
        pub fn hyper_parameter_tuning_resource_config(
            mut self,
            input: crate::model::HyperParameterTuningResourceConfig,
        ) -> Self {
            self.hyper_parameter_tuning_resource_config = Some(input);
            self
        }
        /// <p>The configuration for the hyperparameter tuning resources, including the compute instances and storage volumes, used for training jobs launched by the tuning job. By default, storage volumes hold model artifacts and incremental states. Choose <code>File</code> for <code>TrainingInputMode</code> in the <code>AlgorithmSpecification</code> parameter to additionally store training data in the storage volume (optional).</p>
        pub fn set_hyper_parameter_tuning_resource_config(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningResourceConfig>,
        ) -> Self {
            self.hyper_parameter_tuning_resource_config = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>An environment variable that you can pass into the SageMaker <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html">CreateTrainingJob</a> API. You can use an existing <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment">environment variable from the training container</a> or use your own. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Define metrics and variables</a> for more information.</p> <note>
        /// <p>The maximum number of items specified for <code>Map Entries</code> refers to the maximum number of environment variables for each <code>TrainingJobDefinition</code> and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of environment variables for all the training job definitions can't exceed the maximum number specified.</p>
        /// </note>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>An environment variable that you can pass into the SageMaker <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html">CreateTrainingJob</a> API. You can use an existing <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment">environment variable from the training container</a> or use your own. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Define metrics and variables</a> for more information.</p> <note>
        /// <p>The maximum number of items specified for <code>Map Entries</code> refers to the maximum number of environment variables for each <code>TrainingJobDefinition</code> and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of environment variables for all the training job definitions can't exceed the maximum number specified.</p>
        /// </note>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTrainingJobDefinition`](crate::model::HyperParameterTrainingJobDefinition).
        pub fn build(self) -> crate::model::HyperParameterTrainingJobDefinition {
            crate::model::HyperParameterTrainingJobDefinition {
                definition_name: self.definition_name,
                tuning_objective: self.tuning_objective,
                hyper_parameter_ranges: self.hyper_parameter_ranges,
                static_hyper_parameters: self.static_hyper_parameters,
                algorithm_specification: self.algorithm_specification,
                role_arn: self.role_arn,
                input_data_config: self.input_data_config,
                vpc_config: self.vpc_config,
                output_data_config: self.output_data_config,
                resource_config: self.resource_config,
                stopping_condition: self.stopping_condition,
                enable_network_isolation: self.enable_network_isolation.unwrap_or_default(),
                enable_inter_container_traffic_encryption: self
                    .enable_inter_container_traffic_encryption
                    .unwrap_or_default(),
                enable_managed_spot_training: self.enable_managed_spot_training.unwrap_or_default(),
                checkpoint_config: self.checkpoint_config,
                retry_strategy: self.retry_strategy,
                hyper_parameter_tuning_resource_config: self.hyper_parameter_tuning_resource_config,
                environment: self.environment,
            }
        }
    }
}
impl HyperParameterTrainingJobDefinition {
    /// Creates a new builder-style object to manufacture [`HyperParameterTrainingJobDefinition`](crate::model::HyperParameterTrainingJobDefinition).
    pub fn builder() -> crate::model::hyper_parameter_training_job_definition::Builder {
        crate::model::hyper_parameter_training_job_definition::Builder::default()
    }
}

/// <p>The configuration of resources, including compute instances and storage volumes for use in training jobs launched by hyperparameter tuning jobs. <code>HyperParameterTuningResourceConfig</code> is similar to <code>ResourceConfig</code>, but has the additional <code>InstanceConfigs</code> and <code>AllocationStrategy</code> fields to allow for flexible instance management. Specify one or more instance types, count, and the allocation strategy for instance selection.</p> <note>
/// <p> <code>HyperParameterTuningResourceConfig</code> supports the capabilities of <code>ResourceConfig</code> with the exception of <code>KeepAlivePeriodInSeconds</code>. Hyperparameter tuning jobs use warm pools by default, which reuse clusters between training jobs.</p>
/// </note>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningResourceConfig {
    /// <p>The instance type used to run hyperparameter optimization tuning jobs. See <a href="https://docs.aws.amazon.com/notebooks-available-instance-types.html"> descriptions of instance types</a> for more information.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::TrainingInstanceType>,
    /// <p>The number of compute instances of type <code>InstanceType</code> to use. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-use-api.html">distributed training</a>, select a value greater than 1.</p>
    #[doc(hidden)]
    pub instance_count: i32,
    /// <p>The volume size in GB for the storage volume to be used in processing hyperparameter optimization jobs (optional). These volumes store model artifacts, incremental states and optionally, scratch space for training algorithms. Do not provide a value for this parameter if a value for <code>InstanceConfigs</code> is also specified.</p>
    /// <p>Some instance types have a fixed total local storage size. If you select one of these instances for training, <code>VolumeSizeInGB</code> cannot be greater than this total size. For a list of instance types with local instance storage and their sizes, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>.</p> <note>
    /// <p>SageMaker supports only the <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html">General Purpose SSD (gp2)</a> storage volume type.</p>
    /// </note>
    #[doc(hidden)]
    pub volume_size_in_gb: i32,
    /// <p>A key used by Amazon Web Services Key Management Service to encrypt data on the storage volume attached to the compute instances used to run the training job. You can use either of the following formats to specify a key.</p>
    /// <p>KMS Key ID:</p>
    /// <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
    /// <p>Amazon Resource Name (ARN) of a KMS key:</p>
    /// <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
    /// <p>Some instances use local storage, which use a <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">hardware module to encrypt</a> storage volumes. If you choose one of these instance types, you cannot request a <code>VolumeKmsKeyId</code>. For a list of instance types that use local storage, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>. For more information about Amazon Web Services Key Management Service, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-kms-permissions.html">KMS encryption</a> for more information.</p>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
    /// <p>The strategy that determines the order of preference for resources specified in <code>InstanceConfigs</code> used in hyperparameter optimization.</p>
    #[doc(hidden)]
    pub allocation_strategy:
        std::option::Option<crate::model::HyperParameterTuningAllocationStrategy>,
    /// <p>A list containing the configuration(s) for one or more resources for processing hyperparameter jobs. These resources include compute instances and storage volumes to use in model training jobs launched by hyperparameter tuning jobs. The <code>AllocationStrategy</code> controls the order in which multiple configurations provided in <code>InstanceConfigs</code> are used.</p> <note>
    /// <p>If you only want to use a single instance configuration inside the <code>HyperParameterTuningResourceConfig</code> API, do not provide a value for <code>InstanceConfigs</code>. Instead, use <code>InstanceType</code>, <code>VolumeSizeInGB</code> and <code>InstanceCount</code>. If you use <code>InstanceConfigs</code>, do not provide values for <code>InstanceType</code>, <code>VolumeSizeInGB</code> or <code>InstanceCount</code>.</p>
    /// </note>
    #[doc(hidden)]
    pub instance_configs:
        std::option::Option<std::vec::Vec<crate::model::HyperParameterTuningInstanceConfig>>,
}
impl HyperParameterTuningResourceConfig {
    /// <p>The instance type used to run hyperparameter optimization tuning jobs. See <a href="https://docs.aws.amazon.com/notebooks-available-instance-types.html"> descriptions of instance types</a> for more information.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::TrainingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The number of compute instances of type <code>InstanceType</code> to use. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-use-api.html">distributed training</a>, select a value greater than 1.</p>
    pub fn instance_count(&self) -> i32 {
        self.instance_count
    }
    /// <p>The volume size in GB for the storage volume to be used in processing hyperparameter optimization jobs (optional). These volumes store model artifacts, incremental states and optionally, scratch space for training algorithms. Do not provide a value for this parameter if a value for <code>InstanceConfigs</code> is also specified.</p>
    /// <p>Some instance types have a fixed total local storage size. If you select one of these instances for training, <code>VolumeSizeInGB</code> cannot be greater than this total size. For a list of instance types with local instance storage and their sizes, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>.</p> <note>
    /// <p>SageMaker supports only the <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html">General Purpose SSD (gp2)</a> storage volume type.</p>
    /// </note>
    pub fn volume_size_in_gb(&self) -> i32 {
        self.volume_size_in_gb
    }
    /// <p>A key used by Amazon Web Services Key Management Service to encrypt data on the storage volume attached to the compute instances used to run the training job. You can use either of the following formats to specify a key.</p>
    /// <p>KMS Key ID:</p>
    /// <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
    /// <p>Amazon Resource Name (ARN) of a KMS key:</p>
    /// <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
    /// <p>Some instances use local storage, which use a <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">hardware module to encrypt</a> storage volumes. If you choose one of these instance types, you cannot request a <code>VolumeKmsKeyId</code>. For a list of instance types that use local storage, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>. For more information about Amazon Web Services Key Management Service, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-kms-permissions.html">KMS encryption</a> for more information.</p>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
    /// <p>The strategy that determines the order of preference for resources specified in <code>InstanceConfigs</code> used in hyperparameter optimization.</p>
    pub fn allocation_strategy(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningAllocationStrategy> {
        self.allocation_strategy.as_ref()
    }
    /// <p>A list containing the configuration(s) for one or more resources for processing hyperparameter jobs. These resources include compute instances and storage volumes to use in model training jobs launched by hyperparameter tuning jobs. The <code>AllocationStrategy</code> controls the order in which multiple configurations provided in <code>InstanceConfigs</code> are used.</p> <note>
    /// <p>If you only want to use a single instance configuration inside the <code>HyperParameterTuningResourceConfig</code> API, do not provide a value for <code>InstanceConfigs</code>. Instead, use <code>InstanceType</code>, <code>VolumeSizeInGB</code> and <code>InstanceCount</code>. If you use <code>InstanceConfigs</code>, do not provide values for <code>InstanceType</code>, <code>VolumeSizeInGB</code> or <code>InstanceCount</code>.</p>
    /// </note>
    pub fn instance_configs(
        &self,
    ) -> std::option::Option<&[crate::model::HyperParameterTuningInstanceConfig]> {
        self.instance_configs.as_deref()
    }
}
/// See [`HyperParameterTuningResourceConfig`](crate::model::HyperParameterTuningResourceConfig).
pub mod hyper_parameter_tuning_resource_config {

    /// A builder for [`HyperParameterTuningResourceConfig`](crate::model::HyperParameterTuningResourceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::TrainingInstanceType>,
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
        pub(crate) allocation_strategy:
            std::option::Option<crate::model::HyperParameterTuningAllocationStrategy>,
        pub(crate) instance_configs:
            std::option::Option<std::vec::Vec<crate::model::HyperParameterTuningInstanceConfig>>,
    }
    impl Builder {
        /// <p>The instance type used to run hyperparameter optimization tuning jobs. See <a href="https://docs.aws.amazon.com/notebooks-available-instance-types.html"> descriptions of instance types</a> for more information.</p>
        pub fn instance_type(mut self, input: crate::model::TrainingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type used to run hyperparameter optimization tuning jobs. See <a href="https://docs.aws.amazon.com/notebooks-available-instance-types.html"> descriptions of instance types</a> for more information.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::TrainingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The number of compute instances of type <code>InstanceType</code> to use. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-use-api.html">distributed training</a>, select a value greater than 1.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of compute instances of type <code>InstanceType</code> to use. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-use-api.html">distributed training</a>, select a value greater than 1.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>The volume size in GB for the storage volume to be used in processing hyperparameter optimization jobs (optional). These volumes store model artifacts, incremental states and optionally, scratch space for training algorithms. Do not provide a value for this parameter if a value for <code>InstanceConfigs</code> is also specified.</p>
        /// <p>Some instance types have a fixed total local storage size. If you select one of these instances for training, <code>VolumeSizeInGB</code> cannot be greater than this total size. For a list of instance types with local instance storage and their sizes, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>.</p> <note>
        /// <p>SageMaker supports only the <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html">General Purpose SSD (gp2)</a> storage volume type.</p>
        /// </note>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The volume size in GB for the storage volume to be used in processing hyperparameter optimization jobs (optional). These volumes store model artifacts, incremental states and optionally, scratch space for training algorithms. Do not provide a value for this parameter if a value for <code>InstanceConfigs</code> is also specified.</p>
        /// <p>Some instance types have a fixed total local storage size. If you select one of these instances for training, <code>VolumeSizeInGB</code> cannot be greater than this total size. For a list of instance types with local instance storage and their sizes, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>.</p> <note>
        /// <p>SageMaker supports only the <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html">General Purpose SSD (gp2)</a> storage volume type.</p>
        /// </note>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// <p>A key used by Amazon Web Services Key Management Service to encrypt data on the storage volume attached to the compute instances used to run the training job. You can use either of the following formats to specify a key.</p>
        /// <p>KMS Key ID:</p>
        /// <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
        /// <p>Amazon Resource Name (ARN) of a KMS key:</p>
        /// <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
        /// <p>Some instances use local storage, which use a <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">hardware module to encrypt</a> storage volumes. If you choose one of these instance types, you cannot request a <code>VolumeKmsKeyId</code>. For a list of instance types that use local storage, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>. For more information about Amazon Web Services Key Management Service, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-kms-permissions.html">KMS encryption</a> for more information.</p>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>A key used by Amazon Web Services Key Management Service to encrypt data on the storage volume attached to the compute instances used to run the training job. You can use either of the following formats to specify a key.</p>
        /// <p>KMS Key ID:</p>
        /// <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
        /// <p>Amazon Resource Name (ARN) of a KMS key:</p>
        /// <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p>
        /// <p>Some instances use local storage, which use a <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">hardware module to encrypt</a> storage volumes. If you choose one of these instance types, you cannot request a <code>VolumeKmsKeyId</code>. For a list of instance types that use local storage, see <a href="http://aws.amazon.com/releasenotes/host-instance-storage-volumes-table/">instance store volumes</a>. For more information about Amazon Web Services Key Management Service, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-kms-permissions.html">KMS encryption</a> for more information.</p>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// <p>The strategy that determines the order of preference for resources specified in <code>InstanceConfigs</code> used in hyperparameter optimization.</p>
        pub fn allocation_strategy(
            mut self,
            input: crate::model::HyperParameterTuningAllocationStrategy,
        ) -> Self {
            self.allocation_strategy = Some(input);
            self
        }
        /// <p>The strategy that determines the order of preference for resources specified in <code>InstanceConfigs</code> used in hyperparameter optimization.</p>
        pub fn set_allocation_strategy(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningAllocationStrategy>,
        ) -> Self {
            self.allocation_strategy = input;
            self
        }
        /// Appends an item to `instance_configs`.
        ///
        /// To override the contents of this collection use [`set_instance_configs`](Self::set_instance_configs).
        ///
        /// <p>A list containing the configuration(s) for one or more resources for processing hyperparameter jobs. These resources include compute instances and storage volumes to use in model training jobs launched by hyperparameter tuning jobs. The <code>AllocationStrategy</code> controls the order in which multiple configurations provided in <code>InstanceConfigs</code> are used.</p> <note>
        /// <p>If you only want to use a single instance configuration inside the <code>HyperParameterTuningResourceConfig</code> API, do not provide a value for <code>InstanceConfigs</code>. Instead, use <code>InstanceType</code>, <code>VolumeSizeInGB</code> and <code>InstanceCount</code>. If you use <code>InstanceConfigs</code>, do not provide values for <code>InstanceType</code>, <code>VolumeSizeInGB</code> or <code>InstanceCount</code>.</p>
        /// </note>
        pub fn instance_configs(
            mut self,
            input: crate::model::HyperParameterTuningInstanceConfig,
        ) -> Self {
            let mut v = self.instance_configs.unwrap_or_default();
            v.push(input);
            self.instance_configs = Some(v);
            self
        }
        /// <p>A list containing the configuration(s) for one or more resources for processing hyperparameter jobs. These resources include compute instances and storage volumes to use in model training jobs launched by hyperparameter tuning jobs. The <code>AllocationStrategy</code> controls the order in which multiple configurations provided in <code>InstanceConfigs</code> are used.</p> <note>
        /// <p>If you only want to use a single instance configuration inside the <code>HyperParameterTuningResourceConfig</code> API, do not provide a value for <code>InstanceConfigs</code>. Instead, use <code>InstanceType</code>, <code>VolumeSizeInGB</code> and <code>InstanceCount</code>. If you use <code>InstanceConfigs</code>, do not provide values for <code>InstanceType</code>, <code>VolumeSizeInGB</code> or <code>InstanceCount</code>.</p>
        /// </note>
        pub fn set_instance_configs(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::HyperParameterTuningInstanceConfig>,
            >,
        ) -> Self {
            self.instance_configs = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningResourceConfig`](crate::model::HyperParameterTuningResourceConfig).
        pub fn build(self) -> crate::model::HyperParameterTuningResourceConfig {
            crate::model::HyperParameterTuningResourceConfig {
                instance_type: self.instance_type,
                instance_count: self.instance_count.unwrap_or_default(),
                volume_size_in_gb: self.volume_size_in_gb.unwrap_or_default(),
                volume_kms_key_id: self.volume_kms_key_id,
                allocation_strategy: self.allocation_strategy,
                instance_configs: self.instance_configs,
            }
        }
    }
}
impl HyperParameterTuningResourceConfig {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningResourceConfig`](crate::model::HyperParameterTuningResourceConfig).
    pub fn builder() -> crate::model::hyper_parameter_tuning_resource_config::Builder {
        crate::model::hyper_parameter_tuning_resource_config::Builder::default()
    }
}

/// <p>The configuration for hyperparameter tuning resources for use in training jobs launched by the tuning job. These resources include compute instances and storage volumes. Specify one or more compute instance configurations and allocation strategies to select resources (optional).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningInstanceConfig {
    /// <p>The instance type used for processing of hyperparameter optimization jobs. Choose from general purpose (no GPUs) instance types: ml.m5.xlarge, ml.m5.2xlarge, and ml.m5.4xlarge or compute optimized (no GPUs) instance types: ml.c5.xlarge and ml.c5.2xlarge. For more information about instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-available-instance-types.html">instance type descriptions</a>.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::TrainingInstanceType>,
    /// <p>The number of instances of the type specified by <code>InstanceType</code>. Choose an instance count larger than 1 for distributed training algorithms. See <a href="https://docs.aws.amazon.com/data-parallel-use-api.html">SageMaker distributed training jobs</a> for more information.</p>
    #[doc(hidden)]
    pub instance_count: i32,
    /// <p>The volume size in GB of the data to be processed for hyperparameter optimization (optional).</p>
    #[doc(hidden)]
    pub volume_size_in_gb: i32,
}
impl HyperParameterTuningInstanceConfig {
    /// <p>The instance type used for processing of hyperparameter optimization jobs. Choose from general purpose (no GPUs) instance types: ml.m5.xlarge, ml.m5.2xlarge, and ml.m5.4xlarge or compute optimized (no GPUs) instance types: ml.c5.xlarge and ml.c5.2xlarge. For more information about instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-available-instance-types.html">instance type descriptions</a>.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::TrainingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The number of instances of the type specified by <code>InstanceType</code>. Choose an instance count larger than 1 for distributed training algorithms. See <a href="https://docs.aws.amazon.com/data-parallel-use-api.html">SageMaker distributed training jobs</a> for more information.</p>
    pub fn instance_count(&self) -> i32 {
        self.instance_count
    }
    /// <p>The volume size in GB of the data to be processed for hyperparameter optimization (optional).</p>
    pub fn volume_size_in_gb(&self) -> i32 {
        self.volume_size_in_gb
    }
}
/// See [`HyperParameterTuningInstanceConfig`](crate::model::HyperParameterTuningInstanceConfig).
pub mod hyper_parameter_tuning_instance_config {

    /// A builder for [`HyperParameterTuningInstanceConfig`](crate::model::HyperParameterTuningInstanceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::TrainingInstanceType>,
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The instance type used for processing of hyperparameter optimization jobs. Choose from general purpose (no GPUs) instance types: ml.m5.xlarge, ml.m5.2xlarge, and ml.m5.4xlarge or compute optimized (no GPUs) instance types: ml.c5.xlarge and ml.c5.2xlarge. For more information about instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-available-instance-types.html">instance type descriptions</a>.</p>
        pub fn instance_type(mut self, input: crate::model::TrainingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type used for processing of hyperparameter optimization jobs. Choose from general purpose (no GPUs) instance types: ml.m5.xlarge, ml.m5.2xlarge, and ml.m5.4xlarge or compute optimized (no GPUs) instance types: ml.c5.xlarge and ml.c5.2xlarge. For more information about instance types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-available-instance-types.html">instance type descriptions</a>.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::TrainingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The number of instances of the type specified by <code>InstanceType</code>. Choose an instance count larger than 1 for distributed training algorithms. See <a href="https://docs.aws.amazon.com/data-parallel-use-api.html">SageMaker distributed training jobs</a> for more information.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of instances of the type specified by <code>InstanceType</code>. Choose an instance count larger than 1 for distributed training algorithms. See <a href="https://docs.aws.amazon.com/data-parallel-use-api.html">SageMaker distributed training jobs</a> for more information.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>The volume size in GB of the data to be processed for hyperparameter optimization (optional).</p>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The volume size in GB of the data to be processed for hyperparameter optimization (optional).</p>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningInstanceConfig`](crate::model::HyperParameterTuningInstanceConfig).
        pub fn build(self) -> crate::model::HyperParameterTuningInstanceConfig {
            crate::model::HyperParameterTuningInstanceConfig {
                instance_type: self.instance_type,
                instance_count: self.instance_count.unwrap_or_default(),
                volume_size_in_gb: self.volume_size_in_gb.unwrap_or_default(),
            }
        }
    }
}
impl HyperParameterTuningInstanceConfig {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningInstanceConfig`](crate::model::HyperParameterTuningInstanceConfig).
    pub fn builder() -> crate::model::hyper_parameter_tuning_instance_config::Builder {
        crate::model::hyper_parameter_tuning_instance_config::Builder::default()
    }
}

/// When writing a match expression against `TrainingInstanceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let traininginstancetype = unimplemented!();
/// match traininginstancetype {
///     TrainingInstanceType::MlC42Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC44Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC48Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC4Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC518Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC52Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC54Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC59Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC5Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC5N18Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC5N2Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC5N4Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC5N9Xlarge => { /* ... */ },
///     TrainingInstanceType::MlC5NXlarge => { /* ... */ },
///     TrainingInstanceType::MlG4Dn12Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG4Dn16Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG4Dn2Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG4Dn4Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG4Dn8Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG4DnXlarge => { /* ... */ },
///     TrainingInstanceType::MlG512Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG516Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG524Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG52Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG548Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG54Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG58Xlarge => { /* ... */ },
///     TrainingInstanceType::MlG5Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM410Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM416Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM42Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM44Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM4Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM512Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM524Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM52Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM54Xlarge => { /* ... */ },
///     TrainingInstanceType::MlM5Large => { /* ... */ },
///     TrainingInstanceType::MlM5Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP216Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP28Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP2Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP316Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP32Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP38Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP3Dn24Xlarge => { /* ... */ },
///     TrainingInstanceType::MlP4D24Xlarge => { /* ... */ },
///     TrainingInstanceType::MlTrn12Xlarge => { /* ... */ },
///     TrainingInstanceType::MlTrn132Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `traininginstancetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrainingInstanceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrainingInstanceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrainingInstanceType::NewFeature` is defined.
/// Specifically, when `traininginstancetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrainingInstanceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrainingInstanceType {
    #[allow(missing_docs)] // documentation missing in model
    MlC42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC48Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC518Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC59Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5N18Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5N2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5N4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5N9Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlC5NXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn16Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn8Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG4DnXlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG516Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG548Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG58Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlG5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM410Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM416Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM42Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM44Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM4Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM512Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM524Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM52Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM54Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Large,
    #[allow(missing_docs)] // documentation missing in model
    MlM5Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP216Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP28Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP2Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP316Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP32Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP38Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP3Dn24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlP4D24Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlTrn12Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlTrn132Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrainingInstanceType {
    fn from(s: &str) -> Self {
        match s {
            "ml.c4.2xlarge" => TrainingInstanceType::MlC42Xlarge,
            "ml.c4.4xlarge" => TrainingInstanceType::MlC44Xlarge,
            "ml.c4.8xlarge" => TrainingInstanceType::MlC48Xlarge,
            "ml.c4.xlarge" => TrainingInstanceType::MlC4Xlarge,
            "ml.c5.18xlarge" => TrainingInstanceType::MlC518Xlarge,
            "ml.c5.2xlarge" => TrainingInstanceType::MlC52Xlarge,
            "ml.c5.4xlarge" => TrainingInstanceType::MlC54Xlarge,
            "ml.c5.9xlarge" => TrainingInstanceType::MlC59Xlarge,
            "ml.c5.xlarge" => TrainingInstanceType::MlC5Xlarge,
            "ml.c5n.18xlarge" => TrainingInstanceType::MlC5N18Xlarge,
            "ml.c5n.2xlarge" => TrainingInstanceType::MlC5N2Xlarge,
            "ml.c5n.4xlarge" => TrainingInstanceType::MlC5N4Xlarge,
            "ml.c5n.9xlarge" => TrainingInstanceType::MlC5N9Xlarge,
            "ml.c5n.xlarge" => TrainingInstanceType::MlC5NXlarge,
            "ml.g4dn.12xlarge" => TrainingInstanceType::MlG4Dn12Xlarge,
            "ml.g4dn.16xlarge" => TrainingInstanceType::MlG4Dn16Xlarge,
            "ml.g4dn.2xlarge" => TrainingInstanceType::MlG4Dn2Xlarge,
            "ml.g4dn.4xlarge" => TrainingInstanceType::MlG4Dn4Xlarge,
            "ml.g4dn.8xlarge" => TrainingInstanceType::MlG4Dn8Xlarge,
            "ml.g4dn.xlarge" => TrainingInstanceType::MlG4DnXlarge,
            "ml.g5.12xlarge" => TrainingInstanceType::MlG512Xlarge,
            "ml.g5.16xlarge" => TrainingInstanceType::MlG516Xlarge,
            "ml.g5.24xlarge" => TrainingInstanceType::MlG524Xlarge,
            "ml.g5.2xlarge" => TrainingInstanceType::MlG52Xlarge,
            "ml.g5.48xlarge" => TrainingInstanceType::MlG548Xlarge,
            "ml.g5.4xlarge" => TrainingInstanceType::MlG54Xlarge,
            "ml.g5.8xlarge" => TrainingInstanceType::MlG58Xlarge,
            "ml.g5.xlarge" => TrainingInstanceType::MlG5Xlarge,
            "ml.m4.10xlarge" => TrainingInstanceType::MlM410Xlarge,
            "ml.m4.16xlarge" => TrainingInstanceType::MlM416Xlarge,
            "ml.m4.2xlarge" => TrainingInstanceType::MlM42Xlarge,
            "ml.m4.4xlarge" => TrainingInstanceType::MlM44Xlarge,
            "ml.m4.xlarge" => TrainingInstanceType::MlM4Xlarge,
            "ml.m5.12xlarge" => TrainingInstanceType::MlM512Xlarge,
            "ml.m5.24xlarge" => TrainingInstanceType::MlM524Xlarge,
            "ml.m5.2xlarge" => TrainingInstanceType::MlM52Xlarge,
            "ml.m5.4xlarge" => TrainingInstanceType::MlM54Xlarge,
            "ml.m5.large" => TrainingInstanceType::MlM5Large,
            "ml.m5.xlarge" => TrainingInstanceType::MlM5Xlarge,
            "ml.p2.16xlarge" => TrainingInstanceType::MlP216Xlarge,
            "ml.p2.8xlarge" => TrainingInstanceType::MlP28Xlarge,
            "ml.p2.xlarge" => TrainingInstanceType::MlP2Xlarge,
            "ml.p3.16xlarge" => TrainingInstanceType::MlP316Xlarge,
            "ml.p3.2xlarge" => TrainingInstanceType::MlP32Xlarge,
            "ml.p3.8xlarge" => TrainingInstanceType::MlP38Xlarge,
            "ml.p3dn.24xlarge" => TrainingInstanceType::MlP3Dn24Xlarge,
            "ml.p4d.24xlarge" => TrainingInstanceType::MlP4D24Xlarge,
            "ml.trn1.2xlarge" => TrainingInstanceType::MlTrn12Xlarge,
            "ml.trn1.32xlarge" => TrainingInstanceType::MlTrn132Xlarge,
            other => {
                TrainingInstanceType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for TrainingInstanceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrainingInstanceType::from(s))
    }
}
impl TrainingInstanceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrainingInstanceType::MlC42Xlarge => "ml.c4.2xlarge",
            TrainingInstanceType::MlC44Xlarge => "ml.c4.4xlarge",
            TrainingInstanceType::MlC48Xlarge => "ml.c4.8xlarge",
            TrainingInstanceType::MlC4Xlarge => "ml.c4.xlarge",
            TrainingInstanceType::MlC518Xlarge => "ml.c5.18xlarge",
            TrainingInstanceType::MlC52Xlarge => "ml.c5.2xlarge",
            TrainingInstanceType::MlC54Xlarge => "ml.c5.4xlarge",
            TrainingInstanceType::MlC59Xlarge => "ml.c5.9xlarge",
            TrainingInstanceType::MlC5Xlarge => "ml.c5.xlarge",
            TrainingInstanceType::MlC5N18Xlarge => "ml.c5n.18xlarge",
            TrainingInstanceType::MlC5N2Xlarge => "ml.c5n.2xlarge",
            TrainingInstanceType::MlC5N4Xlarge => "ml.c5n.4xlarge",
            TrainingInstanceType::MlC5N9Xlarge => "ml.c5n.9xlarge",
            TrainingInstanceType::MlC5NXlarge => "ml.c5n.xlarge",
            TrainingInstanceType::MlG4Dn12Xlarge => "ml.g4dn.12xlarge",
            TrainingInstanceType::MlG4Dn16Xlarge => "ml.g4dn.16xlarge",
            TrainingInstanceType::MlG4Dn2Xlarge => "ml.g4dn.2xlarge",
            TrainingInstanceType::MlG4Dn4Xlarge => "ml.g4dn.4xlarge",
            TrainingInstanceType::MlG4Dn8Xlarge => "ml.g4dn.8xlarge",
            TrainingInstanceType::MlG4DnXlarge => "ml.g4dn.xlarge",
            TrainingInstanceType::MlG512Xlarge => "ml.g5.12xlarge",
            TrainingInstanceType::MlG516Xlarge => "ml.g5.16xlarge",
            TrainingInstanceType::MlG524Xlarge => "ml.g5.24xlarge",
            TrainingInstanceType::MlG52Xlarge => "ml.g5.2xlarge",
            TrainingInstanceType::MlG548Xlarge => "ml.g5.48xlarge",
            TrainingInstanceType::MlG54Xlarge => "ml.g5.4xlarge",
            TrainingInstanceType::MlG58Xlarge => "ml.g5.8xlarge",
            TrainingInstanceType::MlG5Xlarge => "ml.g5.xlarge",
            TrainingInstanceType::MlM410Xlarge => "ml.m4.10xlarge",
            TrainingInstanceType::MlM416Xlarge => "ml.m4.16xlarge",
            TrainingInstanceType::MlM42Xlarge => "ml.m4.2xlarge",
            TrainingInstanceType::MlM44Xlarge => "ml.m4.4xlarge",
            TrainingInstanceType::MlM4Xlarge => "ml.m4.xlarge",
            TrainingInstanceType::MlM512Xlarge => "ml.m5.12xlarge",
            TrainingInstanceType::MlM524Xlarge => "ml.m5.24xlarge",
            TrainingInstanceType::MlM52Xlarge => "ml.m5.2xlarge",
            TrainingInstanceType::MlM54Xlarge => "ml.m5.4xlarge",
            TrainingInstanceType::MlM5Large => "ml.m5.large",
            TrainingInstanceType::MlM5Xlarge => "ml.m5.xlarge",
            TrainingInstanceType::MlP216Xlarge => "ml.p2.16xlarge",
            TrainingInstanceType::MlP28Xlarge => "ml.p2.8xlarge",
            TrainingInstanceType::MlP2Xlarge => "ml.p2.xlarge",
            TrainingInstanceType::MlP316Xlarge => "ml.p3.16xlarge",
            TrainingInstanceType::MlP32Xlarge => "ml.p3.2xlarge",
            TrainingInstanceType::MlP38Xlarge => "ml.p3.8xlarge",
            TrainingInstanceType::MlP3Dn24Xlarge => "ml.p3dn.24xlarge",
            TrainingInstanceType::MlP4D24Xlarge => "ml.p4d.24xlarge",
            TrainingInstanceType::MlTrn12Xlarge => "ml.trn1.2xlarge",
            TrainingInstanceType::MlTrn132Xlarge => "ml.trn1.32xlarge",
            TrainingInstanceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.c4.2xlarge",
            "ml.c4.4xlarge",
            "ml.c4.8xlarge",
            "ml.c4.xlarge",
            "ml.c5.18xlarge",
            "ml.c5.2xlarge",
            "ml.c5.4xlarge",
            "ml.c5.9xlarge",
            "ml.c5.xlarge",
            "ml.c5n.18xlarge",
            "ml.c5n.2xlarge",
            "ml.c5n.4xlarge",
            "ml.c5n.9xlarge",
            "ml.c5n.xlarge",
            "ml.g4dn.12xlarge",
            "ml.g4dn.16xlarge",
            "ml.g4dn.2xlarge",
            "ml.g4dn.4xlarge",
            "ml.g4dn.8xlarge",
            "ml.g4dn.xlarge",
            "ml.g5.12xlarge",
            "ml.g5.16xlarge",
            "ml.g5.24xlarge",
            "ml.g5.2xlarge",
            "ml.g5.48xlarge",
            "ml.g5.4xlarge",
            "ml.g5.8xlarge",
            "ml.g5.xlarge",
            "ml.m4.10xlarge",
            "ml.m4.16xlarge",
            "ml.m4.2xlarge",
            "ml.m4.4xlarge",
            "ml.m4.xlarge",
            "ml.m5.12xlarge",
            "ml.m5.24xlarge",
            "ml.m5.2xlarge",
            "ml.m5.4xlarge",
            "ml.m5.large",
            "ml.m5.xlarge",
            "ml.p2.16xlarge",
            "ml.p2.8xlarge",
            "ml.p2.xlarge",
            "ml.p3.16xlarge",
            "ml.p3.2xlarge",
            "ml.p3.8xlarge",
            "ml.p3dn.24xlarge",
            "ml.p4d.24xlarge",
            "ml.trn1.2xlarge",
            "ml.trn1.32xlarge",
        ]
    }
}
impl AsRef<str> for TrainingInstanceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `HyperParameterTuningAllocationStrategy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparametertuningallocationstrategy = unimplemented!();
/// match hyperparametertuningallocationstrategy {
///     HyperParameterTuningAllocationStrategy::Prioritized => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparametertuningallocationstrategy` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterTuningAllocationStrategy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterTuningAllocationStrategy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterTuningAllocationStrategy::NewFeature` is defined.
/// Specifically, when `hyperparametertuningallocationstrategy` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterTuningAllocationStrategy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterTuningAllocationStrategy {
    #[allow(missing_docs)] // documentation missing in model
    Prioritized,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterTuningAllocationStrategy {
    fn from(s: &str) -> Self {
        match s {
            "Prioritized" => HyperParameterTuningAllocationStrategy::Prioritized,
            other => HyperParameterTuningAllocationStrategy::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for HyperParameterTuningAllocationStrategy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterTuningAllocationStrategy::from(s))
    }
}
impl HyperParameterTuningAllocationStrategy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterTuningAllocationStrategy::Prioritized => "Prioritized",
            HyperParameterTuningAllocationStrategy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Prioritized"]
    }
}
impl AsRef<str> for HyperParameterTuningAllocationStrategy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The retry strategy to use when a training job fails due to an <code>InternalServerError</code>. <code>RetryStrategy</code> is specified as part of the <code>CreateTrainingJob</code> and <code>CreateHyperParameterTuningJob</code> requests. You can add the <code>StoppingCondition</code> parameter to the request to limit the training time for the complete job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RetryStrategy {
    /// <p>The number of times to retry the job. When the job is retried, it's <code>SecondaryStatus</code> is changed to <code>STARTING</code>.</p>
    #[doc(hidden)]
    pub maximum_retry_attempts: i32,
}
impl RetryStrategy {
    /// <p>The number of times to retry the job. When the job is retried, it's <code>SecondaryStatus</code> is changed to <code>STARTING</code>.</p>
    pub fn maximum_retry_attempts(&self) -> i32 {
        self.maximum_retry_attempts
    }
}
/// See [`RetryStrategy`](crate::model::RetryStrategy).
pub mod retry_strategy {

    /// A builder for [`RetryStrategy`](crate::model::RetryStrategy).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) maximum_retry_attempts: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The number of times to retry the job. When the job is retried, it's <code>SecondaryStatus</code> is changed to <code>STARTING</code>.</p>
        pub fn maximum_retry_attempts(mut self, input: i32) -> Self {
            self.maximum_retry_attempts = Some(input);
            self
        }
        /// <p>The number of times to retry the job. When the job is retried, it's <code>SecondaryStatus</code> is changed to <code>STARTING</code>.</p>
        pub fn set_maximum_retry_attempts(mut self, input: std::option::Option<i32>) -> Self {
            self.maximum_retry_attempts = input;
            self
        }
        /// Consumes the builder and constructs a [`RetryStrategy`](crate::model::RetryStrategy).
        pub fn build(self) -> crate::model::RetryStrategy {
            crate::model::RetryStrategy {
                maximum_retry_attempts: self.maximum_retry_attempts.unwrap_or_default(),
            }
        }
    }
}
impl RetryStrategy {
    /// Creates a new builder-style object to manufacture [`RetryStrategy`](crate::model::RetryStrategy).
    pub fn builder() -> crate::model::retry_strategy::Builder {
        crate::model::retry_strategy::Builder::default()
    }
}

/// <p>Contains information about the output location for managed spot training checkpoint data. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CheckpointConfig {
    /// <p>Identifies the S3 path where you want SageMaker to store checkpoints. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>(Optional) The local directory where checkpoints are written. The default directory is <code>/opt/ml/checkpoints/</code>. </p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
}
impl CheckpointConfig {
    /// <p>Identifies the S3 path where you want SageMaker to store checkpoints. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>(Optional) The local directory where checkpoints are written. The default directory is <code>/opt/ml/checkpoints/</code>. </p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
}
/// See [`CheckpointConfig`](crate::model::CheckpointConfig).
pub mod checkpoint_config {

    /// A builder for [`CheckpointConfig`](crate::model::CheckpointConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Identifies the S3 path where you want SageMaker to store checkpoints. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>Identifies the S3 path where you want SageMaker to store checkpoints. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>(Optional) The local directory where checkpoints are written. The default directory is <code>/opt/ml/checkpoints/</code>. </p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>(Optional) The local directory where checkpoints are written. The default directory is <code>/opt/ml/checkpoints/</code>. </p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// Consumes the builder and constructs a [`CheckpointConfig`](crate::model::CheckpointConfig).
        pub fn build(self) -> crate::model::CheckpointConfig {
            crate::model::CheckpointConfig {
                s3_uri: self.s3_uri,
                local_path: self.local_path,
            }
        }
    }
}
impl CheckpointConfig {
    /// Creates a new builder-style object to manufacture [`CheckpointConfig`](crate::model::CheckpointConfig).
    pub fn builder() -> crate::model::checkpoint_config::Builder {
        crate::model::checkpoint_config::Builder::default()
    }
}

/// <p>Specifies a limit to how long a model training job or model compilation job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training or compilation job. Use this API to cap model training costs.</p>
/// <p>To stop a training job, SageMaker sends the algorithm the <code>SIGTERM</code> signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost. </p>
/// <p>The training algorithms provided by SageMaker automatically save the intermediate results of a model training job when possible. This attempt to save artifacts is only a best effort case as model might not be in a state from which it can be saved. For example, if training has just started, the model might not be ready to save. When saved, this intermediate data is a valid model artifact. You can use it to create a model with <code>CreateModel</code>.</p> <note>
/// <p>The Neural Topic Model (NTM) currently does not support saving intermediate model artifacts. When training NTMs, make sure that the maximum runtime is sufficient for the training job to complete.</p>
/// </note>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct StoppingCondition {
    /// <p>The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.</p>
    /// <p>For compilation jobs, if the job does not complete during this time, a <code>TimeOut</code> error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.</p>
    /// <p>For all other jobs, if the job does not complete during this time, SageMaker ends the job. When <code>RetryStrategy</code> is specified in the job request, <code>MaxRuntimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.</p>
    /// <p>The maximum time that a <code>TrainingJob</code> can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days.</p>
    #[doc(hidden)]
    pub max_runtime_in_seconds: i32,
    /// <p>The maximum length of time, in seconds, that a managed Spot training job has to complete. It is the amount of time spent waiting for Spot capacity plus the amount of time the job can run. It must be equal to or greater than <code>MaxRuntimeInSeconds</code>. If the job does not complete during this time, SageMaker ends the job.</p>
    /// <p>When <code>RetryStrategy</code> is specified in the job request, <code>MaxWaitTimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt.</p>
    #[doc(hidden)]
    pub max_wait_time_in_seconds: std::option::Option<i32>,
}
impl StoppingCondition {
    /// <p>The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.</p>
    /// <p>For compilation jobs, if the job does not complete during this time, a <code>TimeOut</code> error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.</p>
    /// <p>For all other jobs, if the job does not complete during this time, SageMaker ends the job. When <code>RetryStrategy</code> is specified in the job request, <code>MaxRuntimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.</p>
    /// <p>The maximum time that a <code>TrainingJob</code> can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days.</p>
    pub fn max_runtime_in_seconds(&self) -> i32 {
        self.max_runtime_in_seconds
    }
    /// <p>The maximum length of time, in seconds, that a managed Spot training job has to complete. It is the amount of time spent waiting for Spot capacity plus the amount of time the job can run. It must be equal to or greater than <code>MaxRuntimeInSeconds</code>. If the job does not complete during this time, SageMaker ends the job.</p>
    /// <p>When <code>RetryStrategy</code> is specified in the job request, <code>MaxWaitTimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt.</p>
    pub fn max_wait_time_in_seconds(&self) -> std::option::Option<i32> {
        self.max_wait_time_in_seconds
    }
}
/// See [`StoppingCondition`](crate::model::StoppingCondition).
pub mod stopping_condition {

    /// A builder for [`StoppingCondition`](crate::model::StoppingCondition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_runtime_in_seconds: std::option::Option<i32>,
        pub(crate) max_wait_time_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.</p>
        /// <p>For compilation jobs, if the job does not complete during this time, a <code>TimeOut</code> error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.</p>
        /// <p>For all other jobs, if the job does not complete during this time, SageMaker ends the job. When <code>RetryStrategy</code> is specified in the job request, <code>MaxRuntimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.</p>
        /// <p>The maximum time that a <code>TrainingJob</code> can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days.</p>
        pub fn max_runtime_in_seconds(mut self, input: i32) -> Self {
            self.max_runtime_in_seconds = Some(input);
            self
        }
        /// <p>The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.</p>
        /// <p>For compilation jobs, if the job does not complete during this time, a <code>TimeOut</code> error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.</p>
        /// <p>For all other jobs, if the job does not complete during this time, SageMaker ends the job. When <code>RetryStrategy</code> is specified in the job request, <code>MaxRuntimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.</p>
        /// <p>The maximum time that a <code>TrainingJob</code> can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days.</p>
        pub fn set_max_runtime_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.max_runtime_in_seconds = input;
            self
        }
        /// <p>The maximum length of time, in seconds, that a managed Spot training job has to complete. It is the amount of time spent waiting for Spot capacity plus the amount of time the job can run. It must be equal to or greater than <code>MaxRuntimeInSeconds</code>. If the job does not complete during this time, SageMaker ends the job.</p>
        /// <p>When <code>RetryStrategy</code> is specified in the job request, <code>MaxWaitTimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt.</p>
        pub fn max_wait_time_in_seconds(mut self, input: i32) -> Self {
            self.max_wait_time_in_seconds = Some(input);
            self
        }
        /// <p>The maximum length of time, in seconds, that a managed Spot training job has to complete. It is the amount of time spent waiting for Spot capacity plus the amount of time the job can run. It must be equal to or greater than <code>MaxRuntimeInSeconds</code>. If the job does not complete during this time, SageMaker ends the job.</p>
        /// <p>When <code>RetryStrategy</code> is specified in the job request, <code>MaxWaitTimeInSeconds</code> specifies the maximum time for all of the attempts in total, not each individual attempt.</p>
        pub fn set_max_wait_time_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.max_wait_time_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`StoppingCondition`](crate::model::StoppingCondition).
        pub fn build(self) -> crate::model::StoppingCondition {
            crate::model::StoppingCondition {
                max_runtime_in_seconds: self.max_runtime_in_seconds.unwrap_or_default(),
                max_wait_time_in_seconds: self.max_wait_time_in_seconds,
            }
        }
    }
}
impl StoppingCondition {
    /// Creates a new builder-style object to manufacture [`StoppingCondition`](crate::model::StoppingCondition).
    pub fn builder() -> crate::model::stopping_condition::Builder {
        crate::model::stopping_condition::Builder::default()
    }
}

/// <p>Describes the resources, including machine learning (ML) compute instances and ML storage volumes, to use for model training. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ResourceConfig {
    /// <p>The ML compute instance type. </p> <note>
    /// <p>SageMaker Training on Amazon Elastic Compute Cloud (EC2) P4de instances is in preview release starting December 9th, 2022. </p>
    /// <p> <a href="http://aws.amazon.com/ec2/instance-types/p4/">Amazon EC2 P4de instances</a> (currently in preview) are powered by 8 NVIDIA A100 GPUs with 80GB high-performance HBM2e GPU memory, which accelerate the speed of training ML models that need to be trained on large datasets of high-resolution data. In this preview release, Amazon SageMaker supports ML training jobs on P4de instances (<code>ml.p4de.24xlarge</code>) to reduce model training time. The <code>ml.p4de.24xlarge</code> instances are available in the following Amazon Web Services Regions. </p>
    /// <ul>
    /// <li> <p>US East (N. Virginia) (us-east-1)</p> </li>
    /// <li> <p>US West (Oregon) (us-west-2)</p> </li>
    /// </ul>
    /// <p>To request quota limit increase and start using P4de instances, contact the SageMaker Training service team through your account team.</p>
    /// </note>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::TrainingInstanceType>,
    /// <p>The number of ML compute instances to use. For distributed training, provide a value greater than 1. </p>
    #[doc(hidden)]
    pub instance_count: i32,
    /// <p>The size of the ML storage volume that you want to provision. </p>
    /// <p>ML storage volumes store model artifacts and incremental states. Training algorithms might also use the ML storage volume for scratch space. If you want to store the training data in the ML storage volume, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. </p>
    /// <p>When using an ML instance with <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#nvme-ssd-volumes">NVMe SSD volumes</a>, SageMaker doesn't provision Amazon EBS General Purpose SSD (gp2) storage. Available storage is fixed to the NVMe-type instance's storage capacity. SageMaker configures storage paths for training datasets, checkpoints, model artifacts, and outputs to use the entire capacity of the instance storage. For example, ML instance families with the NVMe-type instance storage include <code>ml.p4d</code>, <code>ml.g4dn</code>, and <code>ml.g5</code>. </p>
    /// <p>When using an ML instance with the EBS-only storage option and without instance storage, you must define the size of EBS volume through <code>VolumeSizeInGB</code> in the <code>ResourceConfig</code> API. For example, ML instance families that use EBS volumes include <code>ml.c5</code> and <code>ml.p2</code>. </p>
    /// <p>To look up instance types and their instance storage types and volumes, see <a href="http://aws.amazon.com/ec2/instance-types/">Amazon EC2 Instance Types</a>.</p>
    /// <p>To find the default local paths defined by the SageMaker training platform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-train-storage.html">Amazon SageMaker Training Storage Folders for Training Datasets, Checkpoints, Model Artifacts, and Outputs</a>.</p>
    #[doc(hidden)]
    pub volume_size_in_gb: i32,
    /// <p>The Amazon Web Services KMS key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training job.</p> <note>
    /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
    /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
    /// </note>
    /// <p>The <code>VolumeKmsKeyId</code> can be in any of the following formats:</p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
    /// <p>The configuration of a heterogeneous cluster in JSON format.</p>
    #[doc(hidden)]
    pub instance_groups: std::option::Option<std::vec::Vec<crate::model::InstanceGroup>>,
    /// <p>The duration of time in seconds to retain configured resources in a warm pool for subsequent training jobs.</p>
    #[doc(hidden)]
    pub keep_alive_period_in_seconds: std::option::Option<i32>,
}
impl ResourceConfig {
    /// <p>The ML compute instance type. </p> <note>
    /// <p>SageMaker Training on Amazon Elastic Compute Cloud (EC2) P4de instances is in preview release starting December 9th, 2022. </p>
    /// <p> <a href="http://aws.amazon.com/ec2/instance-types/p4/">Amazon EC2 P4de instances</a> (currently in preview) are powered by 8 NVIDIA A100 GPUs with 80GB high-performance HBM2e GPU memory, which accelerate the speed of training ML models that need to be trained on large datasets of high-resolution data. In this preview release, Amazon SageMaker supports ML training jobs on P4de instances (<code>ml.p4de.24xlarge</code>) to reduce model training time. The <code>ml.p4de.24xlarge</code> instances are available in the following Amazon Web Services Regions. </p>
    /// <ul>
    /// <li> <p>US East (N. Virginia) (us-east-1)</p> </li>
    /// <li> <p>US West (Oregon) (us-west-2)</p> </li>
    /// </ul>
    /// <p>To request quota limit increase and start using P4de instances, contact the SageMaker Training service team through your account team.</p>
    /// </note>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::TrainingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The number of ML compute instances to use. For distributed training, provide a value greater than 1. </p>
    pub fn instance_count(&self) -> i32 {
        self.instance_count
    }
    /// <p>The size of the ML storage volume that you want to provision. </p>
    /// <p>ML storage volumes store model artifacts and incremental states. Training algorithms might also use the ML storage volume for scratch space. If you want to store the training data in the ML storage volume, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. </p>
    /// <p>When using an ML instance with <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#nvme-ssd-volumes">NVMe SSD volumes</a>, SageMaker doesn't provision Amazon EBS General Purpose SSD (gp2) storage. Available storage is fixed to the NVMe-type instance's storage capacity. SageMaker configures storage paths for training datasets, checkpoints, model artifacts, and outputs to use the entire capacity of the instance storage. For example, ML instance families with the NVMe-type instance storage include <code>ml.p4d</code>, <code>ml.g4dn</code>, and <code>ml.g5</code>. </p>
    /// <p>When using an ML instance with the EBS-only storage option and without instance storage, you must define the size of EBS volume through <code>VolumeSizeInGB</code> in the <code>ResourceConfig</code> API. For example, ML instance families that use EBS volumes include <code>ml.c5</code> and <code>ml.p2</code>. </p>
    /// <p>To look up instance types and their instance storage types and volumes, see <a href="http://aws.amazon.com/ec2/instance-types/">Amazon EC2 Instance Types</a>.</p>
    /// <p>To find the default local paths defined by the SageMaker training platform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-train-storage.html">Amazon SageMaker Training Storage Folders for Training Datasets, Checkpoints, Model Artifacts, and Outputs</a>.</p>
    pub fn volume_size_in_gb(&self) -> i32 {
        self.volume_size_in_gb
    }
    /// <p>The Amazon Web Services KMS key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training job.</p> <note>
    /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
    /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
    /// </note>
    /// <p>The <code>VolumeKmsKeyId</code> can be in any of the following formats:</p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// </ul>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
    /// <p>The configuration of a heterogeneous cluster in JSON format.</p>
    pub fn instance_groups(&self) -> std::option::Option<&[crate::model::InstanceGroup]> {
        self.instance_groups.as_deref()
    }
    /// <p>The duration of time in seconds to retain configured resources in a warm pool for subsequent training jobs.</p>
    pub fn keep_alive_period_in_seconds(&self) -> std::option::Option<i32> {
        self.keep_alive_period_in_seconds
    }
}
/// See [`ResourceConfig`](crate::model::ResourceConfig).
pub mod resource_config {

    /// A builder for [`ResourceConfig`](crate::model::ResourceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::TrainingInstanceType>,
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
        pub(crate) instance_groups: std::option::Option<std::vec::Vec<crate::model::InstanceGroup>>,
        pub(crate) keep_alive_period_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The ML compute instance type. </p> <note>
        /// <p>SageMaker Training on Amazon Elastic Compute Cloud (EC2) P4de instances is in preview release starting December 9th, 2022. </p>
        /// <p> <a href="http://aws.amazon.com/ec2/instance-types/p4/">Amazon EC2 P4de instances</a> (currently in preview) are powered by 8 NVIDIA A100 GPUs with 80GB high-performance HBM2e GPU memory, which accelerate the speed of training ML models that need to be trained on large datasets of high-resolution data. In this preview release, Amazon SageMaker supports ML training jobs on P4de instances (<code>ml.p4de.24xlarge</code>) to reduce model training time. The <code>ml.p4de.24xlarge</code> instances are available in the following Amazon Web Services Regions. </p>
        /// <ul>
        /// <li> <p>US East (N. Virginia) (us-east-1)</p> </li>
        /// <li> <p>US West (Oregon) (us-west-2)</p> </li>
        /// </ul>
        /// <p>To request quota limit increase and start using P4de instances, contact the SageMaker Training service team through your account team.</p>
        /// </note>
        pub fn instance_type(mut self, input: crate::model::TrainingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The ML compute instance type. </p> <note>
        /// <p>SageMaker Training on Amazon Elastic Compute Cloud (EC2) P4de instances is in preview release starting December 9th, 2022. </p>
        /// <p> <a href="http://aws.amazon.com/ec2/instance-types/p4/">Amazon EC2 P4de instances</a> (currently in preview) are powered by 8 NVIDIA A100 GPUs with 80GB high-performance HBM2e GPU memory, which accelerate the speed of training ML models that need to be trained on large datasets of high-resolution data. In this preview release, Amazon SageMaker supports ML training jobs on P4de instances (<code>ml.p4de.24xlarge</code>) to reduce model training time. The <code>ml.p4de.24xlarge</code> instances are available in the following Amazon Web Services Regions. </p>
        /// <ul>
        /// <li> <p>US East (N. Virginia) (us-east-1)</p> </li>
        /// <li> <p>US West (Oregon) (us-west-2)</p> </li>
        /// </ul>
        /// <p>To request quota limit increase and start using P4de instances, contact the SageMaker Training service team through your account team.</p>
        /// </note>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::TrainingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The number of ML compute instances to use. For distributed training, provide a value greater than 1. </p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of ML compute instances to use. For distributed training, provide a value greater than 1. </p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>The size of the ML storage volume that you want to provision. </p>
        /// <p>ML storage volumes store model artifacts and incremental states. Training algorithms might also use the ML storage volume for scratch space. If you want to store the training data in the ML storage volume, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. </p>
        /// <p>When using an ML instance with <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#nvme-ssd-volumes">NVMe SSD volumes</a>, SageMaker doesn't provision Amazon EBS General Purpose SSD (gp2) storage. Available storage is fixed to the NVMe-type instance's storage capacity. SageMaker configures storage paths for training datasets, checkpoints, model artifacts, and outputs to use the entire capacity of the instance storage. For example, ML instance families with the NVMe-type instance storage include <code>ml.p4d</code>, <code>ml.g4dn</code>, and <code>ml.g5</code>. </p>
        /// <p>When using an ML instance with the EBS-only storage option and without instance storage, you must define the size of EBS volume through <code>VolumeSizeInGB</code> in the <code>ResourceConfig</code> API. For example, ML instance families that use EBS volumes include <code>ml.c5</code> and <code>ml.p2</code>. </p>
        /// <p>To look up instance types and their instance storage types and volumes, see <a href="http://aws.amazon.com/ec2/instance-types/">Amazon EC2 Instance Types</a>.</p>
        /// <p>To find the default local paths defined by the SageMaker training platform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-train-storage.html">Amazon SageMaker Training Storage Folders for Training Datasets, Checkpoints, Model Artifacts, and Outputs</a>.</p>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The size of the ML storage volume that you want to provision. </p>
        /// <p>ML storage volumes store model artifacts and incremental states. Training algorithms might also use the ML storage volume for scratch space. If you want to store the training data in the ML storage volume, choose <code>File</code> as the <code>TrainingInputMode</code> in the algorithm specification. </p>
        /// <p>When using an ML instance with <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#nvme-ssd-volumes">NVMe SSD volumes</a>, SageMaker doesn't provision Amazon EBS General Purpose SSD (gp2) storage. Available storage is fixed to the NVMe-type instance's storage capacity. SageMaker configures storage paths for training datasets, checkpoints, model artifacts, and outputs to use the entire capacity of the instance storage. For example, ML instance families with the NVMe-type instance storage include <code>ml.p4d</code>, <code>ml.g4dn</code>, and <code>ml.g5</code>. </p>
        /// <p>When using an ML instance with the EBS-only storage option and without instance storage, you must define the size of EBS volume through <code>VolumeSizeInGB</code> in the <code>ResourceConfig</code> API. For example, ML instance families that use EBS volumes include <code>ml.c5</code> and <code>ml.p2</code>. </p>
        /// <p>To look up instance types and their instance storage types and volumes, see <a href="http://aws.amazon.com/ec2/instance-types/">Amazon EC2 Instance Types</a>.</p>
        /// <p>To find the default local paths defined by the SageMaker training platform, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-train-storage.html">Amazon SageMaker Training Storage Folders for Training Datasets, Checkpoints, Model Artifacts, and Outputs</a>.</p>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// <p>The Amazon Web Services KMS key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training job.</p> <note>
        /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
        /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
        /// </note>
        /// <p>The <code>VolumeKmsKeyId</code> can be in any of the following formats:</p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// </ul>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services KMS key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training job.</p> <note>
        /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
        /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
        /// </note>
        /// <p>The <code>VolumeKmsKeyId</code> can be in any of the following formats:</p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// </ul>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// Appends an item to `instance_groups`.
        ///
        /// To override the contents of this collection use [`set_instance_groups`](Self::set_instance_groups).
        ///
        /// <p>The configuration of a heterogeneous cluster in JSON format.</p>
        pub fn instance_groups(mut self, input: crate::model::InstanceGroup) -> Self {
            let mut v = self.instance_groups.unwrap_or_default();
            v.push(input);
            self.instance_groups = Some(v);
            self
        }
        /// <p>The configuration of a heterogeneous cluster in JSON format.</p>
        pub fn set_instance_groups(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::InstanceGroup>>,
        ) -> Self {
            self.instance_groups = input;
            self
        }
        /// <p>The duration of time in seconds to retain configured resources in a warm pool for subsequent training jobs.</p>
        pub fn keep_alive_period_in_seconds(mut self, input: i32) -> Self {
            self.keep_alive_period_in_seconds = Some(input);
            self
        }
        /// <p>The duration of time in seconds to retain configured resources in a warm pool for subsequent training jobs.</p>
        pub fn set_keep_alive_period_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.keep_alive_period_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`ResourceConfig`](crate::model::ResourceConfig).
        pub fn build(self) -> crate::model::ResourceConfig {
            crate::model::ResourceConfig {
                instance_type: self.instance_type,
                instance_count: self.instance_count.unwrap_or_default(),
                volume_size_in_gb: self.volume_size_in_gb.unwrap_or_default(),
                volume_kms_key_id: self.volume_kms_key_id,
                instance_groups: self.instance_groups,
                keep_alive_period_in_seconds: self.keep_alive_period_in_seconds,
            }
        }
    }
}
impl ResourceConfig {
    /// Creates a new builder-style object to manufacture [`ResourceConfig`](crate::model::ResourceConfig).
    pub fn builder() -> crate::model::resource_config::Builder {
        crate::model::resource_config::Builder::default()
    }
}

/// <p>Defines an instance group for heterogeneous cluster training. When requesting a training job using the <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html">CreateTrainingJob</a> API, you can configure multiple instance groups .</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InstanceGroup {
    /// <p>Specifies the instance type of the instance group.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::TrainingInstanceType>,
    /// <p>Specifies the number of instances of the instance group.</p>
    #[doc(hidden)]
    pub instance_count: i32,
    /// <p>Specifies the name of the instance group.</p>
    #[doc(hidden)]
    pub instance_group_name: std::option::Option<std::string::String>,
}
impl InstanceGroup {
    /// <p>Specifies the instance type of the instance group.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::TrainingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>Specifies the number of instances of the instance group.</p>
    pub fn instance_count(&self) -> i32 {
        self.instance_count
    }
    /// <p>Specifies the name of the instance group.</p>
    pub fn instance_group_name(&self) -> std::option::Option<&str> {
        self.instance_group_name.as_deref()
    }
}
/// See [`InstanceGroup`](crate::model::InstanceGroup).
pub mod instance_group {

    /// A builder for [`InstanceGroup`](crate::model::InstanceGroup).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::TrainingInstanceType>,
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) instance_group_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Specifies the instance type of the instance group.</p>
        pub fn instance_type(mut self, input: crate::model::TrainingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>Specifies the instance type of the instance group.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::TrainingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>Specifies the number of instances of the instance group.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>Specifies the number of instances of the instance group.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>Specifies the name of the instance group.</p>
        pub fn instance_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.instance_group_name = Some(input.into());
            self
        }
        /// <p>Specifies the name of the instance group.</p>
        pub fn set_instance_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.instance_group_name = input;
            self
        }
        /// Consumes the builder and constructs a [`InstanceGroup`](crate::model::InstanceGroup).
        pub fn build(self) -> crate::model::InstanceGroup {
            crate::model::InstanceGroup {
                instance_type: self.instance_type,
                instance_count: self.instance_count.unwrap_or_default(),
                instance_group_name: self.instance_group_name,
            }
        }
    }
}
impl InstanceGroup {
    /// Creates a new builder-style object to manufacture [`InstanceGroup`](crate::model::InstanceGroup).
    pub fn builder() -> crate::model::instance_group::Builder {
        crate::model::instance_group::Builder::default()
    }
}

/// <p>Provides information about how to store model training results (model artifacts).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OutputDataConfig {
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
    /// </ul>
    /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateTrainingJob</code>, <code>CreateTransformJob</code>, or <code>CreateHyperParameterTuningJob</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>Identifies the S3 path where you want SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>. </p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
}
impl OutputDataConfig {
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
    /// </ul>
    /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateTrainingJob</code>, <code>CreateTransformJob</code>, or <code>CreateHyperParameterTuningJob</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>Identifies the S3 path where you want SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>. </p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
}
/// See [`OutputDataConfig`](crate::model::OutputDataConfig).
pub mod output_data_config {

    /// A builder for [`OutputDataConfig`](crate::model::OutputDataConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
        /// </ul>
        /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateTrainingJob</code>, <code>CreateTransformJob</code>, or <code>CreateHyperParameterTuningJob</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
        /// </ul>
        /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateTrainingJob</code>, <code>CreateTransformJob</code>, or <code>CreateHyperParameterTuningJob</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>Identifies the S3 path where you want SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>. </p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Identifies the S3 path where you want SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>. </p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// Consumes the builder and constructs a [`OutputDataConfig`](crate::model::OutputDataConfig).
        pub fn build(self) -> crate::model::OutputDataConfig {
            crate::model::OutputDataConfig {
                kms_key_id: self.kms_key_id,
                s3_output_path: self.s3_output_path,
            }
        }
    }
}
impl OutputDataConfig {
    /// Creates a new builder-style object to manufacture [`OutputDataConfig`](crate::model::OutputDataConfig).
    pub fn builder() -> crate::model::output_data_config::Builder {
        crate::model::output_data_config::Builder::default()
    }
}

/// <p>A channel is a named input source that training algorithms can consume. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Channel {
    /// <p>The name of the channel. </p>
    #[doc(hidden)]
    pub channel_name: std::option::Option<std::string::String>,
    /// <p>The location of the channel data.</p>
    #[doc(hidden)]
    pub data_source: std::option::Option<crate::model::DataSource>,
    /// <p>The MIME type of the data.</p>
    #[doc(hidden)]
    pub content_type: std::option::Option<std::string::String>,
    /// <p>If training data is compressed, the compression type. The default value is <code>None</code>. <code>CompressionType</code> is used only in Pipe input mode. In File mode, leave this field unset or set it to None.</p>
    #[doc(hidden)]
    pub compression_type: std::option::Option<crate::model::CompressionType>,
    /// <p></p>
    /// <p>Specify RecordIO as the value when input data is in raw format but the training algorithm requires the RecordIO format. In this case, SageMaker wraps each individual S3 object in a RecordIO record. If the input data is already in RecordIO format, you don't need to set this attribute. For more information, see <a href="https://mxnet.apache.org/api/architecture/note_data_loading#data-format">Create a Dataset Using RecordIO</a>. </p>
    /// <p>In File mode, leave this field unset or set it to None.</p>
    #[doc(hidden)]
    pub record_wrapper_type: std::option::Option<crate::model::RecordWrapper>,
    /// <p>(Optional) The input mode to use for the data channel in a training job. If you don't set a value for <code>InputMode</code>, SageMaker uses the value set for <code>TrainingInputMode</code>. Use this parameter to override the <code>TrainingInputMode</code> setting in a <code>AlgorithmSpecification</code> request when you have a channel that needs a different input mode from the training job's general setting. To download the data from Amazon Simple Storage Service (Amazon S3) to the provisioned ML storage volume, and mount the directory to a Docker volume, use <code>File</code> input mode. To stream data directly from Amazon S3 to the container, choose <code>Pipe</code> input mode.</p>
    /// <p>To use a model for incremental training, choose <code>File</code> input model.</p>
    #[doc(hidden)]
    pub input_mode: std::option::Option<crate::model::TrainingInputMode>,
    /// <p>A configuration for a shuffle option for input data in a channel. If you use <code>S3Prefix</code> for <code>S3DataType</code>, this shuffles the results of the S3 key prefix matches. If you use <code>ManifestFile</code>, the order of the S3 object references in the <code>ManifestFile</code> is shuffled. If you use <code>AugmentedManifestFile</code>, the order of the JSON lines in the <code>AugmentedManifestFile</code> is shuffled. The shuffling order is determined using the <code>Seed</code> value.</p>
    /// <p>For Pipe input mode, shuffling is done at the start of every epoch. With large datasets this ensures that the order of the training data is different for each epoch, it helps reduce bias and possible overfitting. In a multi-node training job when ShuffleConfig is combined with <code>S3DataDistributionType</code> of <code>ShardedByS3Key</code>, the data is shuffled across nodes so that the content sent to a particular node on the first epoch might be sent to a different node on the second epoch.</p>
    #[doc(hidden)]
    pub shuffle_config: std::option::Option<crate::model::ShuffleConfig>,
}
impl Channel {
    /// <p>The name of the channel. </p>
    pub fn channel_name(&self) -> std::option::Option<&str> {
        self.channel_name.as_deref()
    }
    /// <p>The location of the channel data.</p>
    pub fn data_source(&self) -> std::option::Option<&crate::model::DataSource> {
        self.data_source.as_ref()
    }
    /// <p>The MIME type of the data.</p>
    pub fn content_type(&self) -> std::option::Option<&str> {
        self.content_type.as_deref()
    }
    /// <p>If training data is compressed, the compression type. The default value is <code>None</code>. <code>CompressionType</code> is used only in Pipe input mode. In File mode, leave this field unset or set it to None.</p>
    pub fn compression_type(&self) -> std::option::Option<&crate::model::CompressionType> {
        self.compression_type.as_ref()
    }
    /// <p></p>
    /// <p>Specify RecordIO as the value when input data is in raw format but the training algorithm requires the RecordIO format. In this case, SageMaker wraps each individual S3 object in a RecordIO record. If the input data is already in RecordIO format, you don't need to set this attribute. For more information, see <a href="https://mxnet.apache.org/api/architecture/note_data_loading#data-format">Create a Dataset Using RecordIO</a>. </p>
    /// <p>In File mode, leave this field unset or set it to None.</p>
    pub fn record_wrapper_type(&self) -> std::option::Option<&crate::model::RecordWrapper> {
        self.record_wrapper_type.as_ref()
    }
    /// <p>(Optional) The input mode to use for the data channel in a training job. If you don't set a value for <code>InputMode</code>, SageMaker uses the value set for <code>TrainingInputMode</code>. Use this parameter to override the <code>TrainingInputMode</code> setting in a <code>AlgorithmSpecification</code> request when you have a channel that needs a different input mode from the training job's general setting. To download the data from Amazon Simple Storage Service (Amazon S3) to the provisioned ML storage volume, and mount the directory to a Docker volume, use <code>File</code> input mode. To stream data directly from Amazon S3 to the container, choose <code>Pipe</code> input mode.</p>
    /// <p>To use a model for incremental training, choose <code>File</code> input model.</p>
    pub fn input_mode(&self) -> std::option::Option<&crate::model::TrainingInputMode> {
        self.input_mode.as_ref()
    }
    /// <p>A configuration for a shuffle option for input data in a channel. If you use <code>S3Prefix</code> for <code>S3DataType</code>, this shuffles the results of the S3 key prefix matches. If you use <code>ManifestFile</code>, the order of the S3 object references in the <code>ManifestFile</code> is shuffled. If you use <code>AugmentedManifestFile</code>, the order of the JSON lines in the <code>AugmentedManifestFile</code> is shuffled. The shuffling order is determined using the <code>Seed</code> value.</p>
    /// <p>For Pipe input mode, shuffling is done at the start of every epoch. With large datasets this ensures that the order of the training data is different for each epoch, it helps reduce bias and possible overfitting. In a multi-node training job when ShuffleConfig is combined with <code>S3DataDistributionType</code> of <code>ShardedByS3Key</code>, the data is shuffled across nodes so that the content sent to a particular node on the first epoch might be sent to a different node on the second epoch.</p>
    pub fn shuffle_config(&self) -> std::option::Option<&crate::model::ShuffleConfig> {
        self.shuffle_config.as_ref()
    }
}
/// See [`Channel`](crate::model::Channel).
pub mod channel {

    /// A builder for [`Channel`](crate::model::Channel).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) channel_name: std::option::Option<std::string::String>,
        pub(crate) data_source: std::option::Option<crate::model::DataSource>,
        pub(crate) content_type: std::option::Option<std::string::String>,
        pub(crate) compression_type: std::option::Option<crate::model::CompressionType>,
        pub(crate) record_wrapper_type: std::option::Option<crate::model::RecordWrapper>,
        pub(crate) input_mode: std::option::Option<crate::model::TrainingInputMode>,
        pub(crate) shuffle_config: std::option::Option<crate::model::ShuffleConfig>,
    }
    impl Builder {
        /// <p>The name of the channel. </p>
        pub fn channel_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.channel_name = Some(input.into());
            self
        }
        /// <p>The name of the channel. </p>
        pub fn set_channel_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.channel_name = input;
            self
        }
        /// <p>The location of the channel data.</p>
        pub fn data_source(mut self, input: crate::model::DataSource) -> Self {
            self.data_source = Some(input);
            self
        }
        /// <p>The location of the channel data.</p>
        pub fn set_data_source(
            mut self,
            input: std::option::Option<crate::model::DataSource>,
        ) -> Self {
            self.data_source = input;
            self
        }
        /// <p>The MIME type of the data.</p>
        pub fn content_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_type = Some(input.into());
            self
        }
        /// <p>The MIME type of the data.</p>
        pub fn set_content_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content_type = input;
            self
        }
        /// <p>If training data is compressed, the compression type. The default value is <code>None</code>. <code>CompressionType</code> is used only in Pipe input mode. In File mode, leave this field unset or set it to None.</p>
        pub fn compression_type(mut self, input: crate::model::CompressionType) -> Self {
            self.compression_type = Some(input);
            self
        }
        /// <p>If training data is compressed, the compression type. The default value is <code>None</code>. <code>CompressionType</code> is used only in Pipe input mode. In File mode, leave this field unset or set it to None.</p>
        pub fn set_compression_type(
            mut self,
            input: std::option::Option<crate::model::CompressionType>,
        ) -> Self {
            self.compression_type = input;
            self
        }
        /// <p></p>
        /// <p>Specify RecordIO as the value when input data is in raw format but the training algorithm requires the RecordIO format. In this case, SageMaker wraps each individual S3 object in a RecordIO record. If the input data is already in RecordIO format, you don't need to set this attribute. For more information, see <a href="https://mxnet.apache.org/api/architecture/note_data_loading#data-format">Create a Dataset Using RecordIO</a>. </p>
        /// <p>In File mode, leave this field unset or set it to None.</p>
        pub fn record_wrapper_type(mut self, input: crate::model::RecordWrapper) -> Self {
            self.record_wrapper_type = Some(input);
            self
        }
        /// <p></p>
        /// <p>Specify RecordIO as the value when input data is in raw format but the training algorithm requires the RecordIO format. In this case, SageMaker wraps each individual S3 object in a RecordIO record. If the input data is already in RecordIO format, you don't need to set this attribute. For more information, see <a href="https://mxnet.apache.org/api/architecture/note_data_loading#data-format">Create a Dataset Using RecordIO</a>. </p>
        /// <p>In File mode, leave this field unset or set it to None.</p>
        pub fn set_record_wrapper_type(
            mut self,
            input: std::option::Option<crate::model::RecordWrapper>,
        ) -> Self {
            self.record_wrapper_type = input;
            self
        }
        /// <p>(Optional) The input mode to use for the data channel in a training job. If you don't set a value for <code>InputMode</code>, SageMaker uses the value set for <code>TrainingInputMode</code>. Use this parameter to override the <code>TrainingInputMode</code> setting in a <code>AlgorithmSpecification</code> request when you have a channel that needs a different input mode from the training job's general setting. To download the data from Amazon Simple Storage Service (Amazon S3) to the provisioned ML storage volume, and mount the directory to a Docker volume, use <code>File</code> input mode. To stream data directly from Amazon S3 to the container, choose <code>Pipe</code> input mode.</p>
        /// <p>To use a model for incremental training, choose <code>File</code> input model.</p>
        pub fn input_mode(mut self, input: crate::model::TrainingInputMode) -> Self {
            self.input_mode = Some(input);
            self
        }
        /// <p>(Optional) The input mode to use for the data channel in a training job. If you don't set a value for <code>InputMode</code>, SageMaker uses the value set for <code>TrainingInputMode</code>. Use this parameter to override the <code>TrainingInputMode</code> setting in a <code>AlgorithmSpecification</code> request when you have a channel that needs a different input mode from the training job's general setting. To download the data from Amazon Simple Storage Service (Amazon S3) to the provisioned ML storage volume, and mount the directory to a Docker volume, use <code>File</code> input mode. To stream data directly from Amazon S3 to the container, choose <code>Pipe</code> input mode.</p>
        /// <p>To use a model for incremental training, choose <code>File</code> input model.</p>
        pub fn set_input_mode(
            mut self,
            input: std::option::Option<crate::model::TrainingInputMode>,
        ) -> Self {
            self.input_mode = input;
            self
        }
        /// <p>A configuration for a shuffle option for input data in a channel. If you use <code>S3Prefix</code> for <code>S3DataType</code>, this shuffles the results of the S3 key prefix matches. If you use <code>ManifestFile</code>, the order of the S3 object references in the <code>ManifestFile</code> is shuffled. If you use <code>AugmentedManifestFile</code>, the order of the JSON lines in the <code>AugmentedManifestFile</code> is shuffled. The shuffling order is determined using the <code>Seed</code> value.</p>
        /// <p>For Pipe input mode, shuffling is done at the start of every epoch. With large datasets this ensures that the order of the training data is different for each epoch, it helps reduce bias and possible overfitting. In a multi-node training job when ShuffleConfig is combined with <code>S3DataDistributionType</code> of <code>ShardedByS3Key</code>, the data is shuffled across nodes so that the content sent to a particular node on the first epoch might be sent to a different node on the second epoch.</p>
        pub fn shuffle_config(mut self, input: crate::model::ShuffleConfig) -> Self {
            self.shuffle_config = Some(input);
            self
        }
        /// <p>A configuration for a shuffle option for input data in a channel. If you use <code>S3Prefix</code> for <code>S3DataType</code>, this shuffles the results of the S3 key prefix matches. If you use <code>ManifestFile</code>, the order of the S3 object references in the <code>ManifestFile</code> is shuffled. If you use <code>AugmentedManifestFile</code>, the order of the JSON lines in the <code>AugmentedManifestFile</code> is shuffled. The shuffling order is determined using the <code>Seed</code> value.</p>
        /// <p>For Pipe input mode, shuffling is done at the start of every epoch. With large datasets this ensures that the order of the training data is different for each epoch, it helps reduce bias and possible overfitting. In a multi-node training job when ShuffleConfig is combined with <code>S3DataDistributionType</code> of <code>ShardedByS3Key</code>, the data is shuffled across nodes so that the content sent to a particular node on the first epoch might be sent to a different node on the second epoch.</p>
        pub fn set_shuffle_config(
            mut self,
            input: std::option::Option<crate::model::ShuffleConfig>,
        ) -> Self {
            self.shuffle_config = input;
            self
        }
        /// Consumes the builder and constructs a [`Channel`](crate::model::Channel).
        pub fn build(self) -> crate::model::Channel {
            crate::model::Channel {
                channel_name: self.channel_name,
                data_source: self.data_source,
                content_type: self.content_type,
                compression_type: self.compression_type,
                record_wrapper_type: self.record_wrapper_type,
                input_mode: self.input_mode,
                shuffle_config: self.shuffle_config,
            }
        }
    }
}
impl Channel {
    /// Creates a new builder-style object to manufacture [`Channel`](crate::model::Channel).
    pub fn builder() -> crate::model::channel::Builder {
        crate::model::channel::Builder::default()
    }
}

/// <p>A configuration for a shuffle option for input data in a channel. If you use <code>S3Prefix</code> for <code>S3DataType</code>, the results of the S3 key prefix matches are shuffled. If you use <code>ManifestFile</code>, the order of the S3 object references in the <code>ManifestFile</code> is shuffled. If you use <code>AugmentedManifestFile</code>, the order of the JSON lines in the <code>AugmentedManifestFile</code> is shuffled. The shuffling order is determined using the <code>Seed</code> value.</p>
/// <p>For Pipe input mode, when <code>ShuffleConfig</code> is specified shuffling is done at the start of every epoch. With large datasets, this ensures that the order of the training data is different for each epoch, and it helps reduce bias and possible overfitting. In a multi-node training job when <code>ShuffleConfig</code> is combined with <code>S3DataDistributionType</code> of <code>ShardedByS3Key</code>, the data is shuffled across nodes so that the content sent to a particular node on the first epoch might be sent to a different node on the second epoch.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ShuffleConfig {
    /// <p>Determines the shuffling order in <code>ShuffleConfig</code> value.</p>
    #[doc(hidden)]
    pub seed: i64,
}
impl ShuffleConfig {
    /// <p>Determines the shuffling order in <code>ShuffleConfig</code> value.</p>
    pub fn seed(&self) -> i64 {
        self.seed
    }
}
/// See [`ShuffleConfig`](crate::model::ShuffleConfig).
pub mod shuffle_config {

    /// A builder for [`ShuffleConfig`](crate::model::ShuffleConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) seed: std::option::Option<i64>,
    }
    impl Builder {
        /// <p>Determines the shuffling order in <code>ShuffleConfig</code> value.</p>
        pub fn seed(mut self, input: i64) -> Self {
            self.seed = Some(input);
            self
        }
        /// <p>Determines the shuffling order in <code>ShuffleConfig</code> value.</p>
        pub fn set_seed(mut self, input: std::option::Option<i64>) -> Self {
            self.seed = input;
            self
        }
        /// Consumes the builder and constructs a [`ShuffleConfig`](crate::model::ShuffleConfig).
        pub fn build(self) -> crate::model::ShuffleConfig {
            crate::model::ShuffleConfig {
                seed: self.seed.unwrap_or_default(),
            }
        }
    }
}
impl ShuffleConfig {
    /// Creates a new builder-style object to manufacture [`ShuffleConfig`](crate::model::ShuffleConfig).
    pub fn builder() -> crate::model::shuffle_config::Builder {
        crate::model::shuffle_config::Builder::default()
    }
}

/// When writing a match expression against `TrainingInputMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let traininginputmode = unimplemented!();
/// match traininginputmode {
///     TrainingInputMode::Fastfile => { /* ... */ },
///     TrainingInputMode::File => { /* ... */ },
///     TrainingInputMode::Pipe => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `traininginputmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrainingInputMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrainingInputMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrainingInputMode::NewFeature` is defined.
/// Specifically, when `traininginputmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrainingInputMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// <p>The training input mode that the algorithm supports. For more information about input
/// modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
/// <p>
/// <b>Pipe mode</b>
/// </p>
/// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from
/// Amazon S3 to the container.</p>
/// <p>
/// <b>File mode</b>
/// </p>
/// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from
/// S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume
/// for the training container.</p>
/// <p>You must provision the ML storage volume with sufficient capacity to accommodate the
/// data downloaded from S3. In addition to the training data, the ML storage volume also
/// stores the output model. The algorithm container uses the ML storage volume to also
/// store intermediate information, if any.</p>
/// <p>For distributed algorithms, training data is distributed uniformly. Your training
/// duration is predictable if the input data objects sizes are approximately the same. SageMaker
/// does not split the files any further for model training. If the object sizes are skewed,
/// training won't be optimal as the data distribution is also skewed when one host in a
/// training cluster is overloaded, thus becoming a bottleneck in training.</p>
/// <p>
/// <b>FastFile mode</b>
/// </p>
/// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from
/// S3 to the container with no code changes, and provides file system access to the data.
/// Users can author their training script to interact with these files as if they were
/// stored on disk.</p>
/// <p>
/// <code>FastFile</code> mode works best when the data is read sequentially. Augmented
/// manifest files aren't supported. The startup time is lower when there are fewer files in
/// the S3 bucket provided.</p>
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrainingInputMode {
    #[allow(missing_docs)] // documentation missing in model
    Fastfile,
    #[allow(missing_docs)] // documentation missing in model
    File,
    #[allow(missing_docs)] // documentation missing in model
    Pipe,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrainingInputMode {
    fn from(s: &str) -> Self {
        match s {
            "FastFile" => TrainingInputMode::Fastfile,
            "File" => TrainingInputMode::File,
            "Pipe" => TrainingInputMode::Pipe,
            other => {
                TrainingInputMode::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for TrainingInputMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrainingInputMode::from(s))
    }
}
impl TrainingInputMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrainingInputMode::Fastfile => "FastFile",
            TrainingInputMode::File => "File",
            TrainingInputMode::Pipe => "Pipe",
            TrainingInputMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["FastFile", "File", "Pipe"]
    }
}
impl AsRef<str> for TrainingInputMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `RecordWrapper`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let recordwrapper = unimplemented!();
/// match recordwrapper {
///     RecordWrapper::None => { /* ... */ },
///     RecordWrapper::Recordio => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `recordwrapper` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RecordWrapper::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RecordWrapper::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RecordWrapper::NewFeature` is defined.
/// Specifically, when `recordwrapper` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RecordWrapper::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RecordWrapper {
    #[allow(missing_docs)] // documentation missing in model
    None,
    #[allow(missing_docs)] // documentation missing in model
    Recordio,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RecordWrapper {
    fn from(s: &str) -> Self {
        match s {
            "None" => RecordWrapper::None,
            "RecordIO" => RecordWrapper::Recordio,
            other => RecordWrapper::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for RecordWrapper {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RecordWrapper::from(s))
    }
}
impl RecordWrapper {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RecordWrapper::None => "None",
            RecordWrapper::Recordio => "RecordIO",
            RecordWrapper::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["None", "RecordIO"]
    }
}
impl AsRef<str> for RecordWrapper {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the location of the channel data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataSource {
    /// <p>The S3 location of the data source that is associated with a channel.</p>
    #[doc(hidden)]
    pub s3_data_source: std::option::Option<crate::model::S3DataSource>,
    /// <p>The file system that is associated with a channel.</p>
    #[doc(hidden)]
    pub file_system_data_source: std::option::Option<crate::model::FileSystemDataSource>,
}
impl DataSource {
    /// <p>The S3 location of the data source that is associated with a channel.</p>
    pub fn s3_data_source(&self) -> std::option::Option<&crate::model::S3DataSource> {
        self.s3_data_source.as_ref()
    }
    /// <p>The file system that is associated with a channel.</p>
    pub fn file_system_data_source(
        &self,
    ) -> std::option::Option<&crate::model::FileSystemDataSource> {
        self.file_system_data_source.as_ref()
    }
}
/// See [`DataSource`](crate::model::DataSource).
pub mod data_source {

    /// A builder for [`DataSource`](crate::model::DataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_source: std::option::Option<crate::model::S3DataSource>,
        pub(crate) file_system_data_source: std::option::Option<crate::model::FileSystemDataSource>,
    }
    impl Builder {
        /// <p>The S3 location of the data source that is associated with a channel.</p>
        pub fn s3_data_source(mut self, input: crate::model::S3DataSource) -> Self {
            self.s3_data_source = Some(input);
            self
        }
        /// <p>The S3 location of the data source that is associated with a channel.</p>
        pub fn set_s3_data_source(
            mut self,
            input: std::option::Option<crate::model::S3DataSource>,
        ) -> Self {
            self.s3_data_source = input;
            self
        }
        /// <p>The file system that is associated with a channel.</p>
        pub fn file_system_data_source(
            mut self,
            input: crate::model::FileSystemDataSource,
        ) -> Self {
            self.file_system_data_source = Some(input);
            self
        }
        /// <p>The file system that is associated with a channel.</p>
        pub fn set_file_system_data_source(
            mut self,
            input: std::option::Option<crate::model::FileSystemDataSource>,
        ) -> Self {
            self.file_system_data_source = input;
            self
        }
        /// Consumes the builder and constructs a [`DataSource`](crate::model::DataSource).
        pub fn build(self) -> crate::model::DataSource {
            crate::model::DataSource {
                s3_data_source: self.s3_data_source,
                file_system_data_source: self.file_system_data_source,
            }
        }
    }
}
impl DataSource {
    /// Creates a new builder-style object to manufacture [`DataSource`](crate::model::DataSource).
    pub fn builder() -> crate::model::data_source::Builder {
        crate::model::data_source::Builder::default()
    }
}

/// <p>Specifies a file system data source for a channel.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FileSystemDataSource {
    /// <p>The file system id.</p>
    #[doc(hidden)]
    pub file_system_id: std::option::Option<std::string::String>,
    /// <p>The access mode of the mount of the directory associated with the channel. A directory can be mounted either in <code>ro</code> (read-only) or <code>rw</code> (read-write) mode.</p>
    #[doc(hidden)]
    pub file_system_access_mode: std::option::Option<crate::model::FileSystemAccessMode>,
    /// <p>The file system type. </p>
    #[doc(hidden)]
    pub file_system_type: std::option::Option<crate::model::FileSystemType>,
    /// <p>The full path to the directory to associate with the channel.</p>
    #[doc(hidden)]
    pub directory_path: std::option::Option<std::string::String>,
}
impl FileSystemDataSource {
    /// <p>The file system id.</p>
    pub fn file_system_id(&self) -> std::option::Option<&str> {
        self.file_system_id.as_deref()
    }
    /// <p>The access mode of the mount of the directory associated with the channel. A directory can be mounted either in <code>ro</code> (read-only) or <code>rw</code> (read-write) mode.</p>
    pub fn file_system_access_mode(
        &self,
    ) -> std::option::Option<&crate::model::FileSystemAccessMode> {
        self.file_system_access_mode.as_ref()
    }
    /// <p>The file system type. </p>
    pub fn file_system_type(&self) -> std::option::Option<&crate::model::FileSystemType> {
        self.file_system_type.as_ref()
    }
    /// <p>The full path to the directory to associate with the channel.</p>
    pub fn directory_path(&self) -> std::option::Option<&str> {
        self.directory_path.as_deref()
    }
}
/// See [`FileSystemDataSource`](crate::model::FileSystemDataSource).
pub mod file_system_data_source {

    /// A builder for [`FileSystemDataSource`](crate::model::FileSystemDataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) file_system_id: std::option::Option<std::string::String>,
        pub(crate) file_system_access_mode: std::option::Option<crate::model::FileSystemAccessMode>,
        pub(crate) file_system_type: std::option::Option<crate::model::FileSystemType>,
        pub(crate) directory_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The file system id.</p>
        pub fn file_system_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.file_system_id = Some(input.into());
            self
        }
        /// <p>The file system id.</p>
        pub fn set_file_system_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.file_system_id = input;
            self
        }
        /// <p>The access mode of the mount of the directory associated with the channel. A directory can be mounted either in <code>ro</code> (read-only) or <code>rw</code> (read-write) mode.</p>
        pub fn file_system_access_mode(
            mut self,
            input: crate::model::FileSystemAccessMode,
        ) -> Self {
            self.file_system_access_mode = Some(input);
            self
        }
        /// <p>The access mode of the mount of the directory associated with the channel. A directory can be mounted either in <code>ro</code> (read-only) or <code>rw</code> (read-write) mode.</p>
        pub fn set_file_system_access_mode(
            mut self,
            input: std::option::Option<crate::model::FileSystemAccessMode>,
        ) -> Self {
            self.file_system_access_mode = input;
            self
        }
        /// <p>The file system type. </p>
        pub fn file_system_type(mut self, input: crate::model::FileSystemType) -> Self {
            self.file_system_type = Some(input);
            self
        }
        /// <p>The file system type. </p>
        pub fn set_file_system_type(
            mut self,
            input: std::option::Option<crate::model::FileSystemType>,
        ) -> Self {
            self.file_system_type = input;
            self
        }
        /// <p>The full path to the directory to associate with the channel.</p>
        pub fn directory_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.directory_path = Some(input.into());
            self
        }
        /// <p>The full path to the directory to associate with the channel.</p>
        pub fn set_directory_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.directory_path = input;
            self
        }
        /// Consumes the builder and constructs a [`FileSystemDataSource`](crate::model::FileSystemDataSource).
        pub fn build(self) -> crate::model::FileSystemDataSource {
            crate::model::FileSystemDataSource {
                file_system_id: self.file_system_id,
                file_system_access_mode: self.file_system_access_mode,
                file_system_type: self.file_system_type,
                directory_path: self.directory_path,
            }
        }
    }
}
impl FileSystemDataSource {
    /// Creates a new builder-style object to manufacture [`FileSystemDataSource`](crate::model::FileSystemDataSource).
    pub fn builder() -> crate::model::file_system_data_source::Builder {
        crate::model::file_system_data_source::Builder::default()
    }
}

/// When writing a match expression against `FileSystemType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let filesystemtype = unimplemented!();
/// match filesystemtype {
///     FileSystemType::Efs => { /* ... */ },
///     FileSystemType::Fsxlustre => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `filesystemtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FileSystemType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FileSystemType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FileSystemType::NewFeature` is defined.
/// Specifically, when `filesystemtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FileSystemType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FileSystemType {
    #[allow(missing_docs)] // documentation missing in model
    Efs,
    #[allow(missing_docs)] // documentation missing in model
    Fsxlustre,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FileSystemType {
    fn from(s: &str) -> Self {
        match s {
            "EFS" => FileSystemType::Efs,
            "FSxLustre" => FileSystemType::Fsxlustre,
            other => FileSystemType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for FileSystemType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FileSystemType::from(s))
    }
}
impl FileSystemType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FileSystemType::Efs => "EFS",
            FileSystemType::Fsxlustre => "FSxLustre",
            FileSystemType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["EFS", "FSxLustre"]
    }
}
impl AsRef<str> for FileSystemType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `FileSystemAccessMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let filesystemaccessmode = unimplemented!();
/// match filesystemaccessmode {
///     FileSystemAccessMode::Ro => { /* ... */ },
///     FileSystemAccessMode::Rw => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `filesystemaccessmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FileSystemAccessMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FileSystemAccessMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FileSystemAccessMode::NewFeature` is defined.
/// Specifically, when `filesystemaccessmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FileSystemAccessMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FileSystemAccessMode {
    #[allow(missing_docs)] // documentation missing in model
    Ro,
    #[allow(missing_docs)] // documentation missing in model
    Rw,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FileSystemAccessMode {
    fn from(s: &str) -> Self {
        match s {
            "ro" => FileSystemAccessMode::Ro,
            "rw" => FileSystemAccessMode::Rw,
            other => {
                FileSystemAccessMode::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for FileSystemAccessMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FileSystemAccessMode::from(s))
    }
}
impl FileSystemAccessMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FileSystemAccessMode::Ro => "ro",
            FileSystemAccessMode::Rw => "rw",
            FileSystemAccessMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ro", "rw"]
    }
}
impl AsRef<str> for FileSystemAccessMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes the S3 data source.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct S3DataSource {
    /// <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name prefix. SageMaker uses all objects that match the specified key name prefix for model training. </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 SageMaker to use for model training. </p>
    /// <p>If you choose <code>AugmentedManifestFile</code>, S3Uri identifies an object that is an augmented manifest file in JSON lines format. This file contains the data you want to use for model training. <code>AugmentedManifestFile</code> can only be used if the Channel's input mode is <code>Pipe</code>.</p>
    #[doc(hidden)]
    pub s3_data_type: std::option::Option<crate::model::S3DataType>,
    /// <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> A manifest is an S3 object which is a JSON file consisting of an array of elements. The first element is a prefix which is followed by one or more suffixes. SageMaker appends the suffix elements to the prefix to get a full set of <code>S3Uri</code>. Note that the prefix must be a valid non-empty <code>S3Uri</code> that precludes users from specifying a manifest whose individual <code>S3Uri</code> is sourced from different S3 buckets.</p> <p> The following code example shows a valid manifest 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> This JSON is equivalent to the following <code>S3Uri</code> list:</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>S3Uri</code> in this manifest is the input data for the channel for this data source. The object that each <code>S3Uri</code> points to must be readable by the IAM role that SageMaker uses to perform tasks on your behalf. </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>If you want SageMaker to replicate the entire dataset on each ML compute instance that is launched for model training, specify <code>FullyReplicated</code>. </p>
    /// <p>If you want SageMaker to replicate a subset of data on each ML compute instance that is launched for model training, specify <code>ShardedByS3Key</code>. If there are <i>n</i> ML compute instances launched for a training job, each instance gets approximately 1/<i>n</i> of the number of S3 objects. In this case, model training on each machine uses only the subset of training data. </p>
    /// <p>Don't choose more ML compute instances for training than available S3 objects. If you do, some nodes won't get any data and you will pay for nodes that aren't getting any training data. This applies in both File and Pipe modes. Keep this in mind when developing algorithms. </p>
    /// <p>In distributed training, where you use multiple ML compute EC2 instances, you might choose <code>ShardedByS3Key</code>. If the algorithm requires copying training data to the ML storage volume (when <code>TrainingInputMode</code> is set to <code>File</code>), this copies 1/<i>n</i> of the number of objects. </p>
    #[doc(hidden)]
    pub s3_data_distribution_type: std::option::Option<crate::model::S3DataDistribution>,
    /// <p>A list of one or more attribute names to use that are found in a specified augmented manifest file.</p>
    #[doc(hidden)]
    pub attribute_names: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A list of names of instance groups that get data from the S3 data source.</p>
    #[doc(hidden)]
    pub instance_group_names: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl S3DataSource {
    /// <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name prefix. SageMaker uses all objects that match the specified key name prefix for model training. </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 SageMaker to use for model training. </p>
    /// <p>If you choose <code>AugmentedManifestFile</code>, S3Uri identifies an object that is an augmented manifest file in JSON lines format. This file contains the data you want to use for model training. <code>AugmentedManifestFile</code> can only be used if the Channel's input mode is <code>Pipe</code>.</p>
    pub fn s3_data_type(&self) -> std::option::Option<&crate::model::S3DataType> {
        self.s3_data_type.as_ref()
    }
    /// <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> A manifest is an S3 object which is a JSON file consisting of an array of elements. The first element is a prefix which is followed by one or more suffixes. SageMaker appends the suffix elements to the prefix to get a full set of <code>S3Uri</code>. Note that the prefix must be a valid non-empty <code>S3Uri</code> that precludes users from specifying a manifest whose individual <code>S3Uri</code> is sourced from different S3 buckets.</p> <p> The following code example shows a valid manifest 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> This JSON is equivalent to the following <code>S3Uri</code> list:</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>S3Uri</code> in this manifest is the input data for the channel for this data source. The object that each <code>S3Uri</code> points to must be readable by the IAM role that SageMaker uses to perform tasks on your behalf. </p> </li>
    /// </ul>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>If you want SageMaker to replicate the entire dataset on each ML compute instance that is launched for model training, specify <code>FullyReplicated</code>. </p>
    /// <p>If you want SageMaker to replicate a subset of data on each ML compute instance that is launched for model training, specify <code>ShardedByS3Key</code>. If there are <i>n</i> ML compute instances launched for a training job, each instance gets approximately 1/<i>n</i> of the number of S3 objects. In this case, model training on each machine uses only the subset of training data. </p>
    /// <p>Don't choose more ML compute instances for training than available S3 objects. If you do, some nodes won't get any data and you will pay for nodes that aren't getting any training data. This applies in both File and Pipe modes. Keep this in mind when developing algorithms. </p>
    /// <p>In distributed training, where you use multiple ML compute EC2 instances, you might choose <code>ShardedByS3Key</code>. If the algorithm requires copying training data to the ML storage volume (when <code>TrainingInputMode</code> is set to <code>File</code>), this copies 1/<i>n</i> of the number of objects. </p>
    pub fn s3_data_distribution_type(
        &self,
    ) -> std::option::Option<&crate::model::S3DataDistribution> {
        self.s3_data_distribution_type.as_ref()
    }
    /// <p>A list of one or more attribute names to use that are found in a specified augmented manifest file.</p>
    pub fn attribute_names(&self) -> std::option::Option<&[std::string::String]> {
        self.attribute_names.as_deref()
    }
    /// <p>A list of names of instance groups that get data from the S3 data source.</p>
    pub fn instance_group_names(&self) -> std::option::Option<&[std::string::String]> {
        self.instance_group_names.as_deref()
    }
}
/// See [`S3DataSource`](crate::model::S3DataSource).
pub mod s3_data_source {

    /// A builder for [`S3DataSource`](crate::model::S3DataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_type: std::option::Option<crate::model::S3DataType>,
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) s3_data_distribution_type: std::option::Option<crate::model::S3DataDistribution>,
        pub(crate) attribute_names: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) instance_group_names: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name prefix. SageMaker uses all objects that match the specified key name prefix for model training. </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 SageMaker to use for model training. </p>
        /// <p>If you choose <code>AugmentedManifestFile</code>, S3Uri identifies an object that is an augmented manifest file in JSON lines format. This file contains the data you want to use for model training. <code>AugmentedManifestFile</code> can only be used if the Channel's input mode is <code>Pipe</code>.</p>
        pub fn s3_data_type(mut self, input: crate::model::S3DataType) -> Self {
            self.s3_data_type = Some(input);
            self
        }
        /// <p>If you choose <code>S3Prefix</code>, <code>S3Uri</code> identifies a key name prefix. SageMaker uses all objects that match the specified key name prefix for model training. </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 SageMaker to use for model training. </p>
        /// <p>If you choose <code>AugmentedManifestFile</code>, S3Uri identifies an object that is an augmented manifest file in JSON lines format. This file contains the data you want to use for model training. <code>AugmentedManifestFile</code> can only be used if the Channel's input mode is <code>Pipe</code>.</p>
        pub fn set_s3_data_type(
            mut self,
            input: std::option::Option<crate::model::S3DataType>,
        ) -> Self {
            self.s3_data_type = input;
            self
        }
        /// <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> A manifest is an S3 object which is a JSON file consisting of an array of elements. The first element is a prefix which is followed by one or more suffixes. SageMaker appends the suffix elements to the prefix to get a full set of <code>S3Uri</code>. Note that the prefix must be a valid non-empty <code>S3Uri</code> that precludes users from specifying a manifest whose individual <code>S3Uri</code> is sourced from different S3 buckets.</p> <p> The following code example shows a valid manifest 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> This JSON is equivalent to the following <code>S3Uri</code> list:</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>S3Uri</code> in this manifest is the input data for the channel for this data source. The object that each <code>S3Uri</code> points to must be readable by the IAM role that SageMaker uses to perform tasks on your behalf. </p> </li>
        /// </ul>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <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> A manifest is an S3 object which is a JSON file consisting of an array of elements. The first element is a prefix which is followed by one or more suffixes. SageMaker appends the suffix elements to the prefix to get a full set of <code>S3Uri</code>. Note that the prefix must be a valid non-empty <code>S3Uri</code> that precludes users from specifying a manifest whose individual <code>S3Uri</code> is sourced from different S3 buckets.</p> <p> The following code example shows a valid manifest 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> This JSON is equivalent to the following <code>S3Uri</code> list:</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>S3Uri</code> in this manifest is the input data for the channel for this data source. The object that each <code>S3Uri</code> points to must be readable by the IAM role that SageMaker uses to perform tasks on your behalf. </p> </li>
        /// </ul>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>If you want SageMaker to replicate the entire dataset on each ML compute instance that is launched for model training, specify <code>FullyReplicated</code>. </p>
        /// <p>If you want SageMaker to replicate a subset of data on each ML compute instance that is launched for model training, specify <code>ShardedByS3Key</code>. If there are <i>n</i> ML compute instances launched for a training job, each instance gets approximately 1/<i>n</i> of the number of S3 objects. In this case, model training on each machine uses only the subset of training data. </p>
        /// <p>Don't choose more ML compute instances for training than available S3 objects. If you do, some nodes won't get any data and you will pay for nodes that aren't getting any training data. This applies in both File and Pipe modes. Keep this in mind when developing algorithms. </p>
        /// <p>In distributed training, where you use multiple ML compute EC2 instances, you might choose <code>ShardedByS3Key</code>. If the algorithm requires copying training data to the ML storage volume (when <code>TrainingInputMode</code> is set to <code>File</code>), this copies 1/<i>n</i> of the number of objects. </p>
        pub fn s3_data_distribution_type(
            mut self,
            input: crate::model::S3DataDistribution,
        ) -> Self {
            self.s3_data_distribution_type = Some(input);
            self
        }
        /// <p>If you want SageMaker to replicate the entire dataset on each ML compute instance that is launched for model training, specify <code>FullyReplicated</code>. </p>
        /// <p>If you want SageMaker to replicate a subset of data on each ML compute instance that is launched for model training, specify <code>ShardedByS3Key</code>. If there are <i>n</i> ML compute instances launched for a training job, each instance gets approximately 1/<i>n</i> of the number of S3 objects. In this case, model training on each machine uses only the subset of training data. </p>
        /// <p>Don't choose more ML compute instances for training than available S3 objects. If you do, some nodes won't get any data and you will pay for nodes that aren't getting any training data. This applies in both File and Pipe modes. Keep this in mind when developing algorithms. </p>
        /// <p>In distributed training, where you use multiple ML compute EC2 instances, you might choose <code>ShardedByS3Key</code>. If the algorithm requires copying training data to the ML storage volume (when <code>TrainingInputMode</code> is set to <code>File</code>), this copies 1/<i>n</i> of the number of objects. </p>
        pub fn set_s3_data_distribution_type(
            mut self,
            input: std::option::Option<crate::model::S3DataDistribution>,
        ) -> Self {
            self.s3_data_distribution_type = input;
            self
        }
        /// Appends an item to `attribute_names`.
        ///
        /// To override the contents of this collection use [`set_attribute_names`](Self::set_attribute_names).
        ///
        /// <p>A list of one or more attribute names to use that are found in a specified augmented manifest file.</p>
        pub fn attribute_names(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.attribute_names.unwrap_or_default();
            v.push(input.into());
            self.attribute_names = Some(v);
            self
        }
        /// <p>A list of one or more attribute names to use that are found in a specified augmented manifest file.</p>
        pub fn set_attribute_names(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.attribute_names = input;
            self
        }
        /// Appends an item to `instance_group_names`.
        ///
        /// To override the contents of this collection use [`set_instance_group_names`](Self::set_instance_group_names).
        ///
        /// <p>A list of names of instance groups that get data from the S3 data source.</p>
        pub fn instance_group_names(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.instance_group_names.unwrap_or_default();
            v.push(input.into());
            self.instance_group_names = Some(v);
            self
        }
        /// <p>A list of names of instance groups that get data from the S3 data source.</p>
        pub fn set_instance_group_names(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.instance_group_names = input;
            self
        }
        /// Consumes the builder and constructs a [`S3DataSource`](crate::model::S3DataSource).
        pub fn build(self) -> crate::model::S3DataSource {
            crate::model::S3DataSource {
                s3_data_type: self.s3_data_type,
                s3_uri: self.s3_uri,
                s3_data_distribution_type: self.s3_data_distribution_type,
                attribute_names: self.attribute_names,
                instance_group_names: self.instance_group_names,
            }
        }
    }
}
impl S3DataSource {
    /// Creates a new builder-style object to manufacture [`S3DataSource`](crate::model::S3DataSource).
    pub fn builder() -> crate::model::s3_data_source::Builder {
        crate::model::s3_data_source::Builder::default()
    }
}

/// When writing a match expression against `S3DataDistribution`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let s3datadistribution = unimplemented!();
/// match s3datadistribution {
///     S3DataDistribution::FullyReplicated => { /* ... */ },
///     S3DataDistribution::ShardedByS3Key => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `s3datadistribution` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `S3DataDistribution::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `S3DataDistribution::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `S3DataDistribution::NewFeature` is defined.
/// Specifically, when `s3datadistribution` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `S3DataDistribution::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum S3DataDistribution {
    #[allow(missing_docs)] // documentation missing in model
    FullyReplicated,
    #[allow(missing_docs)] // documentation missing in model
    ShardedByS3Key,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for S3DataDistribution {
    fn from(s: &str) -> Self {
        match s {
            "FullyReplicated" => S3DataDistribution::FullyReplicated,
            "ShardedByS3Key" => S3DataDistribution::ShardedByS3Key,
            other => {
                S3DataDistribution::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for S3DataDistribution {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(S3DataDistribution::from(s))
    }
}
impl S3DataDistribution {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            S3DataDistribution::FullyReplicated => "FullyReplicated",
            S3DataDistribution::ShardedByS3Key => "ShardedByS3Key",
            S3DataDistribution::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["FullyReplicated", "ShardedByS3Key"]
    }
}
impl AsRef<str> for S3DataDistribution {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies which training algorithm to use for training jobs that a hyperparameter tuning job launches and the metrics to monitor.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterAlgorithmSpecification {
    /// <p> The registry path of the Docker image that contains the training algorithm. For information about Docker registry paths for built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Algorithms Provided by Amazon SageMaker: Common Parameters</a>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
    #[doc(hidden)]
    pub training_image: std::option::Option<std::string::String>,
    /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
    /// <p> <b>Pipe mode</b> </p>
    /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
    /// <p> <b>File mode</b> </p>
    /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
    /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
    /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
    /// <p> <b>FastFile mode</b> </p>
    /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
    /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
    #[doc(hidden)]
    pub training_input_mode: std::option::Option<crate::model::TrainingInputMode>,
    /// <p>The name of the resource algorithm to use for the hyperparameter tuning job. If you specify a value for this parameter, do not specify a value for <code>TrainingImage</code>.</p>
    #[doc(hidden)]
    pub algorithm_name: std::option::Option<std::string::String>,
    /// <p>An array of <code>MetricDefinition</code> objects that specify the metrics that the algorithm emits.</p>
    #[doc(hidden)]
    pub metric_definitions: std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
}
impl HyperParameterAlgorithmSpecification {
    /// <p> The registry path of the Docker image that contains the training algorithm. For information about Docker registry paths for built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Algorithms Provided by Amazon SageMaker: Common Parameters</a>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
    pub fn training_image(&self) -> std::option::Option<&str> {
        self.training_image.as_deref()
    }
    /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
    /// <p> <b>Pipe mode</b> </p>
    /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
    /// <p> <b>File mode</b> </p>
    /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
    /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
    /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
    /// <p> <b>FastFile mode</b> </p>
    /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
    /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
    pub fn training_input_mode(&self) -> std::option::Option<&crate::model::TrainingInputMode> {
        self.training_input_mode.as_ref()
    }
    /// <p>The name of the resource algorithm to use for the hyperparameter tuning job. If you specify a value for this parameter, do not specify a value for <code>TrainingImage</code>.</p>
    pub fn algorithm_name(&self) -> std::option::Option<&str> {
        self.algorithm_name.as_deref()
    }
    /// <p>An array of <code>MetricDefinition</code> objects that specify the metrics that the algorithm emits.</p>
    pub fn metric_definitions(&self) -> std::option::Option<&[crate::model::MetricDefinition]> {
        self.metric_definitions.as_deref()
    }
}
/// See [`HyperParameterAlgorithmSpecification`](crate::model::HyperParameterAlgorithmSpecification).
pub mod hyper_parameter_algorithm_specification {

    /// A builder for [`HyperParameterAlgorithmSpecification`](crate::model::HyperParameterAlgorithmSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_image: std::option::Option<std::string::String>,
        pub(crate) training_input_mode: std::option::Option<crate::model::TrainingInputMode>,
        pub(crate) algorithm_name: std::option::Option<std::string::String>,
        pub(crate) metric_definitions:
            std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
    }
    impl Builder {
        /// <p> The registry path of the Docker image that contains the training algorithm. For information about Docker registry paths for built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Algorithms Provided by Amazon SageMaker: Common Parameters</a>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
        pub fn training_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_image = Some(input.into());
            self
        }
        /// <p> The registry path of the Docker image that contains the training algorithm. For information about Docker registry paths for built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Algorithms Provided by Amazon SageMaker: Common Parameters</a>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p>
        pub fn set_training_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_image = input;
            self
        }
        /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
        /// <p> <b>Pipe mode</b> </p>
        /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
        /// <p> <b>File mode</b> </p>
        /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
        /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
        /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
        /// <p> <b>FastFile mode</b> </p>
        /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
        /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
        pub fn training_input_mode(mut self, input: crate::model::TrainingInputMode) -> Self {
            self.training_input_mode = Some(input);
            self
        }
        /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
        /// <p> <b>Pipe mode</b> </p>
        /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
        /// <p> <b>File mode</b> </p>
        /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
        /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
        /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
        /// <p> <b>FastFile mode</b> </p>
        /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
        /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
        pub fn set_training_input_mode(
            mut self,
            input: std::option::Option<crate::model::TrainingInputMode>,
        ) -> Self {
            self.training_input_mode = input;
            self
        }
        /// <p>The name of the resource algorithm to use for the hyperparameter tuning job. If you specify a value for this parameter, do not specify a value for <code>TrainingImage</code>.</p>
        pub fn algorithm_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.algorithm_name = Some(input.into());
            self
        }
        /// <p>The name of the resource algorithm to use for the hyperparameter tuning job. If you specify a value for this parameter, do not specify a value for <code>TrainingImage</code>.</p>
        pub fn set_algorithm_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.algorithm_name = input;
            self
        }
        /// Appends an item to `metric_definitions`.
        ///
        /// To override the contents of this collection use [`set_metric_definitions`](Self::set_metric_definitions).
        ///
        /// <p>An array of <code>MetricDefinition</code> objects that specify the metrics that the algorithm emits.</p>
        pub fn metric_definitions(mut self, input: crate::model::MetricDefinition) -> Self {
            let mut v = self.metric_definitions.unwrap_or_default();
            v.push(input);
            self.metric_definitions = Some(v);
            self
        }
        /// <p>An array of <code>MetricDefinition</code> objects that specify the metrics that the algorithm emits.</p>
        pub fn set_metric_definitions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
        ) -> Self {
            self.metric_definitions = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterAlgorithmSpecification`](crate::model::HyperParameterAlgorithmSpecification).
        pub fn build(self) -> crate::model::HyperParameterAlgorithmSpecification {
            crate::model::HyperParameterAlgorithmSpecification {
                training_image: self.training_image,
                training_input_mode: self.training_input_mode,
                algorithm_name: self.algorithm_name,
                metric_definitions: self.metric_definitions,
            }
        }
    }
}
impl HyperParameterAlgorithmSpecification {
    /// Creates a new builder-style object to manufacture [`HyperParameterAlgorithmSpecification`](crate::model::HyperParameterAlgorithmSpecification).
    pub fn builder() -> crate::model::hyper_parameter_algorithm_specification::Builder {
        crate::model::hyper_parameter_algorithm_specification::Builder::default()
    }
}

/// <p>Specifies a metric that the training algorithm writes to <code>stderr</code> or <code>stdout</code>. SageMakerhyperparameter tuning captures all defined metrics. You specify one metric that a hyperparameter tuning job uses as its objective metric to choose the best training job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MetricDefinition {
    /// <p>The name of the metric.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>A regular expression that searches the output of a training job and gets the value of the metric. For more information about using regular expressions to define metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Defining Objective Metrics</a>.</p>
    #[doc(hidden)]
    pub regex: std::option::Option<std::string::String>,
}
impl MetricDefinition {
    /// <p>The name of the metric.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>A regular expression that searches the output of a training job and gets the value of the metric. For more information about using regular expressions to define metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Defining Objective Metrics</a>.</p>
    pub fn regex(&self) -> std::option::Option<&str> {
        self.regex.as_deref()
    }
}
/// See [`MetricDefinition`](crate::model::MetricDefinition).
pub mod metric_definition {

    /// A builder for [`MetricDefinition`](crate::model::MetricDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) regex: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the metric.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the metric.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>A regular expression that searches the output of a training job and gets the value of the metric. For more information about using regular expressions to define metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Defining Objective Metrics</a>.</p>
        pub fn regex(mut self, input: impl Into<std::string::String>) -> Self {
            self.regex = Some(input.into());
            self
        }
        /// <p>A regular expression that searches the output of a training job and gets the value of the metric. For more information about using regular expressions to define metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html">Defining Objective Metrics</a>.</p>
        pub fn set_regex(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.regex = input;
            self
        }
        /// Consumes the builder and constructs a [`MetricDefinition`](crate::model::MetricDefinition).
        pub fn build(self) -> crate::model::MetricDefinition {
            crate::model::MetricDefinition {
                name: self.name,
                regex: self.regex,
            }
        }
    }
}
impl MetricDefinition {
    /// Creates a new builder-style object to manufacture [`MetricDefinition`](crate::model::MetricDefinition).
    pub fn builder() -> crate::model::metric_definition::Builder {
        crate::model::metric_definition::Builder::default()
    }
}

/// <p>Specifies ranges of integer, continuous, and categorical hyperparameters that a hyperparameter tuning job searches. The hyperparameter tuning job launches training jobs with hyperparameter values within these ranges to find the combination of values that result in the training job with the best performance as measured by the objective metric of the hyperparameter tuning job.</p> <note>
/// <p>The maximum number of items specified for <code>Array Members</code> refers to the maximum number of hyperparameters for each range and also the maximum for the hyperparameter tuning job itself. That is, the sum of the number of hyperparameters for all the ranges can't exceed the maximum number specified.</p>
/// </note>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ParameterRanges {
    /// <p>The array of <code>IntegerParameterRange</code> objects that specify ranges of integer hyperparameters that a hyperparameter tuning job searches.</p>
    #[doc(hidden)]
    pub integer_parameter_ranges:
        std::option::Option<std::vec::Vec<crate::model::IntegerParameterRange>>,
    /// <p>The array of <code>ContinuousParameterRange</code> objects that specify ranges of continuous hyperparameters that a hyperparameter tuning job searches.</p>
    #[doc(hidden)]
    pub continuous_parameter_ranges:
        std::option::Option<std::vec::Vec<crate::model::ContinuousParameterRange>>,
    /// <p>The array of <code>CategoricalParameterRange</code> objects that specify ranges of categorical hyperparameters that a hyperparameter tuning job searches.</p>
    #[doc(hidden)]
    pub categorical_parameter_ranges:
        std::option::Option<std::vec::Vec<crate::model::CategoricalParameterRange>>,
}
impl ParameterRanges {
    /// <p>The array of <code>IntegerParameterRange</code> objects that specify ranges of integer hyperparameters that a hyperparameter tuning job searches.</p>
    pub fn integer_parameter_ranges(
        &self,
    ) -> std::option::Option<&[crate::model::IntegerParameterRange]> {
        self.integer_parameter_ranges.as_deref()
    }
    /// <p>The array of <code>ContinuousParameterRange</code> objects that specify ranges of continuous hyperparameters that a hyperparameter tuning job searches.</p>
    pub fn continuous_parameter_ranges(
        &self,
    ) -> std::option::Option<&[crate::model::ContinuousParameterRange]> {
        self.continuous_parameter_ranges.as_deref()
    }
    /// <p>The array of <code>CategoricalParameterRange</code> objects that specify ranges of categorical hyperparameters that a hyperparameter tuning job searches.</p>
    pub fn categorical_parameter_ranges(
        &self,
    ) -> std::option::Option<&[crate::model::CategoricalParameterRange]> {
        self.categorical_parameter_ranges.as_deref()
    }
}
/// See [`ParameterRanges`](crate::model::ParameterRanges).
pub mod parameter_ranges {

    /// A builder for [`ParameterRanges`](crate::model::ParameterRanges).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) integer_parameter_ranges:
            std::option::Option<std::vec::Vec<crate::model::IntegerParameterRange>>,
        pub(crate) continuous_parameter_ranges:
            std::option::Option<std::vec::Vec<crate::model::ContinuousParameterRange>>,
        pub(crate) categorical_parameter_ranges:
            std::option::Option<std::vec::Vec<crate::model::CategoricalParameterRange>>,
    }
    impl Builder {
        /// Appends an item to `integer_parameter_ranges`.
        ///
        /// To override the contents of this collection use [`set_integer_parameter_ranges`](Self::set_integer_parameter_ranges).
        ///
        /// <p>The array of <code>IntegerParameterRange</code> objects that specify ranges of integer hyperparameters that a hyperparameter tuning job searches.</p>
        pub fn integer_parameter_ranges(
            mut self,
            input: crate::model::IntegerParameterRange,
        ) -> Self {
            let mut v = self.integer_parameter_ranges.unwrap_or_default();
            v.push(input);
            self.integer_parameter_ranges = Some(v);
            self
        }
        /// <p>The array of <code>IntegerParameterRange</code> objects that specify ranges of integer hyperparameters that a hyperparameter tuning job searches.</p>
        pub fn set_integer_parameter_ranges(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::IntegerParameterRange>>,
        ) -> Self {
            self.integer_parameter_ranges = input;
            self
        }
        /// Appends an item to `continuous_parameter_ranges`.
        ///
        /// To override the contents of this collection use [`set_continuous_parameter_ranges`](Self::set_continuous_parameter_ranges).
        ///
        /// <p>The array of <code>ContinuousParameterRange</code> objects that specify ranges of continuous hyperparameters that a hyperparameter tuning job searches.</p>
        pub fn continuous_parameter_ranges(
            mut self,
            input: crate::model::ContinuousParameterRange,
        ) -> Self {
            let mut v = self.continuous_parameter_ranges.unwrap_or_default();
            v.push(input);
            self.continuous_parameter_ranges = Some(v);
            self
        }
        /// <p>The array of <code>ContinuousParameterRange</code> objects that specify ranges of continuous hyperparameters that a hyperparameter tuning job searches.</p>
        pub fn set_continuous_parameter_ranges(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ContinuousParameterRange>>,
        ) -> Self {
            self.continuous_parameter_ranges = input;
            self
        }
        /// Appends an item to `categorical_parameter_ranges`.
        ///
        /// To override the contents of this collection use [`set_categorical_parameter_ranges`](Self::set_categorical_parameter_ranges).
        ///
        /// <p>The array of <code>CategoricalParameterRange</code> objects that specify ranges of categorical hyperparameters that a hyperparameter tuning job searches.</p>
        pub fn categorical_parameter_ranges(
            mut self,
            input: crate::model::CategoricalParameterRange,
        ) -> Self {
            let mut v = self.categorical_parameter_ranges.unwrap_or_default();
            v.push(input);
            self.categorical_parameter_ranges = Some(v);
            self
        }
        /// <p>The array of <code>CategoricalParameterRange</code> objects that specify ranges of categorical hyperparameters that a hyperparameter tuning job searches.</p>
        pub fn set_categorical_parameter_ranges(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CategoricalParameterRange>>,
        ) -> Self {
            self.categorical_parameter_ranges = input;
            self
        }
        /// Consumes the builder and constructs a [`ParameterRanges`](crate::model::ParameterRanges).
        pub fn build(self) -> crate::model::ParameterRanges {
            crate::model::ParameterRanges {
                integer_parameter_ranges: self.integer_parameter_ranges,
                continuous_parameter_ranges: self.continuous_parameter_ranges,
                categorical_parameter_ranges: self.categorical_parameter_ranges,
            }
        }
    }
}
impl ParameterRanges {
    /// Creates a new builder-style object to manufacture [`ParameterRanges`](crate::model::ParameterRanges).
    pub fn builder() -> crate::model::parameter_ranges::Builder {
        crate::model::parameter_ranges::Builder::default()
    }
}

/// <p>A list of categorical hyperparameters to tune.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CategoricalParameterRange {
    /// <p>The name of the categorical hyperparameter to tune.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>A list of the categories for the hyperparameter.</p>
    #[doc(hidden)]
    pub values: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl CategoricalParameterRange {
    /// <p>The name of the categorical hyperparameter to tune.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>A list of the categories for the hyperparameter.</p>
    pub fn values(&self) -> std::option::Option<&[std::string::String]> {
        self.values.as_deref()
    }
}
/// See [`CategoricalParameterRange`](crate::model::CategoricalParameterRange).
pub mod categorical_parameter_range {

    /// A builder for [`CategoricalParameterRange`](crate::model::CategoricalParameterRange).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) values: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The name of the categorical hyperparameter to tune.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the categorical hyperparameter to tune.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// Appends an item to `values`.
        ///
        /// To override the contents of this collection use [`set_values`](Self::set_values).
        ///
        /// <p>A list of the categories for the hyperparameter.</p>
        pub fn values(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.values.unwrap_or_default();
            v.push(input.into());
            self.values = Some(v);
            self
        }
        /// <p>A list of the categories for the hyperparameter.</p>
        pub fn set_values(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.values = input;
            self
        }
        /// Consumes the builder and constructs a [`CategoricalParameterRange`](crate::model::CategoricalParameterRange).
        pub fn build(self) -> crate::model::CategoricalParameterRange {
            crate::model::CategoricalParameterRange {
                name: self.name,
                values: self.values,
            }
        }
    }
}
impl CategoricalParameterRange {
    /// Creates a new builder-style object to manufacture [`CategoricalParameterRange`](crate::model::CategoricalParameterRange).
    pub fn builder() -> crate::model::categorical_parameter_range::Builder {
        crate::model::categorical_parameter_range::Builder::default()
    }
}

/// <p>A list of continuous hyperparameters to tune.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ContinuousParameterRange {
    /// <p>The name of the continuous hyperparameter to tune.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The minimum value for the hyperparameter. The tuning job uses floating-point values between this value and <code>MaxValue</code>for tuning.</p>
    #[doc(hidden)]
    pub min_value: std::option::Option<std::string::String>,
    /// <p>The maximum value for the hyperparameter. The tuning job uses floating-point values between <code>MinValue</code> value and this value for tuning.</p>
    #[doc(hidden)]
    pub max_value: std::option::Option<std::string::String>,
    /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
    /// <dl>
    /// <dt>
    /// Auto
    /// </dt>
    /// <dd>
    /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
    /// </dd>
    /// <dt>
    /// Linear
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
    /// </dd>
    /// <dt>
    /// Logarithmic
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
    /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
    /// </dd>
    /// <dt>
    /// ReverseLogarithmic
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a reverse logarithmic scale.</p>
    /// <p>Reverse logarithmic scaling works only for ranges that are entirely within the range 0&lt;=x&lt;1.0.</p>
    /// </dd>
    /// </dl>
    #[doc(hidden)]
    pub scaling_type: std::option::Option<crate::model::HyperParameterScalingType>,
}
impl ContinuousParameterRange {
    /// <p>The name of the continuous hyperparameter to tune.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The minimum value for the hyperparameter. The tuning job uses floating-point values between this value and <code>MaxValue</code>for tuning.</p>
    pub fn min_value(&self) -> std::option::Option<&str> {
        self.min_value.as_deref()
    }
    /// <p>The maximum value for the hyperparameter. The tuning job uses floating-point values between <code>MinValue</code> value and this value for tuning.</p>
    pub fn max_value(&self) -> std::option::Option<&str> {
        self.max_value.as_deref()
    }
    /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
    /// <dl>
    /// <dt>
    /// Auto
    /// </dt>
    /// <dd>
    /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
    /// </dd>
    /// <dt>
    /// Linear
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
    /// </dd>
    /// <dt>
    /// Logarithmic
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
    /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
    /// </dd>
    /// <dt>
    /// ReverseLogarithmic
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a reverse logarithmic scale.</p>
    /// <p>Reverse logarithmic scaling works only for ranges that are entirely within the range 0&lt;=x&lt;1.0.</p>
    /// </dd>
    /// </dl>
    pub fn scaling_type(&self) -> std::option::Option<&crate::model::HyperParameterScalingType> {
        self.scaling_type.as_ref()
    }
}
/// See [`ContinuousParameterRange`](crate::model::ContinuousParameterRange).
pub mod continuous_parameter_range {

    /// A builder for [`ContinuousParameterRange`](crate::model::ContinuousParameterRange).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) min_value: std::option::Option<std::string::String>,
        pub(crate) max_value: std::option::Option<std::string::String>,
        pub(crate) scaling_type: std::option::Option<crate::model::HyperParameterScalingType>,
    }
    impl Builder {
        /// <p>The name of the continuous hyperparameter to tune.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the continuous hyperparameter to tune.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The minimum value for the hyperparameter. The tuning job uses floating-point values between this value and <code>MaxValue</code>for tuning.</p>
        pub fn min_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.min_value = Some(input.into());
            self
        }
        /// <p>The minimum value for the hyperparameter. The tuning job uses floating-point values between this value and <code>MaxValue</code>for tuning.</p>
        pub fn set_min_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.min_value = input;
            self
        }
        /// <p>The maximum value for the hyperparameter. The tuning job uses floating-point values between <code>MinValue</code> value and this value for tuning.</p>
        pub fn max_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.max_value = Some(input.into());
            self
        }
        /// <p>The maximum value for the hyperparameter. The tuning job uses floating-point values between <code>MinValue</code> value and this value for tuning.</p>
        pub fn set_max_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.max_value = input;
            self
        }
        /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
        /// <dl>
        /// <dt>
        /// Auto
        /// </dt>
        /// <dd>
        /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
        /// </dd>
        /// <dt>
        /// Linear
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
        /// </dd>
        /// <dt>
        /// Logarithmic
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
        /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
        /// </dd>
        /// <dt>
        /// ReverseLogarithmic
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a reverse logarithmic scale.</p>
        /// <p>Reverse logarithmic scaling works only for ranges that are entirely within the range 0&lt;=x&lt;1.0.</p>
        /// </dd>
        /// </dl>
        pub fn scaling_type(mut self, input: crate::model::HyperParameterScalingType) -> Self {
            self.scaling_type = Some(input);
            self
        }
        /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
        /// <dl>
        /// <dt>
        /// Auto
        /// </dt>
        /// <dd>
        /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
        /// </dd>
        /// <dt>
        /// Linear
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
        /// </dd>
        /// <dt>
        /// Logarithmic
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
        /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
        /// </dd>
        /// <dt>
        /// ReverseLogarithmic
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a reverse logarithmic scale.</p>
        /// <p>Reverse logarithmic scaling works only for ranges that are entirely within the range 0&lt;=x&lt;1.0.</p>
        /// </dd>
        /// </dl>
        pub fn set_scaling_type(
            mut self,
            input: std::option::Option<crate::model::HyperParameterScalingType>,
        ) -> Self {
            self.scaling_type = input;
            self
        }
        /// Consumes the builder and constructs a [`ContinuousParameterRange`](crate::model::ContinuousParameterRange).
        pub fn build(self) -> crate::model::ContinuousParameterRange {
            crate::model::ContinuousParameterRange {
                name: self.name,
                min_value: self.min_value,
                max_value: self.max_value,
                scaling_type: self.scaling_type,
            }
        }
    }
}
impl ContinuousParameterRange {
    /// Creates a new builder-style object to manufacture [`ContinuousParameterRange`](crate::model::ContinuousParameterRange).
    pub fn builder() -> crate::model::continuous_parameter_range::Builder {
        crate::model::continuous_parameter_range::Builder::default()
    }
}

/// When writing a match expression against `HyperParameterScalingType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparameterscalingtype = unimplemented!();
/// match hyperparameterscalingtype {
///     HyperParameterScalingType::Auto => { /* ... */ },
///     HyperParameterScalingType::Linear => { /* ... */ },
///     HyperParameterScalingType::Logarithmic => { /* ... */ },
///     HyperParameterScalingType::ReverseLogarithmic => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparameterscalingtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterScalingType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterScalingType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterScalingType::NewFeature` is defined.
/// Specifically, when `hyperparameterscalingtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterScalingType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterScalingType {
    #[allow(missing_docs)] // documentation missing in model
    Auto,
    #[allow(missing_docs)] // documentation missing in model
    Linear,
    #[allow(missing_docs)] // documentation missing in model
    Logarithmic,
    #[allow(missing_docs)] // documentation missing in model
    ReverseLogarithmic,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterScalingType {
    fn from(s: &str) -> Self {
        match s {
            "Auto" => HyperParameterScalingType::Auto,
            "Linear" => HyperParameterScalingType::Linear,
            "Logarithmic" => HyperParameterScalingType::Logarithmic,
            "ReverseLogarithmic" => HyperParameterScalingType::ReverseLogarithmic,
            other => HyperParameterScalingType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for HyperParameterScalingType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterScalingType::from(s))
    }
}
impl HyperParameterScalingType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterScalingType::Auto => "Auto",
            HyperParameterScalingType::Linear => "Linear",
            HyperParameterScalingType::Logarithmic => "Logarithmic",
            HyperParameterScalingType::ReverseLogarithmic => "ReverseLogarithmic",
            HyperParameterScalingType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Auto", "Linear", "Logarithmic", "ReverseLogarithmic"]
    }
}
impl AsRef<str> for HyperParameterScalingType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>For a hyperparameter of the integer type, specifies the range that a hyperparameter tuning job searches.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct IntegerParameterRange {
    /// <p>The name of the hyperparameter to search.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The minimum value of the hyperparameter to search.</p>
    #[doc(hidden)]
    pub min_value: std::option::Option<std::string::String>,
    /// <p>The maximum value of the hyperparameter to search.</p>
    #[doc(hidden)]
    pub max_value: std::option::Option<std::string::String>,
    /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
    /// <dl>
    /// <dt>
    /// Auto
    /// </dt>
    /// <dd>
    /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
    /// </dd>
    /// <dt>
    /// Linear
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
    /// </dd>
    /// <dt>
    /// Logarithmic
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
    /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
    /// </dd>
    /// </dl>
    #[doc(hidden)]
    pub scaling_type: std::option::Option<crate::model::HyperParameterScalingType>,
}
impl IntegerParameterRange {
    /// <p>The name of the hyperparameter to search.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The minimum value of the hyperparameter to search.</p>
    pub fn min_value(&self) -> std::option::Option<&str> {
        self.min_value.as_deref()
    }
    /// <p>The maximum value of the hyperparameter to search.</p>
    pub fn max_value(&self) -> std::option::Option<&str> {
        self.max_value.as_deref()
    }
    /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
    /// <dl>
    /// <dt>
    /// Auto
    /// </dt>
    /// <dd>
    /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
    /// </dd>
    /// <dt>
    /// Linear
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
    /// </dd>
    /// <dt>
    /// Logarithmic
    /// </dt>
    /// <dd>
    /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
    /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
    /// </dd>
    /// </dl>
    pub fn scaling_type(&self) -> std::option::Option<&crate::model::HyperParameterScalingType> {
        self.scaling_type.as_ref()
    }
}
/// See [`IntegerParameterRange`](crate::model::IntegerParameterRange).
pub mod integer_parameter_range {

    /// A builder for [`IntegerParameterRange`](crate::model::IntegerParameterRange).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) min_value: std::option::Option<std::string::String>,
        pub(crate) max_value: std::option::Option<std::string::String>,
        pub(crate) scaling_type: std::option::Option<crate::model::HyperParameterScalingType>,
    }
    impl Builder {
        /// <p>The name of the hyperparameter to search.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the hyperparameter to search.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The minimum value of the hyperparameter to search.</p>
        pub fn min_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.min_value = Some(input.into());
            self
        }
        /// <p>The minimum value of the hyperparameter to search.</p>
        pub fn set_min_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.min_value = input;
            self
        }
        /// <p>The maximum value of the hyperparameter to search.</p>
        pub fn max_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.max_value = Some(input.into());
            self
        }
        /// <p>The maximum value of the hyperparameter to search.</p>
        pub fn set_max_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.max_value = input;
            self
        }
        /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
        /// <dl>
        /// <dt>
        /// Auto
        /// </dt>
        /// <dd>
        /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
        /// </dd>
        /// <dt>
        /// Linear
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
        /// </dd>
        /// <dt>
        /// Logarithmic
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
        /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
        /// </dd>
        /// </dl>
        pub fn scaling_type(mut self, input: crate::model::HyperParameterScalingType) -> Self {
            self.scaling_type = Some(input);
            self
        }
        /// <p>The scale that hyperparameter tuning uses to search the hyperparameter range. For information about choosing a hyperparameter scale, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-ranges.html#scaling-type">Hyperparameter Scaling</a>. One of the following values:</p>
        /// <dl>
        /// <dt>
        /// Auto
        /// </dt>
        /// <dd>
        /// <p>SageMaker hyperparameter tuning chooses the best scale for the hyperparameter.</p>
        /// </dd>
        /// <dt>
        /// Linear
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a linear scale.</p>
        /// </dd>
        /// <dt>
        /// Logarithmic
        /// </dt>
        /// <dd>
        /// <p>Hyperparameter tuning searches the values in the hyperparameter range by using a logarithmic scale.</p>
        /// <p>Logarithmic scaling works only for ranges that have only values greater than 0.</p>
        /// </dd>
        /// </dl>
        pub fn set_scaling_type(
            mut self,
            input: std::option::Option<crate::model::HyperParameterScalingType>,
        ) -> Self {
            self.scaling_type = input;
            self
        }
        /// Consumes the builder and constructs a [`IntegerParameterRange`](crate::model::IntegerParameterRange).
        pub fn build(self) -> crate::model::IntegerParameterRange {
            crate::model::IntegerParameterRange {
                name: self.name,
                min_value: self.min_value,
                max_value: self.max_value,
                scaling_type: self.scaling_type,
            }
        }
    }
}
impl IntegerParameterRange {
    /// Creates a new builder-style object to manufacture [`IntegerParameterRange`](crate::model::IntegerParameterRange).
    pub fn builder() -> crate::model::integer_parameter_range::Builder {
        crate::model::integer_parameter_range::Builder::default()
    }
}

/// <p>Defines the objective metric for a hyperparameter tuning job. Hyperparameter tuning uses the value of this metric to evaluate the training jobs it launches, and returns the training job that results in either the highest or lowest value for this metric, depending on the value you specify for the <code>Type</code> parameter.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningJobObjective {
    /// <p>Whether to minimize or maximize the objective metric.</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::HyperParameterTuningJobObjectiveType>,
    /// <p>The name of the metric to use for the objective metric.</p>
    #[doc(hidden)]
    pub metric_name: std::option::Option<std::string::String>,
}
impl HyperParameterTuningJobObjective {
    /// <p>Whether to minimize or maximize the objective metric.</p>
    pub fn r#type(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobObjectiveType> {
        self.r#type.as_ref()
    }
    /// <p>The name of the metric to use for the objective metric.</p>
    pub fn metric_name(&self) -> std::option::Option<&str> {
        self.metric_name.as_deref()
    }
}
/// See [`HyperParameterTuningJobObjective`](crate::model::HyperParameterTuningJobObjective).
pub mod hyper_parameter_tuning_job_objective {

    /// A builder for [`HyperParameterTuningJobObjective`](crate::model::HyperParameterTuningJobObjective).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r#type: std::option::Option<crate::model::HyperParameterTuningJobObjectiveType>,
        pub(crate) metric_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Whether to minimize or maximize the objective metric.</p>
        pub fn r#type(mut self, input: crate::model::HyperParameterTuningJobObjectiveType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>Whether to minimize or maximize the objective metric.</p>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobObjectiveType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The name of the metric to use for the objective metric.</p>
        pub fn metric_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.metric_name = Some(input.into());
            self
        }
        /// <p>The name of the metric to use for the objective metric.</p>
        pub fn set_metric_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.metric_name = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningJobObjective`](crate::model::HyperParameterTuningJobObjective).
        pub fn build(self) -> crate::model::HyperParameterTuningJobObjective {
            crate::model::HyperParameterTuningJobObjective {
                r#type: self.r#type,
                metric_name: self.metric_name,
            }
        }
    }
}
impl HyperParameterTuningJobObjective {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningJobObjective`](crate::model::HyperParameterTuningJobObjective).
    pub fn builder() -> crate::model::hyper_parameter_tuning_job_objective::Builder {
        crate::model::hyper_parameter_tuning_job_objective::Builder::default()
    }
}

/// <p>Configures a hyperparameter tuning job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningJobConfig {
    /// <p>Specifies how hyperparameter tuning chooses the combinations of hyperparameter values to use for the training job it launches. For information about search strategies, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html">How Hyperparameter Tuning Works</a>.</p>
    #[doc(hidden)]
    pub strategy: std::option::Option<crate::model::HyperParameterTuningJobStrategyType>,
    /// <p>The configuration for the <code>Hyperband</code> optimization strategy. This parameter should be provided only if <code>Hyperband</code> is selected as the strategy for <code>HyperParameterTuningJobConfig</code>.</p>
    #[doc(hidden)]
    pub strategy_config: std::option::Option<crate::model::HyperParameterTuningJobStrategyConfig>,
    /// <p>The <code>HyperParameterTuningJobObjective</code> specifies the objective metric used to evaluate the performance of training jobs launched by this tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_objective:
        std::option::Option<crate::model::HyperParameterTuningJobObjective>,
    /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training and parallel training jobs that can be used for this hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub resource_limits: std::option::Option<crate::model::ResourceLimits>,
    /// <p>The <code>ParameterRanges</code> object that specifies the ranges of hyperparameters that this tuning job searches over to find the optimal configuration for the highest model performance against your chosen objective metric. </p>
    #[doc(hidden)]
    pub parameter_ranges: std::option::Option<crate::model::ParameterRanges>,
    /// <p>Specifies whether to use early stopping for training jobs launched by the hyperparameter tuning job. Because the <code>Hyperband</code> strategy has its own advanced internal early stopping mechanism, <code>TrainingJobEarlyStoppingType</code> must be <code>OFF</code> to use <code>Hyperband</code>. This parameter can take on one of the following values (the default value is <code>OFF</code>):</p>
    /// <dl>
    /// <dt>
    /// OFF
    /// </dt>
    /// <dd>
    /// <p>Training jobs launched by the hyperparameter tuning job do not use early stopping.</p>
    /// </dd>
    /// <dt>
    /// AUTO
    /// </dt>
    /// <dd>
    /// <p>SageMaker stops training jobs launched by the hyperparameter tuning job when they are unlikely to perform better than previously completed training jobs. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">Stop Training Jobs Early</a>.</p>
    /// </dd>
    /// </dl>
    #[doc(hidden)]
    pub training_job_early_stopping_type:
        std::option::Option<crate::model::TrainingJobEarlyStoppingType>,
    /// <p>The tuning job's completion criteria.</p>
    #[doc(hidden)]
    pub tuning_job_completion_criteria:
        std::option::Option<crate::model::TuningJobCompletionCriteria>,
    /// <p>A value used to initialize a pseudo-random number generator. Setting a random seed and using the same seed later for the same tuning job will allow hyperparameter optimization to find more a consistent hyperparameter configuration between the two runs.</p>
    #[doc(hidden)]
    pub random_seed: std::option::Option<i32>,
}
impl HyperParameterTuningJobConfig {
    /// <p>Specifies how hyperparameter tuning chooses the combinations of hyperparameter values to use for the training job it launches. For information about search strategies, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html">How Hyperparameter Tuning Works</a>.</p>
    pub fn strategy(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobStrategyType> {
        self.strategy.as_ref()
    }
    /// <p>The configuration for the <code>Hyperband</code> optimization strategy. This parameter should be provided only if <code>Hyperband</code> is selected as the strategy for <code>HyperParameterTuningJobConfig</code>.</p>
    pub fn strategy_config(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobStrategyConfig> {
        self.strategy_config.as_ref()
    }
    /// <p>The <code>HyperParameterTuningJobObjective</code> specifies the objective metric used to evaluate the performance of training jobs launched by this tuning job.</p>
    pub fn hyper_parameter_tuning_job_objective(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobObjective> {
        self.hyper_parameter_tuning_job_objective.as_ref()
    }
    /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training and parallel training jobs that can be used for this hyperparameter tuning job.</p>
    pub fn resource_limits(&self) -> std::option::Option<&crate::model::ResourceLimits> {
        self.resource_limits.as_ref()
    }
    /// <p>The <code>ParameterRanges</code> object that specifies the ranges of hyperparameters that this tuning job searches over to find the optimal configuration for the highest model performance against your chosen objective metric. </p>
    pub fn parameter_ranges(&self) -> std::option::Option<&crate::model::ParameterRanges> {
        self.parameter_ranges.as_ref()
    }
    /// <p>Specifies whether to use early stopping for training jobs launched by the hyperparameter tuning job. Because the <code>Hyperband</code> strategy has its own advanced internal early stopping mechanism, <code>TrainingJobEarlyStoppingType</code> must be <code>OFF</code> to use <code>Hyperband</code>. This parameter can take on one of the following values (the default value is <code>OFF</code>):</p>
    /// <dl>
    /// <dt>
    /// OFF
    /// </dt>
    /// <dd>
    /// <p>Training jobs launched by the hyperparameter tuning job do not use early stopping.</p>
    /// </dd>
    /// <dt>
    /// AUTO
    /// </dt>
    /// <dd>
    /// <p>SageMaker stops training jobs launched by the hyperparameter tuning job when they are unlikely to perform better than previously completed training jobs. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">Stop Training Jobs Early</a>.</p>
    /// </dd>
    /// </dl>
    pub fn training_job_early_stopping_type(
        &self,
    ) -> std::option::Option<&crate::model::TrainingJobEarlyStoppingType> {
        self.training_job_early_stopping_type.as_ref()
    }
    /// <p>The tuning job's completion criteria.</p>
    pub fn tuning_job_completion_criteria(
        &self,
    ) -> std::option::Option<&crate::model::TuningJobCompletionCriteria> {
        self.tuning_job_completion_criteria.as_ref()
    }
    /// <p>A value used to initialize a pseudo-random number generator. Setting a random seed and using the same seed later for the same tuning job will allow hyperparameter optimization to find more a consistent hyperparameter configuration between the two runs.</p>
    pub fn random_seed(&self) -> std::option::Option<i32> {
        self.random_seed
    }
}
/// See [`HyperParameterTuningJobConfig`](crate::model::HyperParameterTuningJobConfig).
pub mod hyper_parameter_tuning_job_config {

    /// A builder for [`HyperParameterTuningJobConfig`](crate::model::HyperParameterTuningJobConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) strategy: std::option::Option<crate::model::HyperParameterTuningJobStrategyType>,
        pub(crate) strategy_config:
            std::option::Option<crate::model::HyperParameterTuningJobStrategyConfig>,
        pub(crate) hyper_parameter_tuning_job_objective:
            std::option::Option<crate::model::HyperParameterTuningJobObjective>,
        pub(crate) resource_limits: std::option::Option<crate::model::ResourceLimits>,
        pub(crate) parameter_ranges: std::option::Option<crate::model::ParameterRanges>,
        pub(crate) training_job_early_stopping_type:
            std::option::Option<crate::model::TrainingJobEarlyStoppingType>,
        pub(crate) tuning_job_completion_criteria:
            std::option::Option<crate::model::TuningJobCompletionCriteria>,
        pub(crate) random_seed: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Specifies how hyperparameter tuning chooses the combinations of hyperparameter values to use for the training job it launches. For information about search strategies, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html">How Hyperparameter Tuning Works</a>.</p>
        pub fn strategy(
            mut self,
            input: crate::model::HyperParameterTuningJobStrategyType,
        ) -> Self {
            self.strategy = Some(input);
            self
        }
        /// <p>Specifies how hyperparameter tuning chooses the combinations of hyperparameter values to use for the training job it launches. For information about search strategies, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html">How Hyperparameter Tuning Works</a>.</p>
        pub fn set_strategy(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobStrategyType>,
        ) -> Self {
            self.strategy = input;
            self
        }
        /// <p>The configuration for the <code>Hyperband</code> optimization strategy. This parameter should be provided only if <code>Hyperband</code> is selected as the strategy for <code>HyperParameterTuningJobConfig</code>.</p>
        pub fn strategy_config(
            mut self,
            input: crate::model::HyperParameterTuningJobStrategyConfig,
        ) -> Self {
            self.strategy_config = Some(input);
            self
        }
        /// <p>The configuration for the <code>Hyperband</code> optimization strategy. This parameter should be provided only if <code>Hyperband</code> is selected as the strategy for <code>HyperParameterTuningJobConfig</code>.</p>
        pub fn set_strategy_config(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobStrategyConfig>,
        ) -> Self {
            self.strategy_config = input;
            self
        }
        /// <p>The <code>HyperParameterTuningJobObjective</code> specifies the objective metric used to evaluate the performance of training jobs launched by this tuning job.</p>
        pub fn hyper_parameter_tuning_job_objective(
            mut self,
            input: crate::model::HyperParameterTuningJobObjective,
        ) -> Self {
            self.hyper_parameter_tuning_job_objective = Some(input);
            self
        }
        /// <p>The <code>HyperParameterTuningJobObjective</code> specifies the objective metric used to evaluate the performance of training jobs launched by this tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_objective(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobObjective>,
        ) -> Self {
            self.hyper_parameter_tuning_job_objective = input;
            self
        }
        /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training and parallel training jobs that can be used for this hyperparameter tuning job.</p>
        pub fn resource_limits(mut self, input: crate::model::ResourceLimits) -> Self {
            self.resource_limits = Some(input);
            self
        }
        /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training and parallel training jobs that can be used for this hyperparameter tuning job.</p>
        pub fn set_resource_limits(
            mut self,
            input: std::option::Option<crate::model::ResourceLimits>,
        ) -> Self {
            self.resource_limits = input;
            self
        }
        /// <p>The <code>ParameterRanges</code> object that specifies the ranges of hyperparameters that this tuning job searches over to find the optimal configuration for the highest model performance against your chosen objective metric. </p>
        pub fn parameter_ranges(mut self, input: crate::model::ParameterRanges) -> Self {
            self.parameter_ranges = Some(input);
            self
        }
        /// <p>The <code>ParameterRanges</code> object that specifies the ranges of hyperparameters that this tuning job searches over to find the optimal configuration for the highest model performance against your chosen objective metric. </p>
        pub fn set_parameter_ranges(
            mut self,
            input: std::option::Option<crate::model::ParameterRanges>,
        ) -> Self {
            self.parameter_ranges = input;
            self
        }
        /// <p>Specifies whether to use early stopping for training jobs launched by the hyperparameter tuning job. Because the <code>Hyperband</code> strategy has its own advanced internal early stopping mechanism, <code>TrainingJobEarlyStoppingType</code> must be <code>OFF</code> to use <code>Hyperband</code>. This parameter can take on one of the following values (the default value is <code>OFF</code>):</p>
        /// <dl>
        /// <dt>
        /// OFF
        /// </dt>
        /// <dd>
        /// <p>Training jobs launched by the hyperparameter tuning job do not use early stopping.</p>
        /// </dd>
        /// <dt>
        /// AUTO
        /// </dt>
        /// <dd>
        /// <p>SageMaker stops training jobs launched by the hyperparameter tuning job when they are unlikely to perform better than previously completed training jobs. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">Stop Training Jobs Early</a>.</p>
        /// </dd>
        /// </dl>
        pub fn training_job_early_stopping_type(
            mut self,
            input: crate::model::TrainingJobEarlyStoppingType,
        ) -> Self {
            self.training_job_early_stopping_type = Some(input);
            self
        }
        /// <p>Specifies whether to use early stopping for training jobs launched by the hyperparameter tuning job. Because the <code>Hyperband</code> strategy has its own advanced internal early stopping mechanism, <code>TrainingJobEarlyStoppingType</code> must be <code>OFF</code> to use <code>Hyperband</code>. This parameter can take on one of the following values (the default value is <code>OFF</code>):</p>
        /// <dl>
        /// <dt>
        /// OFF
        /// </dt>
        /// <dd>
        /// <p>Training jobs launched by the hyperparameter tuning job do not use early stopping.</p>
        /// </dd>
        /// <dt>
        /// AUTO
        /// </dt>
        /// <dd>
        /// <p>SageMaker stops training jobs launched by the hyperparameter tuning job when they are unlikely to perform better than previously completed training jobs. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">Stop Training Jobs Early</a>.</p>
        /// </dd>
        /// </dl>
        pub fn set_training_job_early_stopping_type(
            mut self,
            input: std::option::Option<crate::model::TrainingJobEarlyStoppingType>,
        ) -> Self {
            self.training_job_early_stopping_type = input;
            self
        }
        /// <p>The tuning job's completion criteria.</p>
        pub fn tuning_job_completion_criteria(
            mut self,
            input: crate::model::TuningJobCompletionCriteria,
        ) -> Self {
            self.tuning_job_completion_criteria = Some(input);
            self
        }
        /// <p>The tuning job's completion criteria.</p>
        pub fn set_tuning_job_completion_criteria(
            mut self,
            input: std::option::Option<crate::model::TuningJobCompletionCriteria>,
        ) -> Self {
            self.tuning_job_completion_criteria = input;
            self
        }
        /// <p>A value used to initialize a pseudo-random number generator. Setting a random seed and using the same seed later for the same tuning job will allow hyperparameter optimization to find more a consistent hyperparameter configuration between the two runs.</p>
        pub fn random_seed(mut self, input: i32) -> Self {
            self.random_seed = Some(input);
            self
        }
        /// <p>A value used to initialize a pseudo-random number generator. Setting a random seed and using the same seed later for the same tuning job will allow hyperparameter optimization to find more a consistent hyperparameter configuration between the two runs.</p>
        pub fn set_random_seed(mut self, input: std::option::Option<i32>) -> Self {
            self.random_seed = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningJobConfig`](crate::model::HyperParameterTuningJobConfig).
        pub fn build(self) -> crate::model::HyperParameterTuningJobConfig {
            crate::model::HyperParameterTuningJobConfig {
                strategy: self.strategy,
                strategy_config: self.strategy_config,
                hyper_parameter_tuning_job_objective: self.hyper_parameter_tuning_job_objective,
                resource_limits: self.resource_limits,
                parameter_ranges: self.parameter_ranges,
                training_job_early_stopping_type: self.training_job_early_stopping_type,
                tuning_job_completion_criteria: self.tuning_job_completion_criteria,
                random_seed: self.random_seed,
            }
        }
    }
}
impl HyperParameterTuningJobConfig {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningJobConfig`](crate::model::HyperParameterTuningJobConfig).
    pub fn builder() -> crate::model::hyper_parameter_tuning_job_config::Builder {
        crate::model::hyper_parameter_tuning_job_config::Builder::default()
    }
}

/// <p>The job completion criteria.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TuningJobCompletionCriteria {
    /// <p>The value of the objective metric.</p>
    #[doc(hidden)]
    pub target_objective_metric_value: std::option::Option<f32>,
}
impl TuningJobCompletionCriteria {
    /// <p>The value of the objective metric.</p>
    pub fn target_objective_metric_value(&self) -> std::option::Option<f32> {
        self.target_objective_metric_value
    }
}
/// See [`TuningJobCompletionCriteria`](crate::model::TuningJobCompletionCriteria).
pub mod tuning_job_completion_criteria {

    /// A builder for [`TuningJobCompletionCriteria`](crate::model::TuningJobCompletionCriteria).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) target_objective_metric_value: std::option::Option<f32>,
    }
    impl Builder {
        /// <p>The value of the objective metric.</p>
        pub fn target_objective_metric_value(mut self, input: f32) -> Self {
            self.target_objective_metric_value = Some(input);
            self
        }
        /// <p>The value of the objective metric.</p>
        pub fn set_target_objective_metric_value(
            mut self,
            input: std::option::Option<f32>,
        ) -> Self {
            self.target_objective_metric_value = input;
            self
        }
        /// Consumes the builder and constructs a [`TuningJobCompletionCriteria`](crate::model::TuningJobCompletionCriteria).
        pub fn build(self) -> crate::model::TuningJobCompletionCriteria {
            crate::model::TuningJobCompletionCriteria {
                target_objective_metric_value: self.target_objective_metric_value,
            }
        }
    }
}
impl TuningJobCompletionCriteria {
    /// Creates a new builder-style object to manufacture [`TuningJobCompletionCriteria`](crate::model::TuningJobCompletionCriteria).
    pub fn builder() -> crate::model::tuning_job_completion_criteria::Builder {
        crate::model::tuning_job_completion_criteria::Builder::default()
    }
}

/// When writing a match expression against `TrainingJobEarlyStoppingType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let trainingjobearlystoppingtype = unimplemented!();
/// match trainingjobearlystoppingtype {
///     TrainingJobEarlyStoppingType::Auto => { /* ... */ },
///     TrainingJobEarlyStoppingType::Off => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `trainingjobearlystoppingtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrainingJobEarlyStoppingType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrainingJobEarlyStoppingType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrainingJobEarlyStoppingType::NewFeature` is defined.
/// Specifically, when `trainingjobearlystoppingtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrainingJobEarlyStoppingType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrainingJobEarlyStoppingType {
    #[allow(missing_docs)] // documentation missing in model
    Auto,
    #[allow(missing_docs)] // documentation missing in model
    Off,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrainingJobEarlyStoppingType {
    fn from(s: &str) -> Self {
        match s {
            "Auto" => TrainingJobEarlyStoppingType::Auto,
            "Off" => TrainingJobEarlyStoppingType::Off,
            other => TrainingJobEarlyStoppingType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for TrainingJobEarlyStoppingType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrainingJobEarlyStoppingType::from(s))
    }
}
impl TrainingJobEarlyStoppingType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrainingJobEarlyStoppingType::Auto => "Auto",
            TrainingJobEarlyStoppingType::Off => "Off",
            TrainingJobEarlyStoppingType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Auto", "Off"]
    }
}
impl AsRef<str> for TrainingJobEarlyStoppingType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies the maximum number of training jobs and parallel training jobs that a hyperparameter tuning job can launch.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ResourceLimits {
    /// <p>The maximum number of training jobs that a hyperparameter tuning job can launch.</p>
    #[doc(hidden)]
    pub max_number_of_training_jobs: std::option::Option<i32>,
    /// <p>The maximum number of concurrent training jobs that a hyperparameter tuning job can launch.</p>
    #[doc(hidden)]
    pub max_parallel_training_jobs: i32,
}
impl ResourceLimits {
    /// <p>The maximum number of training jobs that a hyperparameter tuning job can launch.</p>
    pub fn max_number_of_training_jobs(&self) -> std::option::Option<i32> {
        self.max_number_of_training_jobs
    }
    /// <p>The maximum number of concurrent training jobs that a hyperparameter tuning job can launch.</p>
    pub fn max_parallel_training_jobs(&self) -> i32 {
        self.max_parallel_training_jobs
    }
}
/// See [`ResourceLimits`](crate::model::ResourceLimits).
pub mod resource_limits {

    /// A builder for [`ResourceLimits`](crate::model::ResourceLimits).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_number_of_training_jobs: std::option::Option<i32>,
        pub(crate) max_parallel_training_jobs: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The maximum number of training jobs that a hyperparameter tuning job can launch.</p>
        pub fn max_number_of_training_jobs(mut self, input: i32) -> Self {
            self.max_number_of_training_jobs = Some(input);
            self
        }
        /// <p>The maximum number of training jobs that a hyperparameter tuning job can launch.</p>
        pub fn set_max_number_of_training_jobs(mut self, input: std::option::Option<i32>) -> Self {
            self.max_number_of_training_jobs = input;
            self
        }
        /// <p>The maximum number of concurrent training jobs that a hyperparameter tuning job can launch.</p>
        pub fn max_parallel_training_jobs(mut self, input: i32) -> Self {
            self.max_parallel_training_jobs = Some(input);
            self
        }
        /// <p>The maximum number of concurrent training jobs that a hyperparameter tuning job can launch.</p>
        pub fn set_max_parallel_training_jobs(mut self, input: std::option::Option<i32>) -> Self {
            self.max_parallel_training_jobs = input;
            self
        }
        /// Consumes the builder and constructs a [`ResourceLimits`](crate::model::ResourceLimits).
        pub fn build(self) -> crate::model::ResourceLimits {
            crate::model::ResourceLimits {
                max_number_of_training_jobs: self.max_number_of_training_jobs,
                max_parallel_training_jobs: self.max_parallel_training_jobs.unwrap_or_default(),
            }
        }
    }
}
impl ResourceLimits {
    /// Creates a new builder-style object to manufacture [`ResourceLimits`](crate::model::ResourceLimits).
    pub fn builder() -> crate::model::resource_limits::Builder {
        crate::model::resource_limits::Builder::default()
    }
}

/// <p>The configuration for a training job launched by a hyperparameter tuning job. Choose <code>Bayesian</code> for Bayesian optimization, and <code>Random</code> for random search optimization. For more advanced use cases, use <code>Hyperband</code>, which evaluates objective metrics for training jobs after every epoch. For more information about strategies, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html">How Hyperparameter Tuning Works</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningJobStrategyConfig {
    /// <p>The configuration for the object that specifies the <code>Hyperband</code> strategy. This parameter is only supported for the <code>Hyperband</code> selection for <code>Strategy</code> within the <code>HyperParameterTuningJobConfig</code> API.</p>
    #[doc(hidden)]
    pub hyperband_strategy_config: std::option::Option<crate::model::HyperbandStrategyConfig>,
}
impl HyperParameterTuningJobStrategyConfig {
    /// <p>The configuration for the object that specifies the <code>Hyperband</code> strategy. This parameter is only supported for the <code>Hyperband</code> selection for <code>Strategy</code> within the <code>HyperParameterTuningJobConfig</code> API.</p>
    pub fn hyperband_strategy_config(
        &self,
    ) -> std::option::Option<&crate::model::HyperbandStrategyConfig> {
        self.hyperband_strategy_config.as_ref()
    }
}
/// See [`HyperParameterTuningJobStrategyConfig`](crate::model::HyperParameterTuningJobStrategyConfig).
pub mod hyper_parameter_tuning_job_strategy_config {

    /// A builder for [`HyperParameterTuningJobStrategyConfig`](crate::model::HyperParameterTuningJobStrategyConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) hyperband_strategy_config:
            std::option::Option<crate::model::HyperbandStrategyConfig>,
    }
    impl Builder {
        /// <p>The configuration for the object that specifies the <code>Hyperband</code> strategy. This parameter is only supported for the <code>Hyperband</code> selection for <code>Strategy</code> within the <code>HyperParameterTuningJobConfig</code> API.</p>
        pub fn hyperband_strategy_config(
            mut self,
            input: crate::model::HyperbandStrategyConfig,
        ) -> Self {
            self.hyperband_strategy_config = Some(input);
            self
        }
        /// <p>The configuration for the object that specifies the <code>Hyperband</code> strategy. This parameter is only supported for the <code>Hyperband</code> selection for <code>Strategy</code> within the <code>HyperParameterTuningJobConfig</code> API.</p>
        pub fn set_hyperband_strategy_config(
            mut self,
            input: std::option::Option<crate::model::HyperbandStrategyConfig>,
        ) -> Self {
            self.hyperband_strategy_config = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningJobStrategyConfig`](crate::model::HyperParameterTuningJobStrategyConfig).
        pub fn build(self) -> crate::model::HyperParameterTuningJobStrategyConfig {
            crate::model::HyperParameterTuningJobStrategyConfig {
                hyperband_strategy_config: self.hyperband_strategy_config,
            }
        }
    }
}
impl HyperParameterTuningJobStrategyConfig {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningJobStrategyConfig`](crate::model::HyperParameterTuningJobStrategyConfig).
    pub fn builder() -> crate::model::hyper_parameter_tuning_job_strategy_config::Builder {
        crate::model::hyper_parameter_tuning_job_strategy_config::Builder::default()
    }
}

/// <p>The configuration for <code>Hyperband</code>, a multi-fidelity based hyperparameter tuning strategy. <code>Hyperband</code> uses the final and intermediate results of a training job to dynamically allocate resources to utilized hyperparameter configurations while automatically stopping under-performing configurations. This parameter should be provided only if <code>Hyperband</code> is selected as the <code>StrategyConfig</code> under the <code>HyperParameterTuningJobConfig</code> API.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperbandStrategyConfig {
    /// <p>The minimum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. If the value for <code>MinResource</code> has not been reached, the training job will not be stopped by <code>Hyperband</code>.</p>
    #[doc(hidden)]
    pub min_resource: std::option::Option<i32>,
    /// <p>The maximum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. Once a job reaches the <code>MaxResource</code> value, it is stopped. If a value for <code>MaxResource</code> is not provided, and <code>Hyperband</code> is selected as the hyperparameter tuning strategy, <code>HyperbandTrainingJ</code> attempts to infer <code>MaxResource</code> from the following keys (if present) in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTrainingJobDefinition.html#sagemaker-Type-HyperParameterTrainingJobDefinition-StaticHyperParameters">StaticsHyperParameters</a>:</p>
    /// <ul>
    /// <li> <p> <code>epochs</code> </p> </li>
    /// <li> <p> <code>numepochs</code> </p> </li>
    /// <li> <p> <code>n-epochs</code> </p> </li>
    /// <li> <p> <code>n_epochs</code> </p> </li>
    /// <li> <p> <code>num_epochs</code> </p> </li>
    /// </ul>
    /// <p>If <code>HyperbandStrategyConfig</code> is unable to infer a value for <code>MaxResource</code>, it generates a validation error. The maximum value is 20,000 epochs. All metrics that correspond to an objective metric are used to derive <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">early stopping decisions</a>. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-training.html">distributive</a> training jobs, ensure that duplicate metrics are not printed in the logs across the individual nodes in a training job. If multiple nodes are publishing duplicate or incorrect metrics, training jobs may make an incorrect stopping decision and stop the job prematurely. </p>
    #[doc(hidden)]
    pub max_resource: std::option::Option<i32>,
}
impl HyperbandStrategyConfig {
    /// <p>The minimum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. If the value for <code>MinResource</code> has not been reached, the training job will not be stopped by <code>Hyperband</code>.</p>
    pub fn min_resource(&self) -> std::option::Option<i32> {
        self.min_resource
    }
    /// <p>The maximum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. Once a job reaches the <code>MaxResource</code> value, it is stopped. If a value for <code>MaxResource</code> is not provided, and <code>Hyperband</code> is selected as the hyperparameter tuning strategy, <code>HyperbandTrainingJ</code> attempts to infer <code>MaxResource</code> from the following keys (if present) in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTrainingJobDefinition.html#sagemaker-Type-HyperParameterTrainingJobDefinition-StaticHyperParameters">StaticsHyperParameters</a>:</p>
    /// <ul>
    /// <li> <p> <code>epochs</code> </p> </li>
    /// <li> <p> <code>numepochs</code> </p> </li>
    /// <li> <p> <code>n-epochs</code> </p> </li>
    /// <li> <p> <code>n_epochs</code> </p> </li>
    /// <li> <p> <code>num_epochs</code> </p> </li>
    /// </ul>
    /// <p>If <code>HyperbandStrategyConfig</code> is unable to infer a value for <code>MaxResource</code>, it generates a validation error. The maximum value is 20,000 epochs. All metrics that correspond to an objective metric are used to derive <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">early stopping decisions</a>. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-training.html">distributive</a> training jobs, ensure that duplicate metrics are not printed in the logs across the individual nodes in a training job. If multiple nodes are publishing duplicate or incorrect metrics, training jobs may make an incorrect stopping decision and stop the job prematurely. </p>
    pub fn max_resource(&self) -> std::option::Option<i32> {
        self.max_resource
    }
}
/// See [`HyperbandStrategyConfig`](crate::model::HyperbandStrategyConfig).
pub mod hyperband_strategy_config {

    /// A builder for [`HyperbandStrategyConfig`](crate::model::HyperbandStrategyConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) min_resource: std::option::Option<i32>,
        pub(crate) max_resource: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The minimum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. If the value for <code>MinResource</code> has not been reached, the training job will not be stopped by <code>Hyperband</code>.</p>
        pub fn min_resource(mut self, input: i32) -> Self {
            self.min_resource = Some(input);
            self
        }
        /// <p>The minimum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. If the value for <code>MinResource</code> has not been reached, the training job will not be stopped by <code>Hyperband</code>.</p>
        pub fn set_min_resource(mut self, input: std::option::Option<i32>) -> Self {
            self.min_resource = input;
            self
        }
        /// <p>The maximum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. Once a job reaches the <code>MaxResource</code> value, it is stopped. If a value for <code>MaxResource</code> is not provided, and <code>Hyperband</code> is selected as the hyperparameter tuning strategy, <code>HyperbandTrainingJ</code> attempts to infer <code>MaxResource</code> from the following keys (if present) in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTrainingJobDefinition.html#sagemaker-Type-HyperParameterTrainingJobDefinition-StaticHyperParameters">StaticsHyperParameters</a>:</p>
        /// <ul>
        /// <li> <p> <code>epochs</code> </p> </li>
        /// <li> <p> <code>numepochs</code> </p> </li>
        /// <li> <p> <code>n-epochs</code> </p> </li>
        /// <li> <p> <code>n_epochs</code> </p> </li>
        /// <li> <p> <code>num_epochs</code> </p> </li>
        /// </ul>
        /// <p>If <code>HyperbandStrategyConfig</code> is unable to infer a value for <code>MaxResource</code>, it generates a validation error. The maximum value is 20,000 epochs. All metrics that correspond to an objective metric are used to derive <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">early stopping decisions</a>. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-training.html">distributive</a> training jobs, ensure that duplicate metrics are not printed in the logs across the individual nodes in a training job. If multiple nodes are publishing duplicate or incorrect metrics, training jobs may make an incorrect stopping decision and stop the job prematurely. </p>
        pub fn max_resource(mut self, input: i32) -> Self {
            self.max_resource = Some(input);
            self
        }
        /// <p>The maximum number of resources (such as epochs) that can be used by a training job launched by a hyperparameter tuning job. Once a job reaches the <code>MaxResource</code> value, it is stopped. If a value for <code>MaxResource</code> is not provided, and <code>Hyperband</code> is selected as the hyperparameter tuning strategy, <code>HyperbandTrainingJ</code> attempts to infer <code>MaxResource</code> from the following keys (if present) in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HyperParameterTrainingJobDefinition.html#sagemaker-Type-HyperParameterTrainingJobDefinition-StaticHyperParameters">StaticsHyperParameters</a>:</p>
        /// <ul>
        /// <li> <p> <code>epochs</code> </p> </li>
        /// <li> <p> <code>numepochs</code> </p> </li>
        /// <li> <p> <code>n-epochs</code> </p> </li>
        /// <li> <p> <code>n_epochs</code> </p> </li>
        /// <li> <p> <code>num_epochs</code> </p> </li>
        /// </ul>
        /// <p>If <code>HyperbandStrategyConfig</code> is unable to infer a value for <code>MaxResource</code>, it generates a validation error. The maximum value is 20,000 epochs. All metrics that correspond to an objective metric are used to derive <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-early-stopping.html">early stopping decisions</a>. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-training.html">distributive</a> training jobs, ensure that duplicate metrics are not printed in the logs across the individual nodes in a training job. If multiple nodes are publishing duplicate or incorrect metrics, training jobs may make an incorrect stopping decision and stop the job prematurely. </p>
        pub fn set_max_resource(mut self, input: std::option::Option<i32>) -> Self {
            self.max_resource = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperbandStrategyConfig`](crate::model::HyperbandStrategyConfig).
        pub fn build(self) -> crate::model::HyperbandStrategyConfig {
            crate::model::HyperbandStrategyConfig {
                min_resource: self.min_resource,
                max_resource: self.max_resource,
            }
        }
    }
}
impl HyperbandStrategyConfig {
    /// Creates a new builder-style object to manufacture [`HyperbandStrategyConfig`](crate::model::HyperbandStrategyConfig).
    pub fn builder() -> crate::model::hyperband_strategy_config::Builder {
        crate::model::hyperband_strategy_config::Builder::default()
    }
}

/// When writing a match expression against `HyperParameterTuningJobStrategyType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparametertuningjobstrategytype = unimplemented!();
/// match hyperparametertuningjobstrategytype {
///     HyperParameterTuningJobStrategyType::Bayesian => { /* ... */ },
///     HyperParameterTuningJobStrategyType::Grid => { /* ... */ },
///     HyperParameterTuningJobStrategyType::Hyperband => { /* ... */ },
///     HyperParameterTuningJobStrategyType::Random => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparametertuningjobstrategytype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterTuningJobStrategyType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterTuningJobStrategyType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterTuningJobStrategyType::NewFeature` is defined.
/// Specifically, when `hyperparametertuningjobstrategytype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterTuningJobStrategyType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// <p>The strategy hyperparameter tuning uses to
/// find
/// the best combination of hyperparameters for your model. Currently,
/// the only
/// supported
/// value is <code>Bayesian</code>.</p>
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterTuningJobStrategyType {
    #[allow(missing_docs)] // documentation missing in model
    Bayesian,
    #[allow(missing_docs)] // documentation missing in model
    Grid,
    #[allow(missing_docs)] // documentation missing in model
    Hyperband,
    #[allow(missing_docs)] // documentation missing in model
    Random,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterTuningJobStrategyType {
    fn from(s: &str) -> Self {
        match s {
            "Bayesian" => HyperParameterTuningJobStrategyType::Bayesian,
            "Grid" => HyperParameterTuningJobStrategyType::Grid,
            "Hyperband" => HyperParameterTuningJobStrategyType::Hyperband,
            "Random" => HyperParameterTuningJobStrategyType::Random,
            other => HyperParameterTuningJobStrategyType::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for HyperParameterTuningJobStrategyType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterTuningJobStrategyType::from(s))
    }
}
impl HyperParameterTuningJobStrategyType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterTuningJobStrategyType::Bayesian => "Bayesian",
            HyperParameterTuningJobStrategyType::Grid => "Grid",
            HyperParameterTuningJobStrategyType::Hyperband => "Hyperband",
            HyperParameterTuningJobStrategyType::Random => "Random",
            HyperParameterTuningJobStrategyType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Bayesian", "Grid", "Hyperband", "Random"]
    }
}
impl AsRef<str> for HyperParameterTuningJobStrategyType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The metadata for a feature. It can either be metadata that you specify, or metadata that is updated automatically.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FeatureMetadata {
    /// <p>The Amazon Resource Number (ARN) of the feature group.</p>
    #[doc(hidden)]
    pub feature_group_arn: std::option::Option<std::string::String>,
    /// <p>The name of the feature group containing the feature.</p>
    #[doc(hidden)]
    pub feature_group_name: std::option::Option<std::string::String>,
    /// <p>The name of feature.</p>
    #[doc(hidden)]
    pub feature_name: std::option::Option<std::string::String>,
    /// <p>The data type of the feature.</p>
    #[doc(hidden)]
    pub feature_type: std::option::Option<crate::model::FeatureType>,
    /// <p>A timestamp indicating when the feature was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp indicating when the feature was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>An optional description that you specify to better describe the feature.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>Optional key-value pairs that you specify to better describe the feature.</p>
    #[doc(hidden)]
    pub parameters: std::option::Option<std::vec::Vec<crate::model::FeatureParameter>>,
}
impl FeatureMetadata {
    /// <p>The Amazon Resource Number (ARN) of the feature group.</p>
    pub fn feature_group_arn(&self) -> std::option::Option<&str> {
        self.feature_group_arn.as_deref()
    }
    /// <p>The name of the feature group containing the feature.</p>
    pub fn feature_group_name(&self) -> std::option::Option<&str> {
        self.feature_group_name.as_deref()
    }
    /// <p>The name of feature.</p>
    pub fn feature_name(&self) -> std::option::Option<&str> {
        self.feature_name.as_deref()
    }
    /// <p>The data type of the feature.</p>
    pub fn feature_type(&self) -> std::option::Option<&crate::model::FeatureType> {
        self.feature_type.as_ref()
    }
    /// <p>A timestamp indicating when the feature was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp indicating when the feature was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>An optional description that you specify to better describe the feature.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>Optional key-value pairs that you specify to better describe the feature.</p>
    pub fn parameters(&self) -> std::option::Option<&[crate::model::FeatureParameter]> {
        self.parameters.as_deref()
    }
}
/// See [`FeatureMetadata`](crate::model::FeatureMetadata).
pub mod feature_metadata {

    /// A builder for [`FeatureMetadata`](crate::model::FeatureMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) feature_group_arn: std::option::Option<std::string::String>,
        pub(crate) feature_group_name: std::option::Option<std::string::String>,
        pub(crate) feature_name: std::option::Option<std::string::String>,
        pub(crate) feature_type: std::option::Option<crate::model::FeatureType>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) parameters: std::option::Option<std::vec::Vec<crate::model::FeatureParameter>>,
    }
    impl Builder {
        /// <p>The Amazon Resource Number (ARN) of the feature group.</p>
        pub fn feature_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Number (ARN) of the feature group.</p>
        pub fn set_feature_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_arn = input;
            self
        }
        /// <p>The name of the feature group containing the feature.</p>
        pub fn feature_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_name = Some(input.into());
            self
        }
        /// <p>The name of the feature group containing the feature.</p>
        pub fn set_feature_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_name = input;
            self
        }
        /// <p>The name of feature.</p>
        pub fn feature_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_name = Some(input.into());
            self
        }
        /// <p>The name of feature.</p>
        pub fn set_feature_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.feature_name = input;
            self
        }
        /// <p>The data type of the feature.</p>
        pub fn feature_type(mut self, input: crate::model::FeatureType) -> Self {
            self.feature_type = Some(input);
            self
        }
        /// <p>The data type of the feature.</p>
        pub fn set_feature_type(
            mut self,
            input: std::option::Option<crate::model::FeatureType>,
        ) -> Self {
            self.feature_type = input;
            self
        }
        /// <p>A timestamp indicating when the feature was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp indicating when the feature was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp indicating when the feature was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp indicating when the feature was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>An optional description that you specify to better describe the feature.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>An optional description that you specify to better describe the feature.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// Appends an item to `parameters`.
        ///
        /// To override the contents of this collection use [`set_parameters`](Self::set_parameters).
        ///
        /// <p>Optional key-value pairs that you specify to better describe the feature.</p>
        pub fn parameters(mut self, input: crate::model::FeatureParameter) -> Self {
            let mut v = self.parameters.unwrap_or_default();
            v.push(input);
            self.parameters = Some(v);
            self
        }
        /// <p>Optional key-value pairs that you specify to better describe the feature.</p>
        pub fn set_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::FeatureParameter>>,
        ) -> Self {
            self.parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`FeatureMetadata`](crate::model::FeatureMetadata).
        pub fn build(self) -> crate::model::FeatureMetadata {
            crate::model::FeatureMetadata {
                feature_group_arn: self.feature_group_arn,
                feature_group_name: self.feature_group_name,
                feature_name: self.feature_name,
                feature_type: self.feature_type,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                description: self.description,
                parameters: self.parameters,
            }
        }
    }
}
impl FeatureMetadata {
    /// Creates a new builder-style object to manufacture [`FeatureMetadata`](crate::model::FeatureMetadata).
    pub fn builder() -> crate::model::feature_metadata::Builder {
        crate::model::feature_metadata::Builder::default()
    }
}

/// <p>The properties of a project as returned by the Search API.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Project {
    /// <p>The Amazon Resource Name (ARN) of the project.</p>
    #[doc(hidden)]
    pub project_arn: std::option::Option<std::string::String>,
    /// <p>The name of the project.</p>
    #[doc(hidden)]
    pub project_name: std::option::Option<std::string::String>,
    /// <p>The ID of the project.</p>
    #[doc(hidden)]
    pub project_id: std::option::Option<std::string::String>,
    /// <p>The description of the project.</p>
    #[doc(hidden)]
    pub project_description: std::option::Option<std::string::String>,
    /// <p>Details that you specify to provision a service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
    #[doc(hidden)]
    pub service_catalog_provisioning_details:
        std::option::Option<crate::model::ServiceCatalogProvisioningDetails>,
    /// <p>Details of a provisioned service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
    #[doc(hidden)]
    pub service_catalog_provisioned_product_details:
        std::option::Option<crate::model::ServiceCatalogProvisionedProductDetails>,
    /// <p>The status of the project.</p>
    #[doc(hidden)]
    pub project_status: std::option::Option<crate::model::ProjectStatus>,
    /// <p>Who created the project.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>A timestamp specifying when the project was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>A timestamp container for when the project was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
}
impl Project {
    /// <p>The Amazon Resource Name (ARN) of the project.</p>
    pub fn project_arn(&self) -> std::option::Option<&str> {
        self.project_arn.as_deref()
    }
    /// <p>The name of the project.</p>
    pub fn project_name(&self) -> std::option::Option<&str> {
        self.project_name.as_deref()
    }
    /// <p>The ID of the project.</p>
    pub fn project_id(&self) -> std::option::Option<&str> {
        self.project_id.as_deref()
    }
    /// <p>The description of the project.</p>
    pub fn project_description(&self) -> std::option::Option<&str> {
        self.project_description.as_deref()
    }
    /// <p>Details that you specify to provision a service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
    pub fn service_catalog_provisioning_details(
        &self,
    ) -> std::option::Option<&crate::model::ServiceCatalogProvisioningDetails> {
        self.service_catalog_provisioning_details.as_ref()
    }
    /// <p>Details of a provisioned service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
    pub fn service_catalog_provisioned_product_details(
        &self,
    ) -> std::option::Option<&crate::model::ServiceCatalogProvisionedProductDetails> {
        self.service_catalog_provisioned_product_details.as_ref()
    }
    /// <p>The status of the project.</p>
    pub fn project_status(&self) -> std::option::Option<&crate::model::ProjectStatus> {
        self.project_status.as_ref()
    }
    /// <p>Who created the project.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>A timestamp specifying when the project was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>A timestamp container for when the project was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
}
/// See [`Project`](crate::model::Project).
pub mod project {

    /// A builder for [`Project`](crate::model::Project).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) project_arn: std::option::Option<std::string::String>,
        pub(crate) project_name: std::option::Option<std::string::String>,
        pub(crate) project_id: std::option::Option<std::string::String>,
        pub(crate) project_description: std::option::Option<std::string::String>,
        pub(crate) service_catalog_provisioning_details:
            std::option::Option<crate::model::ServiceCatalogProvisioningDetails>,
        pub(crate) service_catalog_provisioned_product_details:
            std::option::Option<crate::model::ServiceCatalogProvisionedProductDetails>,
        pub(crate) project_status: std::option::Option<crate::model::ProjectStatus>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the project.</p>
        pub fn project_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the project.</p>
        pub fn set_project_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_arn = input;
            self
        }
        /// <p>The name of the project.</p>
        pub fn project_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_name = Some(input.into());
            self
        }
        /// <p>The name of the project.</p>
        pub fn set_project_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_name = input;
            self
        }
        /// <p>The ID of the project.</p>
        pub fn project_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_id = Some(input.into());
            self
        }
        /// <p>The ID of the project.</p>
        pub fn set_project_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_id = input;
            self
        }
        /// <p>The description of the project.</p>
        pub fn project_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_description = Some(input.into());
            self
        }
        /// <p>The description of the project.</p>
        pub fn set_project_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.project_description = input;
            self
        }
        /// <p>Details that you specify to provision a service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
        pub fn service_catalog_provisioning_details(
            mut self,
            input: crate::model::ServiceCatalogProvisioningDetails,
        ) -> Self {
            self.service_catalog_provisioning_details = Some(input);
            self
        }
        /// <p>Details that you specify to provision a service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
        pub fn set_service_catalog_provisioning_details(
            mut self,
            input: std::option::Option<crate::model::ServiceCatalogProvisioningDetails>,
        ) -> Self {
            self.service_catalog_provisioning_details = input;
            self
        }
        /// <p>Details of a provisioned service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
        pub fn service_catalog_provisioned_product_details(
            mut self,
            input: crate::model::ServiceCatalogProvisionedProductDetails,
        ) -> Self {
            self.service_catalog_provisioned_product_details = Some(input);
            self
        }
        /// <p>Details of a provisioned service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
        pub fn set_service_catalog_provisioned_product_details(
            mut self,
            input: std::option::Option<crate::model::ServiceCatalogProvisionedProductDetails>,
        ) -> Self {
            self.service_catalog_provisioned_product_details = input;
            self
        }
        /// <p>The status of the project.</p>
        pub fn project_status(mut self, input: crate::model::ProjectStatus) -> Self {
            self.project_status = Some(input);
            self
        }
        /// <p>The status of the project.</p>
        pub fn set_project_status(
            mut self,
            input: std::option::Option<crate::model::ProjectStatus>,
        ) -> Self {
            self.project_status = input;
            self
        }
        /// <p>Who created the project.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Who created the project.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>A timestamp specifying when the project was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp specifying when the project was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// <p>A timestamp container for when the project was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp container for when the project was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// Consumes the builder and constructs a [`Project`](crate::model::Project).
        pub fn build(self) -> crate::model::Project {
            crate::model::Project {
                project_arn: self.project_arn,
                project_name: self.project_name,
                project_id: self.project_id,
                project_description: self.project_description,
                service_catalog_provisioning_details: self.service_catalog_provisioning_details,
                service_catalog_provisioned_product_details: self
                    .service_catalog_provisioned_product_details,
                project_status: self.project_status,
                created_by: self.created_by,
                creation_time: self.creation_time,
                tags: self.tags,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
            }
        }
    }
}
impl Project {
    /// Creates a new builder-style object to manufacture [`Project`](crate::model::Project).
    pub fn builder() -> crate::model::project::Builder {
        crate::model::project::Builder::default()
    }
}

/// When writing a match expression against `ProjectStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let projectstatus = unimplemented!();
/// match projectstatus {
///     ProjectStatus::CreateCompleted => { /* ... */ },
///     ProjectStatus::CreateFailed => { /* ... */ },
///     ProjectStatus::CreateInProgress => { /* ... */ },
///     ProjectStatus::DeleteCompleted => { /* ... */ },
///     ProjectStatus::DeleteFailed => { /* ... */ },
///     ProjectStatus::DeleteInProgress => { /* ... */ },
///     ProjectStatus::Pending => { /* ... */ },
///     ProjectStatus::UpdateCompleted => { /* ... */ },
///     ProjectStatus::UpdateFailed => { /* ... */ },
///     ProjectStatus::UpdateInProgress => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `projectstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProjectStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProjectStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProjectStatus::NewFeature` is defined.
/// Specifically, when `projectstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProjectStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProjectStatus {
    #[allow(missing_docs)] // documentation missing in model
    CreateCompleted,
    #[allow(missing_docs)] // documentation missing in model
    CreateFailed,
    #[allow(missing_docs)] // documentation missing in model
    CreateInProgress,
    #[allow(missing_docs)] // documentation missing in model
    DeleteCompleted,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    DeleteInProgress,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    UpdateCompleted,
    #[allow(missing_docs)] // documentation missing in model
    UpdateFailed,
    #[allow(missing_docs)] // documentation missing in model
    UpdateInProgress,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProjectStatus {
    fn from(s: &str) -> Self {
        match s {
            "CreateCompleted" => ProjectStatus::CreateCompleted,
            "CreateFailed" => ProjectStatus::CreateFailed,
            "CreateInProgress" => ProjectStatus::CreateInProgress,
            "DeleteCompleted" => ProjectStatus::DeleteCompleted,
            "DeleteFailed" => ProjectStatus::DeleteFailed,
            "DeleteInProgress" => ProjectStatus::DeleteInProgress,
            "Pending" => ProjectStatus::Pending,
            "UpdateCompleted" => ProjectStatus::UpdateCompleted,
            "UpdateFailed" => ProjectStatus::UpdateFailed,
            "UpdateInProgress" => ProjectStatus::UpdateInProgress,
            other => ProjectStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ProjectStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProjectStatus::from(s))
    }
}
impl ProjectStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProjectStatus::CreateCompleted => "CreateCompleted",
            ProjectStatus::CreateFailed => "CreateFailed",
            ProjectStatus::CreateInProgress => "CreateInProgress",
            ProjectStatus::DeleteCompleted => "DeleteCompleted",
            ProjectStatus::DeleteFailed => "DeleteFailed",
            ProjectStatus::DeleteInProgress => "DeleteInProgress",
            ProjectStatus::Pending => "Pending",
            ProjectStatus::UpdateCompleted => "UpdateCompleted",
            ProjectStatus::UpdateFailed => "UpdateFailed",
            ProjectStatus::UpdateInProgress => "UpdateInProgress",
            ProjectStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CreateCompleted",
            "CreateFailed",
            "CreateInProgress",
            "DeleteCompleted",
            "DeleteFailed",
            "DeleteInProgress",
            "Pending",
            "UpdateCompleted",
            "UpdateFailed",
            "UpdateInProgress",
        ]
    }
}
impl AsRef<str> for ProjectStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Details of a provisioned service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ServiceCatalogProvisionedProductDetails {
    /// <p>The ID of the provisioned product.</p>
    #[doc(hidden)]
    pub provisioned_product_id: std::option::Option<std::string::String>,
    /// <p>The current status of the product.</p>
    /// <ul>
    /// <li> <p> <code>AVAILABLE</code> - Stable state, ready to perform any operation. The most recent operation succeeded and completed.</p> </li>
    /// <li> <p> <code>UNDER_CHANGE</code> - Transitive state. Operations performed might not have valid results. Wait for an AVAILABLE status before performing operations.</p> </li>
    /// <li> <p> <code>TAINTED</code> - Stable state, ready to perform any operation. The stack has completed the requested operation but is not exactly what was requested. For example, a request to update to a new version failed and the stack rolled back to the current version.</p> </li>
    /// <li> <p> <code>ERROR</code> - An unexpected error occurred. The provisioned product exists but the stack is not running. For example, CloudFormation received a parameter value that was not valid and could not launch the stack.</p> </li>
    /// <li> <p> <code>PLAN_IN_PROGRESS</code> - Transitive state. The plan operations were performed to provision a new product, but resources have not yet been created. After reviewing the list of resources to be created, execute the plan. Wait for an AVAILABLE status before performing operations.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub provisioned_product_status_message: std::option::Option<std::string::String>,
}
impl ServiceCatalogProvisionedProductDetails {
    /// <p>The ID of the provisioned product.</p>
    pub fn provisioned_product_id(&self) -> std::option::Option<&str> {
        self.provisioned_product_id.as_deref()
    }
    /// <p>The current status of the product.</p>
    /// <ul>
    /// <li> <p> <code>AVAILABLE</code> - Stable state, ready to perform any operation. The most recent operation succeeded and completed.</p> </li>
    /// <li> <p> <code>UNDER_CHANGE</code> - Transitive state. Operations performed might not have valid results. Wait for an AVAILABLE status before performing operations.</p> </li>
    /// <li> <p> <code>TAINTED</code> - Stable state, ready to perform any operation. The stack has completed the requested operation but is not exactly what was requested. For example, a request to update to a new version failed and the stack rolled back to the current version.</p> </li>
    /// <li> <p> <code>ERROR</code> - An unexpected error occurred. The provisioned product exists but the stack is not running. For example, CloudFormation received a parameter value that was not valid and could not launch the stack.</p> </li>
    /// <li> <p> <code>PLAN_IN_PROGRESS</code> - Transitive state. The plan operations were performed to provision a new product, but resources have not yet been created. After reviewing the list of resources to be created, execute the plan. Wait for an AVAILABLE status before performing operations.</p> </li>
    /// </ul>
    pub fn provisioned_product_status_message(&self) -> std::option::Option<&str> {
        self.provisioned_product_status_message.as_deref()
    }
}
/// See [`ServiceCatalogProvisionedProductDetails`](crate::model::ServiceCatalogProvisionedProductDetails).
pub mod service_catalog_provisioned_product_details {

    /// A builder for [`ServiceCatalogProvisionedProductDetails`](crate::model::ServiceCatalogProvisionedProductDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) provisioned_product_id: std::option::Option<std::string::String>,
        pub(crate) provisioned_product_status_message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The ID of the provisioned product.</p>
        pub fn provisioned_product_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.provisioned_product_id = Some(input.into());
            self
        }
        /// <p>The ID of the provisioned product.</p>
        pub fn set_provisioned_product_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.provisioned_product_id = input;
            self
        }
        /// <p>The current status of the product.</p>
        /// <ul>
        /// <li> <p> <code>AVAILABLE</code> - Stable state, ready to perform any operation. The most recent operation succeeded and completed.</p> </li>
        /// <li> <p> <code>UNDER_CHANGE</code> - Transitive state. Operations performed might not have valid results. Wait for an AVAILABLE status before performing operations.</p> </li>
        /// <li> <p> <code>TAINTED</code> - Stable state, ready to perform any operation. The stack has completed the requested operation but is not exactly what was requested. For example, a request to update to a new version failed and the stack rolled back to the current version.</p> </li>
        /// <li> <p> <code>ERROR</code> - An unexpected error occurred. The provisioned product exists but the stack is not running. For example, CloudFormation received a parameter value that was not valid and could not launch the stack.</p> </li>
        /// <li> <p> <code>PLAN_IN_PROGRESS</code> - Transitive state. The plan operations were performed to provision a new product, but resources have not yet been created. After reviewing the list of resources to be created, execute the plan. Wait for an AVAILABLE status before performing operations.</p> </li>
        /// </ul>
        pub fn provisioned_product_status_message(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.provisioned_product_status_message = Some(input.into());
            self
        }
        /// <p>The current status of the product.</p>
        /// <ul>
        /// <li> <p> <code>AVAILABLE</code> - Stable state, ready to perform any operation. The most recent operation succeeded and completed.</p> </li>
        /// <li> <p> <code>UNDER_CHANGE</code> - Transitive state. Operations performed might not have valid results. Wait for an AVAILABLE status before performing operations.</p> </li>
        /// <li> <p> <code>TAINTED</code> - Stable state, ready to perform any operation. The stack has completed the requested operation but is not exactly what was requested. For example, a request to update to a new version failed and the stack rolled back to the current version.</p> </li>
        /// <li> <p> <code>ERROR</code> - An unexpected error occurred. The provisioned product exists but the stack is not running. For example, CloudFormation received a parameter value that was not valid and could not launch the stack.</p> </li>
        /// <li> <p> <code>PLAN_IN_PROGRESS</code> - Transitive state. The plan operations were performed to provision a new product, but resources have not yet been created. After reviewing the list of resources to be created, execute the plan. Wait for an AVAILABLE status before performing operations.</p> </li>
        /// </ul>
        pub fn set_provisioned_product_status_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.provisioned_product_status_message = input;
            self
        }
        /// Consumes the builder and constructs a [`ServiceCatalogProvisionedProductDetails`](crate::model::ServiceCatalogProvisionedProductDetails).
        pub fn build(self) -> crate::model::ServiceCatalogProvisionedProductDetails {
            crate::model::ServiceCatalogProvisionedProductDetails {
                provisioned_product_id: self.provisioned_product_id,
                provisioned_product_status_message: self.provisioned_product_status_message,
            }
        }
    }
}
impl ServiceCatalogProvisionedProductDetails {
    /// Creates a new builder-style object to manufacture [`ServiceCatalogProvisionedProductDetails`](crate::model::ServiceCatalogProvisionedProductDetails).
    pub fn builder() -> crate::model::service_catalog_provisioned_product_details::Builder {
        crate::model::service_catalog_provisioned_product_details::Builder::default()
    }
}

/// <p>Details that you specify to provision a service catalog product. For information about service catalog, see <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html">What is Amazon Web Services Service Catalog</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ServiceCatalogProvisioningDetails {
    /// <p>The ID of the product to provision.</p>
    #[doc(hidden)]
    pub product_id: std::option::Option<std::string::String>,
    /// <p>The ID of the provisioning artifact.</p>
    #[doc(hidden)]
    pub provisioning_artifact_id: std::option::Option<std::string::String>,
    /// <p>The path identifier of the product. This value is optional if the product has a default path, and required if the product has more than one path. </p>
    #[doc(hidden)]
    pub path_id: std::option::Option<std::string::String>,
    /// <p>A list of key value pairs that you specify when you provision a product.</p>
    #[doc(hidden)]
    pub provisioning_parameters:
        std::option::Option<std::vec::Vec<crate::model::ProvisioningParameter>>,
}
impl ServiceCatalogProvisioningDetails {
    /// <p>The ID of the product to provision.</p>
    pub fn product_id(&self) -> std::option::Option<&str> {
        self.product_id.as_deref()
    }
    /// <p>The ID of the provisioning artifact.</p>
    pub fn provisioning_artifact_id(&self) -> std::option::Option<&str> {
        self.provisioning_artifact_id.as_deref()
    }
    /// <p>The path identifier of the product. This value is optional if the product has a default path, and required if the product has more than one path. </p>
    pub fn path_id(&self) -> std::option::Option<&str> {
        self.path_id.as_deref()
    }
    /// <p>A list of key value pairs that you specify when you provision a product.</p>
    pub fn provisioning_parameters(
        &self,
    ) -> std::option::Option<&[crate::model::ProvisioningParameter]> {
        self.provisioning_parameters.as_deref()
    }
}
/// See [`ServiceCatalogProvisioningDetails`](crate::model::ServiceCatalogProvisioningDetails).
pub mod service_catalog_provisioning_details {

    /// A builder for [`ServiceCatalogProvisioningDetails`](crate::model::ServiceCatalogProvisioningDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) product_id: std::option::Option<std::string::String>,
        pub(crate) provisioning_artifact_id: std::option::Option<std::string::String>,
        pub(crate) path_id: std::option::Option<std::string::String>,
        pub(crate) provisioning_parameters:
            std::option::Option<std::vec::Vec<crate::model::ProvisioningParameter>>,
    }
    impl Builder {
        /// <p>The ID of the product to provision.</p>
        pub fn product_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.product_id = Some(input.into());
            self
        }
        /// <p>The ID of the product to provision.</p>
        pub fn set_product_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.product_id = input;
            self
        }
        /// <p>The ID of the provisioning artifact.</p>
        pub fn provisioning_artifact_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.provisioning_artifact_id = Some(input.into());
            self
        }
        /// <p>The ID of the provisioning artifact.</p>
        pub fn set_provisioning_artifact_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.provisioning_artifact_id = input;
            self
        }
        /// <p>The path identifier of the product. This value is optional if the product has a default path, and required if the product has more than one path. </p>
        pub fn path_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.path_id = Some(input.into());
            self
        }
        /// <p>The path identifier of the product. This value is optional if the product has a default path, and required if the product has more than one path. </p>
        pub fn set_path_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.path_id = input;
            self
        }
        /// Appends an item to `provisioning_parameters`.
        ///
        /// To override the contents of this collection use [`set_provisioning_parameters`](Self::set_provisioning_parameters).
        ///
        /// <p>A list of key value pairs that you specify when you provision a product.</p>
        pub fn provisioning_parameters(
            mut self,
            input: crate::model::ProvisioningParameter,
        ) -> Self {
            let mut v = self.provisioning_parameters.unwrap_or_default();
            v.push(input);
            self.provisioning_parameters = Some(v);
            self
        }
        /// <p>A list of key value pairs that you specify when you provision a product.</p>
        pub fn set_provisioning_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProvisioningParameter>>,
        ) -> Self {
            self.provisioning_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`ServiceCatalogProvisioningDetails`](crate::model::ServiceCatalogProvisioningDetails).
        pub fn build(self) -> crate::model::ServiceCatalogProvisioningDetails {
            crate::model::ServiceCatalogProvisioningDetails {
                product_id: self.product_id,
                provisioning_artifact_id: self.provisioning_artifact_id,
                path_id: self.path_id,
                provisioning_parameters: self.provisioning_parameters,
            }
        }
    }
}
impl ServiceCatalogProvisioningDetails {
    /// Creates a new builder-style object to manufacture [`ServiceCatalogProvisioningDetails`](crate::model::ServiceCatalogProvisioningDetails).
    pub fn builder() -> crate::model::service_catalog_provisioning_details::Builder {
        crate::model::service_catalog_provisioning_details::Builder::default()
    }
}

/// <p>Amazon SageMaker Feature Store stores features in a collection called Feature Group. A Feature Group can be visualized as a table which has rows, with a unique identifier for each row where each column in the table is a feature. In principle, a Feature Group is composed of features and values per features.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FeatureGroup {
    /// <p>The Amazon Resource Name (ARN) of a <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub feature_group_arn: std::option::Option<std::string::String>,
    /// <p>The name of the <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub feature_group_name: std::option::Option<std::string::String>,
    /// <p>The name of the <code>Feature</code> whose value uniquely identifies a <code>Record</code> defined in the <code>FeatureGroup</code> <code>FeatureDefinitions</code>.</p>
    #[doc(hidden)]
    pub record_identifier_feature_name: std::option::Option<std::string::String>,
    /// <p>The name of the feature that stores the <code>EventTime</code> of a Record in a <code>FeatureGroup</code>.</p>
    /// <p>A <code>EventTime</code> is point in time when a new event occurs that corresponds to the creation or update of a <code>Record</code> in <code>FeatureGroup</code>. All <code>Records</code> in the <code>FeatureGroup</code> must have a corresponding <code>EventTime</code>.</p>
    #[doc(hidden)]
    pub event_time_feature_name: std::option::Option<std::string::String>,
    /// <p>A list of <code>Feature</code>s. Each <code>Feature</code> must include a <code>FeatureName</code> and a <code>FeatureType</code>. </p>
    /// <p>Valid <code>FeatureType</code>s are <code>Integral</code>, <code>Fractional</code> and <code>String</code>. </p>
    /// <p> <code>FeatureName</code>s cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
    /// <p>You can create up to 2,500 <code>FeatureDefinition</code>s per <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub feature_definitions: std::option::Option<std::vec::Vec<crate::model::FeatureDefinition>>,
    /// <p>The time a <code>FeatureGroup</code> was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp indicating the last time you updated the feature group.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Use this to specify the Amazon Web Services Key Management Service (KMS) Key ID, or <code>KMSKeyId</code>, for at rest data encryption. You can turn <code>OnlineStore</code> on or off by specifying the <code>EnableOnlineStore</code> flag at General Assembly; the default value is <code>False</code>.</p>
    #[doc(hidden)]
    pub online_store_config: std::option::Option<crate::model::OnlineStoreConfig>,
    /// <p>The configuration of an <code>OfflineStore</code>.</p>
    /// <p>Provide an <code>OfflineStoreConfig</code> in a request to <code>CreateFeatureGroup</code> to create an <code>OfflineStore</code>.</p>
    /// <p>To encrypt an <code>OfflineStore</code> using at rest data encryption, specify Amazon Web Services Key Management Service (KMS) key ID, or <code>KMSKeyId</code>, in <code>S3StorageConfig</code>.</p>
    #[doc(hidden)]
    pub offline_store_config: std::option::Option<crate::model::OfflineStoreConfig>,
    /// <p>The Amazon Resource Name (ARN) of the IAM execution role used to create the feature group.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>A <code>FeatureGroup</code> status.</p>
    #[doc(hidden)]
    pub feature_group_status: std::option::Option<crate::model::FeatureGroupStatus>,
    /// <p>The status of <code>OfflineStore</code>.</p>
    #[doc(hidden)]
    pub offline_store_status: std::option::Option<crate::model::OfflineStoreStatus>,
    /// <p>A value that indicates whether the feature group was updated successfully.</p>
    #[doc(hidden)]
    pub last_update_status: std::option::Option<crate::model::LastUpdateStatus>,
    /// <p>The reason that the <code>FeatureGroup</code> failed to be replicated in the <code>OfflineStore</code>. This is failure may be due to a failure to create a <code>FeatureGroup</code> in or delete a <code>FeatureGroup</code> from the <code>OfflineStore</code>.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>A free form description of a <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>Tags used to define a <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl FeatureGroup {
    /// <p>The Amazon Resource Name (ARN) of a <code>FeatureGroup</code>.</p>
    pub fn feature_group_arn(&self) -> std::option::Option<&str> {
        self.feature_group_arn.as_deref()
    }
    /// <p>The name of the <code>FeatureGroup</code>.</p>
    pub fn feature_group_name(&self) -> std::option::Option<&str> {
        self.feature_group_name.as_deref()
    }
    /// <p>The name of the <code>Feature</code> whose value uniquely identifies a <code>Record</code> defined in the <code>FeatureGroup</code> <code>FeatureDefinitions</code>.</p>
    pub fn record_identifier_feature_name(&self) -> std::option::Option<&str> {
        self.record_identifier_feature_name.as_deref()
    }
    /// <p>The name of the feature that stores the <code>EventTime</code> of a Record in a <code>FeatureGroup</code>.</p>
    /// <p>A <code>EventTime</code> is point in time when a new event occurs that corresponds to the creation or update of a <code>Record</code> in <code>FeatureGroup</code>. All <code>Records</code> in the <code>FeatureGroup</code> must have a corresponding <code>EventTime</code>.</p>
    pub fn event_time_feature_name(&self) -> std::option::Option<&str> {
        self.event_time_feature_name.as_deref()
    }
    /// <p>A list of <code>Feature</code>s. Each <code>Feature</code> must include a <code>FeatureName</code> and a <code>FeatureType</code>. </p>
    /// <p>Valid <code>FeatureType</code>s are <code>Integral</code>, <code>Fractional</code> and <code>String</code>. </p>
    /// <p> <code>FeatureName</code>s cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
    /// <p>You can create up to 2,500 <code>FeatureDefinition</code>s per <code>FeatureGroup</code>.</p>
    pub fn feature_definitions(&self) -> std::option::Option<&[crate::model::FeatureDefinition]> {
        self.feature_definitions.as_deref()
    }
    /// <p>The time a <code>FeatureGroup</code> was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp indicating the last time you updated the feature group.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Use this to specify the Amazon Web Services Key Management Service (KMS) Key ID, or <code>KMSKeyId</code>, for at rest data encryption. You can turn <code>OnlineStore</code> on or off by specifying the <code>EnableOnlineStore</code> flag at General Assembly; the default value is <code>False</code>.</p>
    pub fn online_store_config(&self) -> std::option::Option<&crate::model::OnlineStoreConfig> {
        self.online_store_config.as_ref()
    }
    /// <p>The configuration of an <code>OfflineStore</code>.</p>
    /// <p>Provide an <code>OfflineStoreConfig</code> in a request to <code>CreateFeatureGroup</code> to create an <code>OfflineStore</code>.</p>
    /// <p>To encrypt an <code>OfflineStore</code> using at rest data encryption, specify Amazon Web Services Key Management Service (KMS) key ID, or <code>KMSKeyId</code>, in <code>S3StorageConfig</code>.</p>
    pub fn offline_store_config(&self) -> std::option::Option<&crate::model::OfflineStoreConfig> {
        self.offline_store_config.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the IAM execution role used to create the feature group.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>A <code>FeatureGroup</code> status.</p>
    pub fn feature_group_status(&self) -> std::option::Option<&crate::model::FeatureGroupStatus> {
        self.feature_group_status.as_ref()
    }
    /// <p>The status of <code>OfflineStore</code>.</p>
    pub fn offline_store_status(&self) -> std::option::Option<&crate::model::OfflineStoreStatus> {
        self.offline_store_status.as_ref()
    }
    /// <p>A value that indicates whether the feature group was updated successfully.</p>
    pub fn last_update_status(&self) -> std::option::Option<&crate::model::LastUpdateStatus> {
        self.last_update_status.as_ref()
    }
    /// <p>The reason that the <code>FeatureGroup</code> failed to be replicated in the <code>OfflineStore</code>. This is failure may be due to a failure to create a <code>FeatureGroup</code> in or delete a <code>FeatureGroup</code> from the <code>OfflineStore</code>.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>A free form description of a <code>FeatureGroup</code>.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>Tags used to define a <code>FeatureGroup</code>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`FeatureGroup`](crate::model::FeatureGroup).
pub mod feature_group {

    /// A builder for [`FeatureGroup`](crate::model::FeatureGroup).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) feature_group_arn: std::option::Option<std::string::String>,
        pub(crate) feature_group_name: std::option::Option<std::string::String>,
        pub(crate) record_identifier_feature_name: std::option::Option<std::string::String>,
        pub(crate) event_time_feature_name: std::option::Option<std::string::String>,
        pub(crate) feature_definitions:
            std::option::Option<std::vec::Vec<crate::model::FeatureDefinition>>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) online_store_config: std::option::Option<crate::model::OnlineStoreConfig>,
        pub(crate) offline_store_config: std::option::Option<crate::model::OfflineStoreConfig>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) feature_group_status: std::option::Option<crate::model::FeatureGroupStatus>,
        pub(crate) offline_store_status: std::option::Option<crate::model::OfflineStoreStatus>,
        pub(crate) last_update_status: std::option::Option<crate::model::LastUpdateStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of a <code>FeatureGroup</code>.</p>
        pub fn feature_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a <code>FeatureGroup</code>.</p>
        pub fn set_feature_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_arn = input;
            self
        }
        /// <p>The name of the <code>FeatureGroup</code>.</p>
        pub fn feature_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_name = Some(input.into());
            self
        }
        /// <p>The name of the <code>FeatureGroup</code>.</p>
        pub fn set_feature_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_name = input;
            self
        }
        /// <p>The name of the <code>Feature</code> whose value uniquely identifies a <code>Record</code> defined in the <code>FeatureGroup</code> <code>FeatureDefinitions</code>.</p>
        pub fn record_identifier_feature_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.record_identifier_feature_name = Some(input.into());
            self
        }
        /// <p>The name of the <code>Feature</code> whose value uniquely identifies a <code>Record</code> defined in the <code>FeatureGroup</code> <code>FeatureDefinitions</code>.</p>
        pub fn set_record_identifier_feature_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.record_identifier_feature_name = input;
            self
        }
        /// <p>The name of the feature that stores the <code>EventTime</code> of a Record in a <code>FeatureGroup</code>.</p>
        /// <p>A <code>EventTime</code> is point in time when a new event occurs that corresponds to the creation or update of a <code>Record</code> in <code>FeatureGroup</code>. All <code>Records</code> in the <code>FeatureGroup</code> must have a corresponding <code>EventTime</code>.</p>
        pub fn event_time_feature_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.event_time_feature_name = Some(input.into());
            self
        }
        /// <p>The name of the feature that stores the <code>EventTime</code> of a Record in a <code>FeatureGroup</code>.</p>
        /// <p>A <code>EventTime</code> is point in time when a new event occurs that corresponds to the creation or update of a <code>Record</code> in <code>FeatureGroup</code>. All <code>Records</code> in the <code>FeatureGroup</code> must have a corresponding <code>EventTime</code>.</p>
        pub fn set_event_time_feature_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.event_time_feature_name = input;
            self
        }
        /// Appends an item to `feature_definitions`.
        ///
        /// To override the contents of this collection use [`set_feature_definitions`](Self::set_feature_definitions).
        ///
        /// <p>A list of <code>Feature</code>s. Each <code>Feature</code> must include a <code>FeatureName</code> and a <code>FeatureType</code>. </p>
        /// <p>Valid <code>FeatureType</code>s are <code>Integral</code>, <code>Fractional</code> and <code>String</code>. </p>
        /// <p> <code>FeatureName</code>s cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
        /// <p>You can create up to 2,500 <code>FeatureDefinition</code>s per <code>FeatureGroup</code>.</p>
        pub fn feature_definitions(mut self, input: crate::model::FeatureDefinition) -> Self {
            let mut v = self.feature_definitions.unwrap_or_default();
            v.push(input);
            self.feature_definitions = Some(v);
            self
        }
        /// <p>A list of <code>Feature</code>s. Each <code>Feature</code> must include a <code>FeatureName</code> and a <code>FeatureType</code>. </p>
        /// <p>Valid <code>FeatureType</code>s are <code>Integral</code>, <code>Fractional</code> and <code>String</code>. </p>
        /// <p> <code>FeatureName</code>s cannot be any of the following: <code>is_deleted</code>, <code>write_time</code>, <code>api_invocation_time</code>.</p>
        /// <p>You can create up to 2,500 <code>FeatureDefinition</code>s per <code>FeatureGroup</code>.</p>
        pub fn set_feature_definitions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::FeatureDefinition>>,
        ) -> Self {
            self.feature_definitions = input;
            self
        }
        /// <p>The time a <code>FeatureGroup</code> was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time a <code>FeatureGroup</code> was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp indicating the last time you updated the feature group.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp indicating the last time you updated the feature group.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Use this to specify the Amazon Web Services Key Management Service (KMS) Key ID, or <code>KMSKeyId</code>, for at rest data encryption. You can turn <code>OnlineStore</code> on or off by specifying the <code>EnableOnlineStore</code> flag at General Assembly; the default value is <code>False</code>.</p>
        pub fn online_store_config(mut self, input: crate::model::OnlineStoreConfig) -> Self {
            self.online_store_config = Some(input);
            self
        }
        /// <p>Use this to specify the Amazon Web Services Key Management Service (KMS) Key ID, or <code>KMSKeyId</code>, for at rest data encryption. You can turn <code>OnlineStore</code> on or off by specifying the <code>EnableOnlineStore</code> flag at General Assembly; the default value is <code>False</code>.</p>
        pub fn set_online_store_config(
            mut self,
            input: std::option::Option<crate::model::OnlineStoreConfig>,
        ) -> Self {
            self.online_store_config = input;
            self
        }
        /// <p>The configuration of an <code>OfflineStore</code>.</p>
        /// <p>Provide an <code>OfflineStoreConfig</code> in a request to <code>CreateFeatureGroup</code> to create an <code>OfflineStore</code>.</p>
        /// <p>To encrypt an <code>OfflineStore</code> using at rest data encryption, specify Amazon Web Services Key Management Service (KMS) key ID, or <code>KMSKeyId</code>, in <code>S3StorageConfig</code>.</p>
        pub fn offline_store_config(mut self, input: crate::model::OfflineStoreConfig) -> Self {
            self.offline_store_config = Some(input);
            self
        }
        /// <p>The configuration of an <code>OfflineStore</code>.</p>
        /// <p>Provide an <code>OfflineStoreConfig</code> in a request to <code>CreateFeatureGroup</code> to create an <code>OfflineStore</code>.</p>
        /// <p>To encrypt an <code>OfflineStore</code> using at rest data encryption, specify Amazon Web Services Key Management Service (KMS) key ID, or <code>KMSKeyId</code>, in <code>S3StorageConfig</code>.</p>
        pub fn set_offline_store_config(
            mut self,
            input: std::option::Option<crate::model::OfflineStoreConfig>,
        ) -> Self {
            self.offline_store_config = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the IAM execution role used to create the feature group.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the IAM execution role used to create the feature group.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// <p>A <code>FeatureGroup</code> status.</p>
        pub fn feature_group_status(mut self, input: crate::model::FeatureGroupStatus) -> Self {
            self.feature_group_status = Some(input);
            self
        }
        /// <p>A <code>FeatureGroup</code> status.</p>
        pub fn set_feature_group_status(
            mut self,
            input: std::option::Option<crate::model::FeatureGroupStatus>,
        ) -> Self {
            self.feature_group_status = input;
            self
        }
        /// <p>The status of <code>OfflineStore</code>.</p>
        pub fn offline_store_status(mut self, input: crate::model::OfflineStoreStatus) -> Self {
            self.offline_store_status = Some(input);
            self
        }
        /// <p>The status of <code>OfflineStore</code>.</p>
        pub fn set_offline_store_status(
            mut self,
            input: std::option::Option<crate::model::OfflineStoreStatus>,
        ) -> Self {
            self.offline_store_status = input;
            self
        }
        /// <p>A value that indicates whether the feature group was updated successfully.</p>
        pub fn last_update_status(mut self, input: crate::model::LastUpdateStatus) -> Self {
            self.last_update_status = Some(input);
            self
        }
        /// <p>A value that indicates whether the feature group was updated successfully.</p>
        pub fn set_last_update_status(
            mut self,
            input: std::option::Option<crate::model::LastUpdateStatus>,
        ) -> Self {
            self.last_update_status = input;
            self
        }
        /// <p>The reason that the <code>FeatureGroup</code> failed to be replicated in the <code>OfflineStore</code>. This is failure may be due to a failure to create a <code>FeatureGroup</code> in or delete a <code>FeatureGroup</code> from the <code>OfflineStore</code>.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The reason that the <code>FeatureGroup</code> failed to be replicated in the <code>OfflineStore</code>. This is failure may be due to a failure to create a <code>FeatureGroup</code> in or delete a <code>FeatureGroup</code> from the <code>OfflineStore</code>.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>A free form description of a <code>FeatureGroup</code>.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>A free form description of a <code>FeatureGroup</code>.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>Tags used to define a <code>FeatureGroup</code>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>Tags used to define a <code>FeatureGroup</code>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`FeatureGroup`](crate::model::FeatureGroup).
        pub fn build(self) -> crate::model::FeatureGroup {
            crate::model::FeatureGroup {
                feature_group_arn: self.feature_group_arn,
                feature_group_name: self.feature_group_name,
                record_identifier_feature_name: self.record_identifier_feature_name,
                event_time_feature_name: self.event_time_feature_name,
                feature_definitions: self.feature_definitions,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                online_store_config: self.online_store_config,
                offline_store_config: self.offline_store_config,
                role_arn: self.role_arn,
                feature_group_status: self.feature_group_status,
                offline_store_status: self.offline_store_status,
                last_update_status: self.last_update_status,
                failure_reason: self.failure_reason,
                description: self.description,
                tags: self.tags,
            }
        }
    }
}
impl FeatureGroup {
    /// Creates a new builder-style object to manufacture [`FeatureGroup`](crate::model::FeatureGroup).
    pub fn builder() -> crate::model::feature_group::Builder {
        crate::model::feature_group::Builder::default()
    }
}

/// <p>A value that indicates whether the update was successful.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LastUpdateStatus {
    /// <p>A value that indicates whether the update was made successful.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::LastUpdateStatusValue>,
    /// <p>If the update wasn't successful, indicates the reason why it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl LastUpdateStatus {
    /// <p>A value that indicates whether the update was made successful.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::LastUpdateStatusValue> {
        self.status.as_ref()
    }
    /// <p>If the update wasn't successful, indicates the reason why it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`LastUpdateStatus`](crate::model::LastUpdateStatus).
pub mod last_update_status {

    /// A builder for [`LastUpdateStatus`](crate::model::LastUpdateStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) status: std::option::Option<crate::model::LastUpdateStatusValue>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A value that indicates whether the update was made successful.</p>
        pub fn status(mut self, input: crate::model::LastUpdateStatusValue) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>A value that indicates whether the update was made successful.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::LastUpdateStatusValue>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>If the update wasn't successful, indicates the reason why it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the update wasn't successful, indicates the reason why it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`LastUpdateStatus`](crate::model::LastUpdateStatus).
        pub fn build(self) -> crate::model::LastUpdateStatus {
            crate::model::LastUpdateStatus {
                status: self.status,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl LastUpdateStatus {
    /// Creates a new builder-style object to manufacture [`LastUpdateStatus`](crate::model::LastUpdateStatus).
    pub fn builder() -> crate::model::last_update_status::Builder {
        crate::model::last_update_status::Builder::default()
    }
}

/// When writing a match expression against `LastUpdateStatusValue`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let lastupdatestatusvalue = unimplemented!();
/// match lastupdatestatusvalue {
///     LastUpdateStatusValue::Failed => { /* ... */ },
///     LastUpdateStatusValue::InProgress => { /* ... */ },
///     LastUpdateStatusValue::Successful => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `lastupdatestatusvalue` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `LastUpdateStatusValue::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `LastUpdateStatusValue::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `LastUpdateStatusValue::NewFeature` is defined.
/// Specifically, when `lastupdatestatusvalue` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `LastUpdateStatusValue::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum LastUpdateStatusValue {
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Successful,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for LastUpdateStatusValue {
    fn from(s: &str) -> Self {
        match s {
            "Failed" => LastUpdateStatusValue::Failed,
            "InProgress" => LastUpdateStatusValue::InProgress,
            "Successful" => LastUpdateStatusValue::Successful,
            other => {
                LastUpdateStatusValue::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for LastUpdateStatusValue {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(LastUpdateStatusValue::from(s))
    }
}
impl LastUpdateStatusValue {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            LastUpdateStatusValue::Failed => "Failed",
            LastUpdateStatusValue::InProgress => "InProgress",
            LastUpdateStatusValue::Successful => "Successful",
            LastUpdateStatusValue::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Failed", "InProgress", "Successful"]
    }
}
impl AsRef<str> for LastUpdateStatusValue {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The status of <code>OfflineStore</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OfflineStoreStatus {
    /// <p>An <code>OfflineStore</code> status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::OfflineStoreStatusValue>,
    /// <p>The justification for why the OfflineStoreStatus is Blocked (if applicable).</p>
    #[doc(hidden)]
    pub blocked_reason: std::option::Option<std::string::String>,
}
impl OfflineStoreStatus {
    /// <p>An <code>OfflineStore</code> status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::OfflineStoreStatusValue> {
        self.status.as_ref()
    }
    /// <p>The justification for why the OfflineStoreStatus is Blocked (if applicable).</p>
    pub fn blocked_reason(&self) -> std::option::Option<&str> {
        self.blocked_reason.as_deref()
    }
}
/// See [`OfflineStoreStatus`](crate::model::OfflineStoreStatus).
pub mod offline_store_status {

    /// A builder for [`OfflineStoreStatus`](crate::model::OfflineStoreStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) status: std::option::Option<crate::model::OfflineStoreStatusValue>,
        pub(crate) blocked_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>An <code>OfflineStore</code> status.</p>
        pub fn status(mut self, input: crate::model::OfflineStoreStatusValue) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>An <code>OfflineStore</code> status.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::OfflineStoreStatusValue>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The justification for why the OfflineStoreStatus is Blocked (if applicable).</p>
        pub fn blocked_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.blocked_reason = Some(input.into());
            self
        }
        /// <p>The justification for why the OfflineStoreStatus is Blocked (if applicable).</p>
        pub fn set_blocked_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.blocked_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`OfflineStoreStatus`](crate::model::OfflineStoreStatus).
        pub fn build(self) -> crate::model::OfflineStoreStatus {
            crate::model::OfflineStoreStatus {
                status: self.status,
                blocked_reason: self.blocked_reason,
            }
        }
    }
}
impl OfflineStoreStatus {
    /// Creates a new builder-style object to manufacture [`OfflineStoreStatus`](crate::model::OfflineStoreStatus).
    pub fn builder() -> crate::model::offline_store_status::Builder {
        crate::model::offline_store_status::Builder::default()
    }
}

/// When writing a match expression against `OfflineStoreStatusValue`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let offlinestorestatusvalue = unimplemented!();
/// match offlinestorestatusvalue {
///     OfflineStoreStatusValue::Active => { /* ... */ },
///     OfflineStoreStatusValue::Blocked => { /* ... */ },
///     OfflineStoreStatusValue::Disabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `offlinestorestatusvalue` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `OfflineStoreStatusValue::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `OfflineStoreStatusValue::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `OfflineStoreStatusValue::NewFeature` is defined.
/// Specifically, when `offlinestorestatusvalue` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `OfflineStoreStatusValue::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum OfflineStoreStatusValue {
    #[allow(missing_docs)] // documentation missing in model
    Active,
    #[allow(missing_docs)] // documentation missing in model
    Blocked,
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for OfflineStoreStatusValue {
    fn from(s: &str) -> Self {
        match s {
            "Active" => OfflineStoreStatusValue::Active,
            "Blocked" => OfflineStoreStatusValue::Blocked,
            "Disabled" => OfflineStoreStatusValue::Disabled,
            other => OfflineStoreStatusValue::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for OfflineStoreStatusValue {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(OfflineStoreStatusValue::from(s))
    }
}
impl OfflineStoreStatusValue {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            OfflineStoreStatusValue::Active => "Active",
            OfflineStoreStatusValue::Blocked => "Blocked",
            OfflineStoreStatusValue::Disabled => "Disabled",
            OfflineStoreStatusValue::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Active", "Blocked", "Disabled"]
    }
}
impl AsRef<str> for OfflineStoreStatusValue {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `FeatureGroupStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let featuregroupstatus = unimplemented!();
/// match featuregroupstatus {
///     FeatureGroupStatus::CreateFailed => { /* ... */ },
///     FeatureGroupStatus::Created => { /* ... */ },
///     FeatureGroupStatus::Creating => { /* ... */ },
///     FeatureGroupStatus::DeleteFailed => { /* ... */ },
///     FeatureGroupStatus::Deleting => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `featuregroupstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FeatureGroupStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FeatureGroupStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FeatureGroupStatus::NewFeature` is defined.
/// Specifically, when `featuregroupstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FeatureGroupStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FeatureGroupStatus {
    #[allow(missing_docs)] // documentation missing in model
    CreateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Created,
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FeatureGroupStatus {
    fn from(s: &str) -> Self {
        match s {
            "CreateFailed" => FeatureGroupStatus::CreateFailed,
            "Created" => FeatureGroupStatus::Created,
            "Creating" => FeatureGroupStatus::Creating,
            "DeleteFailed" => FeatureGroupStatus::DeleteFailed,
            "Deleting" => FeatureGroupStatus::Deleting,
            other => {
                FeatureGroupStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for FeatureGroupStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FeatureGroupStatus::from(s))
    }
}
impl FeatureGroupStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FeatureGroupStatus::CreateFailed => "CreateFailed",
            FeatureGroupStatus::Created => "Created",
            FeatureGroupStatus::Creating => "Creating",
            FeatureGroupStatus::DeleteFailed => "DeleteFailed",
            FeatureGroupStatus::Deleting => "Deleting",
            FeatureGroupStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CreateFailed",
            "Created",
            "Creating",
            "DeleteFailed",
            "Deleting",
        ]
    }
}
impl AsRef<str> for FeatureGroupStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The configuration of an <code>OfflineStore</code>.</p>
/// <p>Provide an <code>OfflineStoreConfig</code> in a request to <code>CreateFeatureGroup</code> to create an <code>OfflineStore</code>.</p>
/// <p>To encrypt an <code>OfflineStore</code> using at rest data encryption, specify Amazon Web Services Key Management Service (KMS) key ID, or <code>KMSKeyId</code>, in <code>S3StorageConfig</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OfflineStoreConfig {
    /// <p>The Amazon Simple Storage (Amazon S3) location of <code>OfflineStore</code>.</p>
    #[doc(hidden)]
    pub s3_storage_config: std::option::Option<crate::model::S3StorageConfig>,
    /// <p>Set to <code>True</code> to disable the automatic creation of an Amazon Web Services Glue table when configuring an <code>OfflineStore</code>.</p>
    #[doc(hidden)]
    pub disable_glue_table_creation: bool,
    /// <p>The meta data of the Glue table that is autogenerated when an <code>OfflineStore</code> is created. </p>
    #[doc(hidden)]
    pub data_catalog_config: std::option::Option<crate::model::DataCatalogConfig>,
    /// <p>Format for the offline store table. Supported formats are Glue (Default) and <a href="https://iceberg.apache.org/">Apache Iceberg</a>.</p>
    #[doc(hidden)]
    pub table_format: std::option::Option<crate::model::TableFormat>,
}
impl OfflineStoreConfig {
    /// <p>The Amazon Simple Storage (Amazon S3) location of <code>OfflineStore</code>.</p>
    pub fn s3_storage_config(&self) -> std::option::Option<&crate::model::S3StorageConfig> {
        self.s3_storage_config.as_ref()
    }
    /// <p>Set to <code>True</code> to disable the automatic creation of an Amazon Web Services Glue table when configuring an <code>OfflineStore</code>.</p>
    pub fn disable_glue_table_creation(&self) -> bool {
        self.disable_glue_table_creation
    }
    /// <p>The meta data of the Glue table that is autogenerated when an <code>OfflineStore</code> is created. </p>
    pub fn data_catalog_config(&self) -> std::option::Option<&crate::model::DataCatalogConfig> {
        self.data_catalog_config.as_ref()
    }
    /// <p>Format for the offline store table. Supported formats are Glue (Default) and <a href="https://iceberg.apache.org/">Apache Iceberg</a>.</p>
    pub fn table_format(&self) -> std::option::Option<&crate::model::TableFormat> {
        self.table_format.as_ref()
    }
}
/// See [`OfflineStoreConfig`](crate::model::OfflineStoreConfig).
pub mod offline_store_config {

    /// A builder for [`OfflineStoreConfig`](crate::model::OfflineStoreConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_storage_config: std::option::Option<crate::model::S3StorageConfig>,
        pub(crate) disable_glue_table_creation: std::option::Option<bool>,
        pub(crate) data_catalog_config: std::option::Option<crate::model::DataCatalogConfig>,
        pub(crate) table_format: std::option::Option<crate::model::TableFormat>,
    }
    impl Builder {
        /// <p>The Amazon Simple Storage (Amazon S3) location of <code>OfflineStore</code>.</p>
        pub fn s3_storage_config(mut self, input: crate::model::S3StorageConfig) -> Self {
            self.s3_storage_config = Some(input);
            self
        }
        /// <p>The Amazon Simple Storage (Amazon S3) location of <code>OfflineStore</code>.</p>
        pub fn set_s3_storage_config(
            mut self,
            input: std::option::Option<crate::model::S3StorageConfig>,
        ) -> Self {
            self.s3_storage_config = input;
            self
        }
        /// <p>Set to <code>True</code> to disable the automatic creation of an Amazon Web Services Glue table when configuring an <code>OfflineStore</code>.</p>
        pub fn disable_glue_table_creation(mut self, input: bool) -> Self {
            self.disable_glue_table_creation = Some(input);
            self
        }
        /// <p>Set to <code>True</code> to disable the automatic creation of an Amazon Web Services Glue table when configuring an <code>OfflineStore</code>.</p>
        pub fn set_disable_glue_table_creation(mut self, input: std::option::Option<bool>) -> Self {
            self.disable_glue_table_creation = input;
            self
        }
        /// <p>The meta data of the Glue table that is autogenerated when an <code>OfflineStore</code> is created. </p>
        pub fn data_catalog_config(mut self, input: crate::model::DataCatalogConfig) -> Self {
            self.data_catalog_config = Some(input);
            self
        }
        /// <p>The meta data of the Glue table that is autogenerated when an <code>OfflineStore</code> is created. </p>
        pub fn set_data_catalog_config(
            mut self,
            input: std::option::Option<crate::model::DataCatalogConfig>,
        ) -> Self {
            self.data_catalog_config = input;
            self
        }
        /// <p>Format for the offline store table. Supported formats are Glue (Default) and <a href="https://iceberg.apache.org/">Apache Iceberg</a>.</p>
        pub fn table_format(mut self, input: crate::model::TableFormat) -> Self {
            self.table_format = Some(input);
            self
        }
        /// <p>Format for the offline store table. Supported formats are Glue (Default) and <a href="https://iceberg.apache.org/">Apache Iceberg</a>.</p>
        pub fn set_table_format(
            mut self,
            input: std::option::Option<crate::model::TableFormat>,
        ) -> Self {
            self.table_format = input;
            self
        }
        /// Consumes the builder and constructs a [`OfflineStoreConfig`](crate::model::OfflineStoreConfig).
        pub fn build(self) -> crate::model::OfflineStoreConfig {
            crate::model::OfflineStoreConfig {
                s3_storage_config: self.s3_storage_config,
                disable_glue_table_creation: self.disable_glue_table_creation.unwrap_or_default(),
                data_catalog_config: self.data_catalog_config,
                table_format: self.table_format,
            }
        }
    }
}
impl OfflineStoreConfig {
    /// Creates a new builder-style object to manufacture [`OfflineStoreConfig`](crate::model::OfflineStoreConfig).
    pub fn builder() -> crate::model::offline_store_config::Builder {
        crate::model::offline_store_config::Builder::default()
    }
}

/// When writing a match expression against `TableFormat`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let tableformat = unimplemented!();
/// match tableformat {
///     TableFormat::Glue => { /* ... */ },
///     TableFormat::Iceberg => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `tableformat` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TableFormat::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TableFormat::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TableFormat::NewFeature` is defined.
/// Specifically, when `tableformat` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TableFormat::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TableFormat {
    #[allow(missing_docs)] // documentation missing in model
    Glue,
    #[allow(missing_docs)] // documentation missing in model
    Iceberg,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TableFormat {
    fn from(s: &str) -> Self {
        match s {
            "Glue" => TableFormat::Glue,
            "Iceberg" => TableFormat::Iceberg,
            other => TableFormat::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for TableFormat {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TableFormat::from(s))
    }
}
impl TableFormat {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TableFormat::Glue => "Glue",
            TableFormat::Iceberg => "Iceberg",
            TableFormat::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Glue", "Iceberg"]
    }
}
impl AsRef<str> for TableFormat {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The meta data of the Glue table which serves as data catalog for the <code>OfflineStore</code>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataCatalogConfig {
    /// <p>The name of the Glue table.</p>
    #[doc(hidden)]
    pub table_name: std::option::Option<std::string::String>,
    /// <p>The name of the Glue table catalog.</p>
    #[doc(hidden)]
    pub catalog: std::option::Option<std::string::String>,
    /// <p>The name of the Glue table database.</p>
    #[doc(hidden)]
    pub database: std::option::Option<std::string::String>,
}
impl DataCatalogConfig {
    /// <p>The name of the Glue table.</p>
    pub fn table_name(&self) -> std::option::Option<&str> {
        self.table_name.as_deref()
    }
    /// <p>The name of the Glue table catalog.</p>
    pub fn catalog(&self) -> std::option::Option<&str> {
        self.catalog.as_deref()
    }
    /// <p>The name of the Glue table database.</p>
    pub fn database(&self) -> std::option::Option<&str> {
        self.database.as_deref()
    }
}
/// See [`DataCatalogConfig`](crate::model::DataCatalogConfig).
pub mod data_catalog_config {

    /// A builder for [`DataCatalogConfig`](crate::model::DataCatalogConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) table_name: std::option::Option<std::string::String>,
        pub(crate) catalog: std::option::Option<std::string::String>,
        pub(crate) database: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the Glue table.</p>
        pub fn table_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.table_name = Some(input.into());
            self
        }
        /// <p>The name of the Glue table.</p>
        pub fn set_table_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.table_name = input;
            self
        }
        /// <p>The name of the Glue table catalog.</p>
        pub fn catalog(mut self, input: impl Into<std::string::String>) -> Self {
            self.catalog = Some(input.into());
            self
        }
        /// <p>The name of the Glue table catalog.</p>
        pub fn set_catalog(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.catalog = input;
            self
        }
        /// <p>The name of the Glue table database.</p>
        pub fn database(mut self, input: impl Into<std::string::String>) -> Self {
            self.database = Some(input.into());
            self
        }
        /// <p>The name of the Glue table database.</p>
        pub fn set_database(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.database = input;
            self
        }
        /// Consumes the builder and constructs a [`DataCatalogConfig`](crate::model::DataCatalogConfig).
        pub fn build(self) -> crate::model::DataCatalogConfig {
            crate::model::DataCatalogConfig {
                table_name: self.table_name,
                catalog: self.catalog,
                database: self.database,
            }
        }
    }
}
impl DataCatalogConfig {
    /// Creates a new builder-style object to manufacture [`DataCatalogConfig`](crate::model::DataCatalogConfig).
    pub fn builder() -> crate::model::data_catalog_config::Builder {
        crate::model::data_catalog_config::Builder::default()
    }
}

/// <p>The Amazon Simple Storage (Amazon S3) location and and security configuration for <code>OfflineStore</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct S3StorageConfig {
    /// <p>The S3 URI, or location in Amazon S3, of <code>OfflineStore</code>.</p>
    /// <p>S3 URIs have a format similar to the following: <code>s3://example-bucket/prefix/</code>.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service (KMS) key ID of the key used to encrypt any objects written into the <code>OfflineStore</code> S3 location.</p>
    /// <p>The IAM <code>roleARN</code> that is passed as a parameter to <code>CreateFeatureGroup</code> must have below permissions to the <code>KmsKeyId</code>:</p>
    /// <ul>
    /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>The S3 path where offline records are written.</p>
    #[doc(hidden)]
    pub resolved_output_s3_uri: std::option::Option<std::string::String>,
}
impl S3StorageConfig {
    /// <p>The S3 URI, or location in Amazon S3, of <code>OfflineStore</code>.</p>
    /// <p>S3 URIs have a format similar to the following: <code>s3://example-bucket/prefix/</code>.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (KMS) key ID of the key used to encrypt any objects written into the <code>OfflineStore</code> S3 location.</p>
    /// <p>The IAM <code>roleARN</code> that is passed as a parameter to <code>CreateFeatureGroup</code> must have below permissions to the <code>KmsKeyId</code>:</p>
    /// <ul>
    /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
    /// </ul>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>The S3 path where offline records are written.</p>
    pub fn resolved_output_s3_uri(&self) -> std::option::Option<&str> {
        self.resolved_output_s3_uri.as_deref()
    }
}
/// See [`S3StorageConfig`](crate::model::S3StorageConfig).
pub mod s3_storage_config {

    /// A builder for [`S3StorageConfig`](crate::model::S3StorageConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) resolved_output_s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The S3 URI, or location in Amazon S3, of <code>OfflineStore</code>.</p>
        /// <p>S3 URIs have a format similar to the following: <code>s3://example-bucket/prefix/</code>.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The S3 URI, or location in Amazon S3, of <code>OfflineStore</code>.</p>
        /// <p>S3 URIs have a format similar to the following: <code>s3://example-bucket/prefix/</code>.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (KMS) key ID of the key used to encrypt any objects written into the <code>OfflineStore</code> S3 location.</p>
        /// <p>The IAM <code>roleARN</code> that is passed as a parameter to <code>CreateFeatureGroup</code> must have below permissions to the <code>KmsKeyId</code>:</p>
        /// <ul>
        /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
        /// </ul>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (KMS) key ID of the key used to encrypt any objects written into the <code>OfflineStore</code> S3 location.</p>
        /// <p>The IAM <code>roleARN</code> that is passed as a parameter to <code>CreateFeatureGroup</code> must have below permissions to the <code>KmsKeyId</code>:</p>
        /// <ul>
        /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
        /// </ul>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>The S3 path where offline records are written.</p>
        pub fn resolved_output_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.resolved_output_s3_uri = Some(input.into());
            self
        }
        /// <p>The S3 path where offline records are written.</p>
        pub fn set_resolved_output_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.resolved_output_s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`S3StorageConfig`](crate::model::S3StorageConfig).
        pub fn build(self) -> crate::model::S3StorageConfig {
            crate::model::S3StorageConfig {
                s3_uri: self.s3_uri,
                kms_key_id: self.kms_key_id,
                resolved_output_s3_uri: self.resolved_output_s3_uri,
            }
        }
    }
}
impl S3StorageConfig {
    /// Creates a new builder-style object to manufacture [`S3StorageConfig`](crate::model::S3StorageConfig).
    pub fn builder() -> crate::model::s3_storage_config::Builder {
        crate::model::s3_storage_config::Builder::default()
    }
}

/// <p>Use this to specify the Amazon Web Services Key Management Service (KMS) Key ID, or <code>KMSKeyId</code>, for at rest data encryption. You can turn <code>OnlineStore</code> on or off by specifying the <code>EnableOnlineStore</code> flag at General Assembly; the default value is <code>False</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OnlineStoreConfig {
    /// <p>Use to specify KMS Key ID (<code>KMSKeyId</code>) for at-rest encryption of your <code>OnlineStore</code>.</p>
    #[doc(hidden)]
    pub security_config: std::option::Option<crate::model::OnlineStoreSecurityConfig>,
    /// <p>Turn <code>OnlineStore</code> off by specifying <code>False</code> for the <code>EnableOnlineStore</code> flag. Turn <code>OnlineStore</code> on by specifying <code>True</code> for the <code>EnableOnlineStore</code> flag. </p>
    /// <p>The default value is <code>False</code>.</p>
    #[doc(hidden)]
    pub enable_online_store: bool,
}
impl OnlineStoreConfig {
    /// <p>Use to specify KMS Key ID (<code>KMSKeyId</code>) for at-rest encryption of your <code>OnlineStore</code>.</p>
    pub fn security_config(&self) -> std::option::Option<&crate::model::OnlineStoreSecurityConfig> {
        self.security_config.as_ref()
    }
    /// <p>Turn <code>OnlineStore</code> off by specifying <code>False</code> for the <code>EnableOnlineStore</code> flag. Turn <code>OnlineStore</code> on by specifying <code>True</code> for the <code>EnableOnlineStore</code> flag. </p>
    /// <p>The default value is <code>False</code>.</p>
    pub fn enable_online_store(&self) -> bool {
        self.enable_online_store
    }
}
/// See [`OnlineStoreConfig`](crate::model::OnlineStoreConfig).
pub mod online_store_config {

    /// A builder for [`OnlineStoreConfig`](crate::model::OnlineStoreConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) security_config: std::option::Option<crate::model::OnlineStoreSecurityConfig>,
        pub(crate) enable_online_store: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>Use to specify KMS Key ID (<code>KMSKeyId</code>) for at-rest encryption of your <code>OnlineStore</code>.</p>
        pub fn security_config(mut self, input: crate::model::OnlineStoreSecurityConfig) -> Self {
            self.security_config = Some(input);
            self
        }
        /// <p>Use to specify KMS Key ID (<code>KMSKeyId</code>) for at-rest encryption of your <code>OnlineStore</code>.</p>
        pub fn set_security_config(
            mut self,
            input: std::option::Option<crate::model::OnlineStoreSecurityConfig>,
        ) -> Self {
            self.security_config = input;
            self
        }
        /// <p>Turn <code>OnlineStore</code> off by specifying <code>False</code> for the <code>EnableOnlineStore</code> flag. Turn <code>OnlineStore</code> on by specifying <code>True</code> for the <code>EnableOnlineStore</code> flag. </p>
        /// <p>The default value is <code>False</code>.</p>
        pub fn enable_online_store(mut self, input: bool) -> Self {
            self.enable_online_store = Some(input);
            self
        }
        /// <p>Turn <code>OnlineStore</code> off by specifying <code>False</code> for the <code>EnableOnlineStore</code> flag. Turn <code>OnlineStore</code> on by specifying <code>True</code> for the <code>EnableOnlineStore</code> flag. </p>
        /// <p>The default value is <code>False</code>.</p>
        pub fn set_enable_online_store(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_online_store = input;
            self
        }
        /// Consumes the builder and constructs a [`OnlineStoreConfig`](crate::model::OnlineStoreConfig).
        pub fn build(self) -> crate::model::OnlineStoreConfig {
            crate::model::OnlineStoreConfig {
                security_config: self.security_config,
                enable_online_store: self.enable_online_store.unwrap_or_default(),
            }
        }
    }
}
impl OnlineStoreConfig {
    /// Creates a new builder-style object to manufacture [`OnlineStoreConfig`](crate::model::OnlineStoreConfig).
    pub fn builder() -> crate::model::online_store_config::Builder {
        crate::model::online_store_config::Builder::default()
    }
}

/// <p>The security configuration for <code>OnlineStore</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OnlineStoreSecurityConfig {
    /// <p>The ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker Feature Store uses to encrypt the Amazon S3 objects at rest using Amazon S3 server-side encryption.</p>
    /// <p>The caller (either IAM user or IAM role) of <code>CreateFeatureGroup</code> must have below permissions to the <code>OnlineStore</code> <code>KmsKeyId</code>:</p>
    /// <ul>
    /// <li> <p> <code>"kms:Encrypt"</code> </p> </li>
    /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
    /// <li> <p> <code>"kms:DescribeKey"</code> </p> </li>
    /// <li> <p> <code>"kms:CreateGrant"</code> </p> </li>
    /// <li> <p> <code>"kms:RetireGrant"</code> </p> </li>
    /// <li> <p> <code>"kms:ReEncryptFrom"</code> </p> </li>
    /// <li> <p> <code>"kms:ReEncryptTo"</code> </p> </li>
    /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
    /// <li> <p> <code>"kms:ListAliases"</code> </p> </li>
    /// <li> <p> <code>"kms:ListGrants"</code> </p> </li>
    /// <li> <p> <code>"kms:RevokeGrant"</code> </p> </li>
    /// </ul>
    /// <p>The caller (either IAM user or IAM role) to all DataPlane operations (<code>PutRecord</code>, <code>GetRecord</code>, <code>DeleteRecord</code>) must have the following permissions to the <code>KmsKeyId</code>:</p>
    /// <ul>
    /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl OnlineStoreSecurityConfig {
    /// <p>The ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker Feature Store uses to encrypt the Amazon S3 objects at rest using Amazon S3 server-side encryption.</p>
    /// <p>The caller (either IAM user or IAM role) of <code>CreateFeatureGroup</code> must have below permissions to the <code>OnlineStore</code> <code>KmsKeyId</code>:</p>
    /// <ul>
    /// <li> <p> <code>"kms:Encrypt"</code> </p> </li>
    /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
    /// <li> <p> <code>"kms:DescribeKey"</code> </p> </li>
    /// <li> <p> <code>"kms:CreateGrant"</code> </p> </li>
    /// <li> <p> <code>"kms:RetireGrant"</code> </p> </li>
    /// <li> <p> <code>"kms:ReEncryptFrom"</code> </p> </li>
    /// <li> <p> <code>"kms:ReEncryptTo"</code> </p> </li>
    /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
    /// <li> <p> <code>"kms:ListAliases"</code> </p> </li>
    /// <li> <p> <code>"kms:ListGrants"</code> </p> </li>
    /// <li> <p> <code>"kms:RevokeGrant"</code> </p> </li>
    /// </ul>
    /// <p>The caller (either IAM user or IAM role) to all DataPlane operations (<code>PutRecord</code>, <code>GetRecord</code>, <code>DeleteRecord</code>) must have the following permissions to the <code>KmsKeyId</code>:</p>
    /// <ul>
    /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
    /// </ul>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`OnlineStoreSecurityConfig`](crate::model::OnlineStoreSecurityConfig).
pub mod online_store_security_config {

    /// A builder for [`OnlineStoreSecurityConfig`](crate::model::OnlineStoreSecurityConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker Feature Store uses to encrypt the Amazon S3 objects at rest using Amazon S3 server-side encryption.</p>
        /// <p>The caller (either IAM user or IAM role) of <code>CreateFeatureGroup</code> must have below permissions to the <code>OnlineStore</code> <code>KmsKeyId</code>:</p>
        /// <ul>
        /// <li> <p> <code>"kms:Encrypt"</code> </p> </li>
        /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
        /// <li> <p> <code>"kms:DescribeKey"</code> </p> </li>
        /// <li> <p> <code>"kms:CreateGrant"</code> </p> </li>
        /// <li> <p> <code>"kms:RetireGrant"</code> </p> </li>
        /// <li> <p> <code>"kms:ReEncryptFrom"</code> </p> </li>
        /// <li> <p> <code>"kms:ReEncryptTo"</code> </p> </li>
        /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
        /// <li> <p> <code>"kms:ListAliases"</code> </p> </li>
        /// <li> <p> <code>"kms:ListGrants"</code> </p> </li>
        /// <li> <p> <code>"kms:RevokeGrant"</code> </p> </li>
        /// </ul>
        /// <p>The caller (either IAM user or IAM role) to all DataPlane operations (<code>PutRecord</code>, <code>GetRecord</code>, <code>DeleteRecord</code>) must have the following permissions to the <code>KmsKeyId</code>:</p>
        /// <ul>
        /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
        /// </ul>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker Feature Store uses to encrypt the Amazon S3 objects at rest using Amazon S3 server-side encryption.</p>
        /// <p>The caller (either IAM user or IAM role) of <code>CreateFeatureGroup</code> must have below permissions to the <code>OnlineStore</code> <code>KmsKeyId</code>:</p>
        /// <ul>
        /// <li> <p> <code>"kms:Encrypt"</code> </p> </li>
        /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
        /// <li> <p> <code>"kms:DescribeKey"</code> </p> </li>
        /// <li> <p> <code>"kms:CreateGrant"</code> </p> </li>
        /// <li> <p> <code>"kms:RetireGrant"</code> </p> </li>
        /// <li> <p> <code>"kms:ReEncryptFrom"</code> </p> </li>
        /// <li> <p> <code>"kms:ReEncryptTo"</code> </p> </li>
        /// <li> <p> <code>"kms:GenerateDataKey"</code> </p> </li>
        /// <li> <p> <code>"kms:ListAliases"</code> </p> </li>
        /// <li> <p> <code>"kms:ListGrants"</code> </p> </li>
        /// <li> <p> <code>"kms:RevokeGrant"</code> </p> </li>
        /// </ul>
        /// <p>The caller (either IAM user or IAM role) to all DataPlane operations (<code>PutRecord</code>, <code>GetRecord</code>, <code>DeleteRecord</code>) must have the following permissions to the <code>KmsKeyId</code>:</p>
        /// <ul>
        /// <li> <p> <code>"kms:Decrypt"</code> </p> </li>
        /// </ul>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`OnlineStoreSecurityConfig`](crate::model::OnlineStoreSecurityConfig).
        pub fn build(self) -> crate::model::OnlineStoreSecurityConfig {
            crate::model::OnlineStoreSecurityConfig {
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl OnlineStoreSecurityConfig {
    /// Creates a new builder-style object to manufacture [`OnlineStoreSecurityConfig`](crate::model::OnlineStoreSecurityConfig).
    pub fn builder() -> crate::model::online_store_security_config::Builder {
        crate::model::online_store_security_config::Builder::default()
    }
}

/// <p>An execution of a pipeline.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineExecution {
    /// <p>The Amazon Resource Name (ARN) of the pipeline that was executed.</p>
    #[doc(hidden)]
    pub pipeline_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_arn: std::option::Option<std::string::String>,
    /// <p>The display name of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_display_name: std::option::Option<std::string::String>,
    /// <p>The status of the pipeline status.</p>
    #[doc(hidden)]
    pub pipeline_execution_status: std::option::Option<crate::model::PipelineExecutionStatus>,
    /// <p>The description of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_description: std::option::Option<std::string::String>,
    /// <p>Specifies the names of the experiment and trial created by a pipeline.</p>
    #[doc(hidden)]
    pub pipeline_experiment_config: std::option::Option<crate::model::PipelineExperimentConfig>,
    /// <p>If the execution failed, a message describing why.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The creation time of the pipeline execution.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that the pipeline execution was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>The parallelism configuration applied to the pipeline execution.</p>
    #[doc(hidden)]
    pub parallelism_configuration: std::option::Option<crate::model::ParallelismConfiguration>,
    /// <p>Contains a list of pipeline parameters. This list can be empty. </p>
    #[doc(hidden)]
    pub pipeline_parameters: std::option::Option<std::vec::Vec<crate::model::Parameter>>,
}
impl PipelineExecution {
    /// <p>The Amazon Resource Name (ARN) of the pipeline that was executed.</p>
    pub fn pipeline_arn(&self) -> std::option::Option<&str> {
        self.pipeline_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
    pub fn pipeline_execution_arn(&self) -> std::option::Option<&str> {
        self.pipeline_execution_arn.as_deref()
    }
    /// <p>The display name of the pipeline execution.</p>
    pub fn pipeline_execution_display_name(&self) -> std::option::Option<&str> {
        self.pipeline_execution_display_name.as_deref()
    }
    /// <p>The status of the pipeline status.</p>
    pub fn pipeline_execution_status(
        &self,
    ) -> std::option::Option<&crate::model::PipelineExecutionStatus> {
        self.pipeline_execution_status.as_ref()
    }
    /// <p>The description of the pipeline execution.</p>
    pub fn pipeline_execution_description(&self) -> std::option::Option<&str> {
        self.pipeline_execution_description.as_deref()
    }
    /// <p>Specifies the names of the experiment and trial created by a pipeline.</p>
    pub fn pipeline_experiment_config(
        &self,
    ) -> std::option::Option<&crate::model::PipelineExperimentConfig> {
        self.pipeline_experiment_config.as_ref()
    }
    /// <p>If the execution failed, a message describing why.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The creation time of the pipeline execution.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time that the pipeline execution was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>The parallelism configuration applied to the pipeline execution.</p>
    pub fn parallelism_configuration(
        &self,
    ) -> std::option::Option<&crate::model::ParallelismConfiguration> {
        self.parallelism_configuration.as_ref()
    }
    /// <p>Contains a list of pipeline parameters. This list can be empty. </p>
    pub fn pipeline_parameters(&self) -> std::option::Option<&[crate::model::Parameter]> {
        self.pipeline_parameters.as_deref()
    }
}
/// See [`PipelineExecution`](crate::model::PipelineExecution).
pub mod pipeline_execution {

    /// A builder for [`PipelineExecution`](crate::model::PipelineExecution).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) pipeline_arn: std::option::Option<std::string::String>,
        pub(crate) pipeline_execution_arn: std::option::Option<std::string::String>,
        pub(crate) pipeline_execution_display_name: std::option::Option<std::string::String>,
        pub(crate) pipeline_execution_status:
            std::option::Option<crate::model::PipelineExecutionStatus>,
        pub(crate) pipeline_execution_description: std::option::Option<std::string::String>,
        pub(crate) pipeline_experiment_config:
            std::option::Option<crate::model::PipelineExperimentConfig>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) parallelism_configuration:
            std::option::Option<crate::model::ParallelismConfiguration>,
        pub(crate) pipeline_parameters: std::option::Option<std::vec::Vec<crate::model::Parameter>>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the pipeline that was executed.</p>
        pub fn pipeline_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the pipeline that was executed.</p>
        pub fn set_pipeline_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.pipeline_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
        pub fn pipeline_execution_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_execution_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
        pub fn set_pipeline_execution_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_arn = input;
            self
        }
        /// <p>The display name of the pipeline execution.</p>
        pub fn pipeline_execution_display_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.pipeline_execution_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the pipeline execution.</p>
        pub fn set_pipeline_execution_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_display_name = input;
            self
        }
        /// <p>The status of the pipeline status.</p>
        pub fn pipeline_execution_status(
            mut self,
            input: crate::model::PipelineExecutionStatus,
        ) -> Self {
            self.pipeline_execution_status = Some(input);
            self
        }
        /// <p>The status of the pipeline status.</p>
        pub fn set_pipeline_execution_status(
            mut self,
            input: std::option::Option<crate::model::PipelineExecutionStatus>,
        ) -> Self {
            self.pipeline_execution_status = input;
            self
        }
        /// <p>The description of the pipeline execution.</p>
        pub fn pipeline_execution_description(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.pipeline_execution_description = Some(input.into());
            self
        }
        /// <p>The description of the pipeline execution.</p>
        pub fn set_pipeline_execution_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_description = input;
            self
        }
        /// <p>Specifies the names of the experiment and trial created by a pipeline.</p>
        pub fn pipeline_experiment_config(
            mut self,
            input: crate::model::PipelineExperimentConfig,
        ) -> Self {
            self.pipeline_experiment_config = Some(input);
            self
        }
        /// <p>Specifies the names of the experiment and trial created by a pipeline.</p>
        pub fn set_pipeline_experiment_config(
            mut self,
            input: std::option::Option<crate::model::PipelineExperimentConfig>,
        ) -> Self {
            self.pipeline_experiment_config = input;
            self
        }
        /// <p>If the execution failed, a message describing why.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the execution failed, a message describing why.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The creation time of the pipeline execution.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the pipeline execution.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time that the pipeline execution was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time that the pipeline execution was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// <p>The parallelism configuration applied to the pipeline execution.</p>
        pub fn parallelism_configuration(
            mut self,
            input: crate::model::ParallelismConfiguration,
        ) -> Self {
            self.parallelism_configuration = Some(input);
            self
        }
        /// <p>The parallelism configuration applied to the pipeline execution.</p>
        pub fn set_parallelism_configuration(
            mut self,
            input: std::option::Option<crate::model::ParallelismConfiguration>,
        ) -> Self {
            self.parallelism_configuration = input;
            self
        }
        /// Appends an item to `pipeline_parameters`.
        ///
        /// To override the contents of this collection use [`set_pipeline_parameters`](Self::set_pipeline_parameters).
        ///
        /// <p>Contains a list of pipeline parameters. This list can be empty. </p>
        pub fn pipeline_parameters(mut self, input: crate::model::Parameter) -> Self {
            let mut v = self.pipeline_parameters.unwrap_or_default();
            v.push(input);
            self.pipeline_parameters = Some(v);
            self
        }
        /// <p>Contains a list of pipeline parameters. This list can be empty. </p>
        pub fn set_pipeline_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Parameter>>,
        ) -> Self {
            self.pipeline_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineExecution`](crate::model::PipelineExecution).
        pub fn build(self) -> crate::model::PipelineExecution {
            crate::model::PipelineExecution {
                pipeline_arn: self.pipeline_arn,
                pipeline_execution_arn: self.pipeline_execution_arn,
                pipeline_execution_display_name: self.pipeline_execution_display_name,
                pipeline_execution_status: self.pipeline_execution_status,
                pipeline_execution_description: self.pipeline_execution_description,
                pipeline_experiment_config: self.pipeline_experiment_config,
                failure_reason: self.failure_reason,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                created_by: self.created_by,
                last_modified_by: self.last_modified_by,
                parallelism_configuration: self.parallelism_configuration,
                pipeline_parameters: self.pipeline_parameters,
            }
        }
    }
}
impl PipelineExecution {
    /// Creates a new builder-style object to manufacture [`PipelineExecution`](crate::model::PipelineExecution).
    pub fn builder() -> crate::model::pipeline_execution::Builder {
        crate::model::pipeline_execution::Builder::default()
    }
}

/// <p>Specifies the names of the experiment and trial created by a pipeline.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineExperimentConfig {
    /// <p>The name of the experiment.</p>
    #[doc(hidden)]
    pub experiment_name: std::option::Option<std::string::String>,
    /// <p>The name of the trial.</p>
    #[doc(hidden)]
    pub trial_name: std::option::Option<std::string::String>,
}
impl PipelineExperimentConfig {
    /// <p>The name of the experiment.</p>
    pub fn experiment_name(&self) -> std::option::Option<&str> {
        self.experiment_name.as_deref()
    }
    /// <p>The name of the trial.</p>
    pub fn trial_name(&self) -> std::option::Option<&str> {
        self.trial_name.as_deref()
    }
}
/// See [`PipelineExperimentConfig`](crate::model::PipelineExperimentConfig).
pub mod pipeline_experiment_config {

    /// A builder for [`PipelineExperimentConfig`](crate::model::PipelineExperimentConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) experiment_name: std::option::Option<std::string::String>,
        pub(crate) trial_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the experiment.</p>
        pub fn experiment_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment.</p>
        pub fn set_experiment_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_name = input;
            self
        }
        /// <p>The name of the trial.</p>
        pub fn trial_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_name = Some(input.into());
            self
        }
        /// <p>The name of the trial.</p>
        pub fn set_trial_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_name = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineExperimentConfig`](crate::model::PipelineExperimentConfig).
        pub fn build(self) -> crate::model::PipelineExperimentConfig {
            crate::model::PipelineExperimentConfig {
                experiment_name: self.experiment_name,
                trial_name: self.trial_name,
            }
        }
    }
}
impl PipelineExperimentConfig {
    /// Creates a new builder-style object to manufacture [`PipelineExperimentConfig`](crate::model::PipelineExperimentConfig).
    pub fn builder() -> crate::model::pipeline_experiment_config::Builder {
        crate::model::pipeline_experiment_config::Builder::default()
    }
}

/// When writing a match expression against `PipelineExecutionStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let pipelineexecutionstatus = unimplemented!();
/// match pipelineexecutionstatus {
///     PipelineExecutionStatus::Executing => { /* ... */ },
///     PipelineExecutionStatus::Failed => { /* ... */ },
///     PipelineExecutionStatus::Stopped => { /* ... */ },
///     PipelineExecutionStatus::Stopping => { /* ... */ },
///     PipelineExecutionStatus::Succeeded => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `pipelineexecutionstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `PipelineExecutionStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `PipelineExecutionStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `PipelineExecutionStatus::NewFeature` is defined.
/// Specifically, when `pipelineexecutionstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `PipelineExecutionStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum PipelineExecutionStatus {
    #[allow(missing_docs)] // documentation missing in model
    Executing,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    #[allow(missing_docs)] // documentation missing in model
    Succeeded,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for PipelineExecutionStatus {
    fn from(s: &str) -> Self {
        match s {
            "Executing" => PipelineExecutionStatus::Executing,
            "Failed" => PipelineExecutionStatus::Failed,
            "Stopped" => PipelineExecutionStatus::Stopped,
            "Stopping" => PipelineExecutionStatus::Stopping,
            "Succeeded" => PipelineExecutionStatus::Succeeded,
            other => PipelineExecutionStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for PipelineExecutionStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(PipelineExecutionStatus::from(s))
    }
}
impl PipelineExecutionStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            PipelineExecutionStatus::Executing => "Executing",
            PipelineExecutionStatus::Failed => "Failed",
            PipelineExecutionStatus::Stopped => "Stopped",
            PipelineExecutionStatus::Stopping => "Stopping",
            PipelineExecutionStatus::Succeeded => "Succeeded",
            PipelineExecutionStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Executing", "Failed", "Stopped", "Stopping", "Succeeded"]
    }
}
impl AsRef<str> for PipelineExecutionStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A SageMaker Model Building Pipeline instance.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Pipeline {
    /// <p>The Amazon Resource Name (ARN) of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_arn: std::option::Option<std::string::String>,
    /// <p>The name of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_name: std::option::Option<std::string::String>,
    /// <p>The display name of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_display_name: std::option::Option<std::string::String>,
    /// <p>The description of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_description: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the role that created the pipeline.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>The status of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_status: std::option::Option<crate::model::PipelineStatus>,
    /// <p>The creation time of the pipeline.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that the pipeline was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time when the pipeline was last run.</p>
    #[doc(hidden)]
    pub last_run_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>The parallelism configuration applied to the pipeline.</p>
    #[doc(hidden)]
    pub parallelism_configuration: std::option::Option<crate::model::ParallelismConfiguration>,
    /// <p>A list of tags that apply to the pipeline.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl Pipeline {
    /// <p>The Amazon Resource Name (ARN) of the pipeline.</p>
    pub fn pipeline_arn(&self) -> std::option::Option<&str> {
        self.pipeline_arn.as_deref()
    }
    /// <p>The name of the pipeline.</p>
    pub fn pipeline_name(&self) -> std::option::Option<&str> {
        self.pipeline_name.as_deref()
    }
    /// <p>The display name of the pipeline.</p>
    pub fn pipeline_display_name(&self) -> std::option::Option<&str> {
        self.pipeline_display_name.as_deref()
    }
    /// <p>The description of the pipeline.</p>
    pub fn pipeline_description(&self) -> std::option::Option<&str> {
        self.pipeline_description.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the role that created the pipeline.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>The status of the pipeline.</p>
    pub fn pipeline_status(&self) -> std::option::Option<&crate::model::PipelineStatus> {
        self.pipeline_status.as_ref()
    }
    /// <p>The creation time of the pipeline.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time that the pipeline was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The time when the pipeline was last run.</p>
    pub fn last_run_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_run_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>The parallelism configuration applied to the pipeline.</p>
    pub fn parallelism_configuration(
        &self,
    ) -> std::option::Option<&crate::model::ParallelismConfiguration> {
        self.parallelism_configuration.as_ref()
    }
    /// <p>A list of tags that apply to the pipeline.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`Pipeline`](crate::model::Pipeline).
pub mod pipeline {

    /// A builder for [`Pipeline`](crate::model::Pipeline).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) pipeline_arn: std::option::Option<std::string::String>,
        pub(crate) pipeline_name: std::option::Option<std::string::String>,
        pub(crate) pipeline_display_name: std::option::Option<std::string::String>,
        pub(crate) pipeline_description: std::option::Option<std::string::String>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) pipeline_status: std::option::Option<crate::model::PipelineStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_run_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) parallelism_configuration:
            std::option::Option<crate::model::ParallelismConfiguration>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the pipeline.</p>
        pub fn pipeline_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the pipeline.</p>
        pub fn set_pipeline_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.pipeline_arn = input;
            self
        }
        /// <p>The name of the pipeline.</p>
        pub fn pipeline_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_name = Some(input.into());
            self
        }
        /// <p>The name of the pipeline.</p>
        pub fn set_pipeline_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_name = input;
            self
        }
        /// <p>The display name of the pipeline.</p>
        pub fn pipeline_display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the pipeline.</p>
        pub fn set_pipeline_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_display_name = input;
            self
        }
        /// <p>The description of the pipeline.</p>
        pub fn pipeline_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_description = Some(input.into());
            self
        }
        /// <p>The description of the pipeline.</p>
        pub fn set_pipeline_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_description = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the role that created the pipeline.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the role that created the pipeline.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// <p>The status of the pipeline.</p>
        pub fn pipeline_status(mut self, input: crate::model::PipelineStatus) -> Self {
            self.pipeline_status = Some(input);
            self
        }
        /// <p>The status of the pipeline.</p>
        pub fn set_pipeline_status(
            mut self,
            input: std::option::Option<crate::model::PipelineStatus>,
        ) -> Self {
            self.pipeline_status = input;
            self
        }
        /// <p>The creation time of the pipeline.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the pipeline.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time that the pipeline was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time that the pipeline was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The time when the pipeline was last run.</p>
        pub fn last_run_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_run_time = Some(input);
            self
        }
        /// <p>The time when the pipeline was last run.</p>
        pub fn set_last_run_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_run_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// <p>The parallelism configuration applied to the pipeline.</p>
        pub fn parallelism_configuration(
            mut self,
            input: crate::model::ParallelismConfiguration,
        ) -> Self {
            self.parallelism_configuration = Some(input);
            self
        }
        /// <p>The parallelism configuration applied to the pipeline.</p>
        pub fn set_parallelism_configuration(
            mut self,
            input: std::option::Option<crate::model::ParallelismConfiguration>,
        ) -> Self {
            self.parallelism_configuration = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of tags that apply to the pipeline.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of tags that apply to the pipeline.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`Pipeline`](crate::model::Pipeline).
        pub fn build(self) -> crate::model::Pipeline {
            crate::model::Pipeline {
                pipeline_arn: self.pipeline_arn,
                pipeline_name: self.pipeline_name,
                pipeline_display_name: self.pipeline_display_name,
                pipeline_description: self.pipeline_description,
                role_arn: self.role_arn,
                pipeline_status: self.pipeline_status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                last_run_time: self.last_run_time,
                created_by: self.created_by,
                last_modified_by: self.last_modified_by,
                parallelism_configuration: self.parallelism_configuration,
                tags: self.tags,
            }
        }
    }
}
impl Pipeline {
    /// Creates a new builder-style object to manufacture [`Pipeline`](crate::model::Pipeline).
    pub fn builder() -> crate::model::pipeline::Builder {
        crate::model::pipeline::Builder::default()
    }
}

/// When writing a match expression against `PipelineStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let pipelinestatus = unimplemented!();
/// match pipelinestatus {
///     PipelineStatus::Active => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `pipelinestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `PipelineStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `PipelineStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `PipelineStatus::NewFeature` is defined.
/// Specifically, when `pipelinestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `PipelineStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum PipelineStatus {
    #[allow(missing_docs)] // documentation missing in model
    Active,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for PipelineStatus {
    fn from(s: &str) -> Self {
        match s {
            "Active" => PipelineStatus::Active,
            other => PipelineStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for PipelineStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(PipelineStatus::from(s))
    }
}
impl PipelineStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            PipelineStatus::Active => "Active",
            PipelineStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Active"]
    }
}
impl AsRef<str> for PipelineStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A group of versioned models in the model registry.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageGroup {
    /// <p>The name of the model group.</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model group.</p>
    #[doc(hidden)]
    pub model_package_group_arn: std::option::Option<std::string::String>,
    /// <p>The description for the model group.</p>
    #[doc(hidden)]
    pub model_package_group_description: std::option::Option<std::string::String>,
    /// <p>The time that the model group was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>The status of the model group. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>PENDING</code> - The model group is pending being created.</p> </li>
    /// <li> <p> <code>IN_PROGRESS</code> - The model group is in the process of being created.</p> </li>
    /// <li> <p> <code>COMPLETED</code> - The model group was successfully created.</p> </li>
    /// <li> <p> <code>FAILED</code> - The model group failed.</p> </li>
    /// <li> <p> <code>DELETING</code> - The model group is in the process of being deleted.</p> </li>
    /// <li> <p> <code>DELETE_FAILED</code> - SageMaker failed to delete the model group.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_package_group_status: std::option::Option<crate::model::ModelPackageGroupStatus>,
    /// <p>A list of the tags associated with the model group. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl ModelPackageGroup {
    /// <p>The name of the model group.</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model group.</p>
    pub fn model_package_group_arn(&self) -> std::option::Option<&str> {
        self.model_package_group_arn.as_deref()
    }
    /// <p>The description for the model group.</p>
    pub fn model_package_group_description(&self) -> std::option::Option<&str> {
        self.model_package_group_description.as_deref()
    }
    /// <p>The time that the model group was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>The status of the model group. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>PENDING</code> - The model group is pending being created.</p> </li>
    /// <li> <p> <code>IN_PROGRESS</code> - The model group is in the process of being created.</p> </li>
    /// <li> <p> <code>COMPLETED</code> - The model group was successfully created.</p> </li>
    /// <li> <p> <code>FAILED</code> - The model group failed.</p> </li>
    /// <li> <p> <code>DELETING</code> - The model group is in the process of being deleted.</p> </li>
    /// <li> <p> <code>DELETE_FAILED</code> - SageMaker failed to delete the model group.</p> </li>
    /// </ul>
    pub fn model_package_group_status(
        &self,
    ) -> std::option::Option<&crate::model::ModelPackageGroupStatus> {
        self.model_package_group_status.as_ref()
    }
    /// <p>A list of the tags associated with the model group. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`ModelPackageGroup`](crate::model::ModelPackageGroup).
pub mod model_package_group {

    /// A builder for [`ModelPackageGroup`](crate::model::ModelPackageGroup).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) model_package_group_arn: std::option::Option<std::string::String>,
        pub(crate) model_package_group_description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) model_package_group_status:
            std::option::Option<crate::model::ModelPackageGroupStatus>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The name of the model group.</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>The name of the model group.</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model group.</p>
        pub fn model_package_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model group.</p>
        pub fn set_model_package_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_arn = input;
            self
        }
        /// <p>The description for the model group.</p>
        pub fn model_package_group_description(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.model_package_group_description = Some(input.into());
            self
        }
        /// <p>The description for the model group.</p>
        pub fn set_model_package_group_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_description = input;
            self
        }
        /// <p>The time that the model group was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the model group was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>The status of the model group. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>PENDING</code> - The model group is pending being created.</p> </li>
        /// <li> <p> <code>IN_PROGRESS</code> - The model group is in the process of being created.</p> </li>
        /// <li> <p> <code>COMPLETED</code> - The model group was successfully created.</p> </li>
        /// <li> <p> <code>FAILED</code> - The model group failed.</p> </li>
        /// <li> <p> <code>DELETING</code> - The model group is in the process of being deleted.</p> </li>
        /// <li> <p> <code>DELETE_FAILED</code> - SageMaker failed to delete the model group.</p> </li>
        /// </ul>
        pub fn model_package_group_status(
            mut self,
            input: crate::model::ModelPackageGroupStatus,
        ) -> Self {
            self.model_package_group_status = Some(input);
            self
        }
        /// <p>The status of the model group. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>PENDING</code> - The model group is pending being created.</p> </li>
        /// <li> <p> <code>IN_PROGRESS</code> - The model group is in the process of being created.</p> </li>
        /// <li> <p> <code>COMPLETED</code> - The model group was successfully created.</p> </li>
        /// <li> <p> <code>FAILED</code> - The model group failed.</p> </li>
        /// <li> <p> <code>DELETING</code> - The model group is in the process of being deleted.</p> </li>
        /// <li> <p> <code>DELETE_FAILED</code> - SageMaker failed to delete the model group.</p> </li>
        /// </ul>
        pub fn set_model_package_group_status(
            mut self,
            input: std::option::Option<crate::model::ModelPackageGroupStatus>,
        ) -> Self {
            self.model_package_group_status = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of the tags associated with the model group. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of the tags associated with the model group. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageGroup`](crate::model::ModelPackageGroup).
        pub fn build(self) -> crate::model::ModelPackageGroup {
            crate::model::ModelPackageGroup {
                model_package_group_name: self.model_package_group_name,
                model_package_group_arn: self.model_package_group_arn,
                model_package_group_description: self.model_package_group_description,
                creation_time: self.creation_time,
                created_by: self.created_by,
                model_package_group_status: self.model_package_group_status,
                tags: self.tags,
            }
        }
    }
}
impl ModelPackageGroup {
    /// Creates a new builder-style object to manufacture [`ModelPackageGroup`](crate::model::ModelPackageGroup).
    pub fn builder() -> crate::model::model_package_group::Builder {
        crate::model::model_package_group::Builder::default()
    }
}

/// When writing a match expression against `ModelPackageGroupStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelpackagegroupstatus = unimplemented!();
/// match modelpackagegroupstatus {
///     ModelPackageGroupStatus::Completed => { /* ... */ },
///     ModelPackageGroupStatus::DeleteFailed => { /* ... */ },
///     ModelPackageGroupStatus::Deleting => { /* ... */ },
///     ModelPackageGroupStatus::Failed => { /* ... */ },
///     ModelPackageGroupStatus::InProgress => { /* ... */ },
///     ModelPackageGroupStatus::Pending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelpackagegroupstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelPackageGroupStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelPackageGroupStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelPackageGroupStatus::NewFeature` is defined.
/// Specifically, when `modelpackagegroupstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelPackageGroupStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelPackageGroupStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelPackageGroupStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => ModelPackageGroupStatus::Completed,
            "DeleteFailed" => ModelPackageGroupStatus::DeleteFailed,
            "Deleting" => ModelPackageGroupStatus::Deleting,
            "Failed" => ModelPackageGroupStatus::Failed,
            "InProgress" => ModelPackageGroupStatus::InProgress,
            "Pending" => ModelPackageGroupStatus::Pending,
            other => ModelPackageGroupStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelPackageGroupStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelPackageGroupStatus::from(s))
    }
}
impl ModelPackageGroupStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelPackageGroupStatus::Completed => "Completed",
            ModelPackageGroupStatus::DeleteFailed => "DeleteFailed",
            ModelPackageGroupStatus::Deleting => "Deleting",
            ModelPackageGroupStatus::Failed => "Failed",
            ModelPackageGroupStatus::InProgress => "InProgress",
            ModelPackageGroupStatus::Pending => "Pending",
            ModelPackageGroupStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Completed",
            "DeleteFailed",
            "Deleting",
            "Failed",
            "InProgress",
            "Pending",
        ]
    }
}
impl AsRef<str> for ModelPackageGroupStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A versioned model that can be deployed for SageMaker inference.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackage {
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model_package_name: std::option::Option<std::string::String>,
    /// <p>The model group to which the model belongs.</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>The version number of a versioned model.</p>
    #[doc(hidden)]
    pub model_package_version: std::option::Option<i32>,
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    #[doc(hidden)]
    pub model_package_arn: std::option::Option<std::string::String>,
    /// <p>The description of the model package.</p>
    #[doc(hidden)]
    pub model_package_description: std::option::Option<std::string::String>,
    /// <p>The time that the model package was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Defines how to perform inference generation after a training job is run.</p>
    #[doc(hidden)]
    pub inference_specification: std::option::Option<crate::model::InferenceSpecification>,
    /// <p>A list of algorithms that were used to create a model package.</p>
    #[doc(hidden)]
    pub source_algorithm_specification:
        std::option::Option<crate::model::SourceAlgorithmSpecification>,
    /// <p>Specifies batch transform jobs that SageMaker runs to validate your model package.</p>
    #[doc(hidden)]
    pub validation_specification:
        std::option::Option<crate::model::ModelPackageValidationSpecification>,
    /// <p>The status of the model package. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>PENDING</code> - The model package is pending being created.</p> </li>
    /// <li> <p> <code>IN_PROGRESS</code> - The model package is in the process of being created.</p> </li>
    /// <li> <p> <code>COMPLETED</code> - The model package was successfully created.</p> </li>
    /// <li> <p> <code>FAILED</code> - The model package failed.</p> </li>
    /// <li> <p> <code>DELETING</code> - The model package is in the process of being deleted.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_package_status: std::option::Option<crate::model::ModelPackageStatus>,
    /// <p>Specifies the validation and image scan statuses of the model package.</p>
    #[doc(hidden)]
    pub model_package_status_details: std::option::Option<crate::model::ModelPackageStatusDetails>,
    /// <p>Whether the model package is to be certified to be listed on Amazon Web Services Marketplace. For information about listing model packages on Amazon Web Services Marketplace, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-list.html">List Your Algorithm or Model Package on Amazon Web Services Marketplace</a>.</p>
    #[doc(hidden)]
    pub certify_for_marketplace: bool,
    /// <p>The approval status of the model. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
    /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
    /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_approval_status: std::option::Option<crate::model::ModelApprovalStatus>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
    #[doc(hidden)]
    pub metadata_properties: std::option::Option<crate::model::MetadataProperties>,
    /// <p>Metrics for the model.</p>
    #[doc(hidden)]
    pub model_metrics: std::option::Option<crate::model::ModelMetrics>,
    /// <p>The last time the model package was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>A description provided when the model approval is set.</p>
    #[doc(hidden)]
    pub approval_description: std::option::Option<std::string::String>,
    /// <p>The machine learning domain of your model package and its components. Common machine learning domains include computer vision and natural language processing.</p>
    #[doc(hidden)]
    pub domain: std::option::Option<std::string::String>,
    /// <p>The machine learning task your model package accomplishes. Common machine learning tasks include object detection and image classification.</p>
    #[doc(hidden)]
    pub task: std::option::Option<std::string::String>,
    /// <p>The Amazon Simple Storage Service path where the sample payload are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
    #[doc(hidden)]
    pub sample_payload_url: std::option::Option<std::string::String>,
    /// <p>An array of additional Inference Specification objects.</p>
    #[doc(hidden)]
    pub additional_inference_specifications: std::option::Option<
        std::vec::Vec<crate::model::AdditionalInferenceSpecificationDefinition>,
    >,
    /// <p>A list of the tags associated with the model package. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>The metadata properties for the model package. </p>
    #[doc(hidden)]
    pub customer_metadata_properties:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Represents the drift check baselines that can be used when the model monitor is set using the model package.</p>
    #[doc(hidden)]
    pub drift_check_baselines: std::option::Option<crate::model::DriftCheckBaselines>,
}
impl ModelPackage {
    /// <p>The name of the model.</p>
    pub fn model_package_name(&self) -> std::option::Option<&str> {
        self.model_package_name.as_deref()
    }
    /// <p>The model group to which the model belongs.</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>The version number of a versioned model.</p>
    pub fn model_package_version(&self) -> std::option::Option<i32> {
        self.model_package_version
    }
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    pub fn model_package_arn(&self) -> std::option::Option<&str> {
        self.model_package_arn.as_deref()
    }
    /// <p>The description of the model package.</p>
    pub fn model_package_description(&self) -> std::option::Option<&str> {
        self.model_package_description.as_deref()
    }
    /// <p>The time that the model package was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Defines how to perform inference generation after a training job is run.</p>
    pub fn inference_specification(
        &self,
    ) -> std::option::Option<&crate::model::InferenceSpecification> {
        self.inference_specification.as_ref()
    }
    /// <p>A list of algorithms that were used to create a model package.</p>
    pub fn source_algorithm_specification(
        &self,
    ) -> std::option::Option<&crate::model::SourceAlgorithmSpecification> {
        self.source_algorithm_specification.as_ref()
    }
    /// <p>Specifies batch transform jobs that SageMaker runs to validate your model package.</p>
    pub fn validation_specification(
        &self,
    ) -> std::option::Option<&crate::model::ModelPackageValidationSpecification> {
        self.validation_specification.as_ref()
    }
    /// <p>The status of the model package. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>PENDING</code> - The model package is pending being created.</p> </li>
    /// <li> <p> <code>IN_PROGRESS</code> - The model package is in the process of being created.</p> </li>
    /// <li> <p> <code>COMPLETED</code> - The model package was successfully created.</p> </li>
    /// <li> <p> <code>FAILED</code> - The model package failed.</p> </li>
    /// <li> <p> <code>DELETING</code> - The model package is in the process of being deleted.</p> </li>
    /// </ul>
    pub fn model_package_status(&self) -> std::option::Option<&crate::model::ModelPackageStatus> {
        self.model_package_status.as_ref()
    }
    /// <p>Specifies the validation and image scan statuses of the model package.</p>
    pub fn model_package_status_details(
        &self,
    ) -> std::option::Option<&crate::model::ModelPackageStatusDetails> {
        self.model_package_status_details.as_ref()
    }
    /// <p>Whether the model package is to be certified to be listed on Amazon Web Services Marketplace. For information about listing model packages on Amazon Web Services Marketplace, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-list.html">List Your Algorithm or Model Package on Amazon Web Services Marketplace</a>.</p>
    pub fn certify_for_marketplace(&self) -> bool {
        self.certify_for_marketplace
    }
    /// <p>The approval status of the model. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
    /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
    /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
    /// </ul>
    pub fn model_approval_status(&self) -> std::option::Option<&crate::model::ModelApprovalStatus> {
        self.model_approval_status.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
    pub fn metadata_properties(&self) -> std::option::Option<&crate::model::MetadataProperties> {
        self.metadata_properties.as_ref()
    }
    /// <p>Metrics for the model.</p>
    pub fn model_metrics(&self) -> std::option::Option<&crate::model::ModelMetrics> {
        self.model_metrics.as_ref()
    }
    /// <p>The last time the model package was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>A description provided when the model approval is set.</p>
    pub fn approval_description(&self) -> std::option::Option<&str> {
        self.approval_description.as_deref()
    }
    /// <p>The machine learning domain of your model package and its components. Common machine learning domains include computer vision and natural language processing.</p>
    pub fn domain(&self) -> std::option::Option<&str> {
        self.domain.as_deref()
    }
    /// <p>The machine learning task your model package accomplishes. Common machine learning tasks include object detection and image classification.</p>
    pub fn task(&self) -> std::option::Option<&str> {
        self.task.as_deref()
    }
    /// <p>The Amazon Simple Storage Service path where the sample payload are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
    pub fn sample_payload_url(&self) -> std::option::Option<&str> {
        self.sample_payload_url.as_deref()
    }
    /// <p>An array of additional Inference Specification objects.</p>
    pub fn additional_inference_specifications(
        &self,
    ) -> std::option::Option<&[crate::model::AdditionalInferenceSpecificationDefinition]> {
        self.additional_inference_specifications.as_deref()
    }
    /// <p>A list of the tags associated with the model package. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>The metadata properties for the model package. </p>
    pub fn customer_metadata_properties(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.customer_metadata_properties.as_ref()
    }
    /// <p>Represents the drift check baselines that can be used when the model monitor is set using the model package.</p>
    pub fn drift_check_baselines(&self) -> std::option::Option<&crate::model::DriftCheckBaselines> {
        self.drift_check_baselines.as_ref()
    }
}
/// See [`ModelPackage`](crate::model::ModelPackage).
pub mod model_package {

    /// A builder for [`ModelPackage`](crate::model::ModelPackage).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_package_name: std::option::Option<std::string::String>,
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) model_package_version: std::option::Option<i32>,
        pub(crate) model_package_arn: std::option::Option<std::string::String>,
        pub(crate) model_package_description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) inference_specification:
            std::option::Option<crate::model::InferenceSpecification>,
        pub(crate) source_algorithm_specification:
            std::option::Option<crate::model::SourceAlgorithmSpecification>,
        pub(crate) validation_specification:
            std::option::Option<crate::model::ModelPackageValidationSpecification>,
        pub(crate) model_package_status: std::option::Option<crate::model::ModelPackageStatus>,
        pub(crate) model_package_status_details:
            std::option::Option<crate::model::ModelPackageStatusDetails>,
        pub(crate) certify_for_marketplace: std::option::Option<bool>,
        pub(crate) model_approval_status: std::option::Option<crate::model::ModelApprovalStatus>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) metadata_properties: std::option::Option<crate::model::MetadataProperties>,
        pub(crate) model_metrics: std::option::Option<crate::model::ModelMetrics>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) approval_description: std::option::Option<std::string::String>,
        pub(crate) domain: std::option::Option<std::string::String>,
        pub(crate) task: std::option::Option<std::string::String>,
        pub(crate) sample_payload_url: std::option::Option<std::string::String>,
        pub(crate) additional_inference_specifications: std::option::Option<
            std::vec::Vec<crate::model::AdditionalInferenceSpecificationDefinition>,
        >,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) customer_metadata_properties: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) drift_check_baselines: std::option::Option<crate::model::DriftCheckBaselines>,
    }
    impl Builder {
        /// <p>The name of the model.</p>
        pub fn model_package_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_name = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model_package_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_name = input;
            self
        }
        /// <p>The model group to which the model belongs.</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>The model group to which the model belongs.</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>The version number of a versioned model.</p>
        pub fn model_package_version(mut self, input: i32) -> Self {
            self.model_package_version = Some(input);
            self
        }
        /// <p>The version number of a versioned model.</p>
        pub fn set_model_package_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_package_version = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn model_package_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn set_model_package_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_arn = input;
            self
        }
        /// <p>The description of the model package.</p>
        pub fn model_package_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_description = Some(input.into());
            self
        }
        /// <p>The description of the model package.</p>
        pub fn set_model_package_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_description = input;
            self
        }
        /// <p>The time that the model package was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the model package was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Defines how to perform inference generation after a training job is run.</p>
        pub fn inference_specification(
            mut self,
            input: crate::model::InferenceSpecification,
        ) -> Self {
            self.inference_specification = Some(input);
            self
        }
        /// <p>Defines how to perform inference generation after a training job is run.</p>
        pub fn set_inference_specification(
            mut self,
            input: std::option::Option<crate::model::InferenceSpecification>,
        ) -> Self {
            self.inference_specification = input;
            self
        }
        /// <p>A list of algorithms that were used to create a model package.</p>
        pub fn source_algorithm_specification(
            mut self,
            input: crate::model::SourceAlgorithmSpecification,
        ) -> Self {
            self.source_algorithm_specification = Some(input);
            self
        }
        /// <p>A list of algorithms that were used to create a model package.</p>
        pub fn set_source_algorithm_specification(
            mut self,
            input: std::option::Option<crate::model::SourceAlgorithmSpecification>,
        ) -> Self {
            self.source_algorithm_specification = input;
            self
        }
        /// <p>Specifies batch transform jobs that SageMaker runs to validate your model package.</p>
        pub fn validation_specification(
            mut self,
            input: crate::model::ModelPackageValidationSpecification,
        ) -> Self {
            self.validation_specification = Some(input);
            self
        }
        /// <p>Specifies batch transform jobs that SageMaker runs to validate your model package.</p>
        pub fn set_validation_specification(
            mut self,
            input: std::option::Option<crate::model::ModelPackageValidationSpecification>,
        ) -> Self {
            self.validation_specification = input;
            self
        }
        /// <p>The status of the model package. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>PENDING</code> - The model package is pending being created.</p> </li>
        /// <li> <p> <code>IN_PROGRESS</code> - The model package is in the process of being created.</p> </li>
        /// <li> <p> <code>COMPLETED</code> - The model package was successfully created.</p> </li>
        /// <li> <p> <code>FAILED</code> - The model package failed.</p> </li>
        /// <li> <p> <code>DELETING</code> - The model package is in the process of being deleted.</p> </li>
        /// </ul>
        pub fn model_package_status(mut self, input: crate::model::ModelPackageStatus) -> Self {
            self.model_package_status = Some(input);
            self
        }
        /// <p>The status of the model package. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>PENDING</code> - The model package is pending being created.</p> </li>
        /// <li> <p> <code>IN_PROGRESS</code> - The model package is in the process of being created.</p> </li>
        /// <li> <p> <code>COMPLETED</code> - The model package was successfully created.</p> </li>
        /// <li> <p> <code>FAILED</code> - The model package failed.</p> </li>
        /// <li> <p> <code>DELETING</code> - The model package is in the process of being deleted.</p> </li>
        /// </ul>
        pub fn set_model_package_status(
            mut self,
            input: std::option::Option<crate::model::ModelPackageStatus>,
        ) -> Self {
            self.model_package_status = input;
            self
        }
        /// <p>Specifies the validation and image scan statuses of the model package.</p>
        pub fn model_package_status_details(
            mut self,
            input: crate::model::ModelPackageStatusDetails,
        ) -> Self {
            self.model_package_status_details = Some(input);
            self
        }
        /// <p>Specifies the validation and image scan statuses of the model package.</p>
        pub fn set_model_package_status_details(
            mut self,
            input: std::option::Option<crate::model::ModelPackageStatusDetails>,
        ) -> Self {
            self.model_package_status_details = input;
            self
        }
        /// <p>Whether the model package is to be certified to be listed on Amazon Web Services Marketplace. For information about listing model packages on Amazon Web Services Marketplace, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-list.html">List Your Algorithm or Model Package on Amazon Web Services Marketplace</a>.</p>
        pub fn certify_for_marketplace(mut self, input: bool) -> Self {
            self.certify_for_marketplace = Some(input);
            self
        }
        /// <p>Whether the model package is to be certified to be listed on Amazon Web Services Marketplace. For information about listing model packages on Amazon Web Services Marketplace, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-list.html">List Your Algorithm or Model Package on Amazon Web Services Marketplace</a>.</p>
        pub fn set_certify_for_marketplace(mut self, input: std::option::Option<bool>) -> Self {
            self.certify_for_marketplace = input;
            self
        }
        /// <p>The approval status of the model. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
        /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
        /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
        /// </ul>
        pub fn model_approval_status(mut self, input: crate::model::ModelApprovalStatus) -> Self {
            self.model_approval_status = Some(input);
            self
        }
        /// <p>The approval status of the model. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
        /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
        /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
        /// </ul>
        pub fn set_model_approval_status(
            mut self,
            input: std::option::Option<crate::model::ModelApprovalStatus>,
        ) -> Self {
            self.model_approval_status = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
        pub fn metadata_properties(mut self, input: crate::model::MetadataProperties) -> Self {
            self.metadata_properties = Some(input);
            self
        }
        /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
        pub fn set_metadata_properties(
            mut self,
            input: std::option::Option<crate::model::MetadataProperties>,
        ) -> Self {
            self.metadata_properties = input;
            self
        }
        /// <p>Metrics for the model.</p>
        pub fn model_metrics(mut self, input: crate::model::ModelMetrics) -> Self {
            self.model_metrics = Some(input);
            self
        }
        /// <p>Metrics for the model.</p>
        pub fn set_model_metrics(
            mut self,
            input: std::option::Option<crate::model::ModelMetrics>,
        ) -> Self {
            self.model_metrics = input;
            self
        }
        /// <p>The last time the model package was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last time the model package was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, or project.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// <p>A description provided when the model approval is set.</p>
        pub fn approval_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.approval_description = Some(input.into());
            self
        }
        /// <p>A description provided when the model approval is set.</p>
        pub fn set_approval_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.approval_description = input;
            self
        }
        /// <p>The machine learning domain of your model package and its components. Common machine learning domains include computer vision and natural language processing.</p>
        pub fn domain(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain = Some(input.into());
            self
        }
        /// <p>The machine learning domain of your model package and its components. Common machine learning domains include computer vision and natural language processing.</p>
        pub fn set_domain(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain = input;
            self
        }
        /// <p>The machine learning task your model package accomplishes. Common machine learning tasks include object detection and image classification.</p>
        pub fn task(mut self, input: impl Into<std::string::String>) -> Self {
            self.task = Some(input.into());
            self
        }
        /// <p>The machine learning task your model package accomplishes. Common machine learning tasks include object detection and image classification.</p>
        pub fn set_task(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.task = input;
            self
        }
        /// <p>The Amazon Simple Storage Service path where the sample payload are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
        pub fn sample_payload_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.sample_payload_url = Some(input.into());
            self
        }
        /// <p>The Amazon Simple Storage Service path where the sample payload are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
        pub fn set_sample_payload_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sample_payload_url = input;
            self
        }
        /// Appends an item to `additional_inference_specifications`.
        ///
        /// To override the contents of this collection use [`set_additional_inference_specifications`](Self::set_additional_inference_specifications).
        ///
        /// <p>An array of additional Inference Specification objects.</p>
        pub fn additional_inference_specifications(
            mut self,
            input: crate::model::AdditionalInferenceSpecificationDefinition,
        ) -> Self {
            let mut v = self.additional_inference_specifications.unwrap_or_default();
            v.push(input);
            self.additional_inference_specifications = Some(v);
            self
        }
        /// <p>An array of additional Inference Specification objects.</p>
        pub fn set_additional_inference_specifications(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::AdditionalInferenceSpecificationDefinition>,
            >,
        ) -> Self {
            self.additional_inference_specifications = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of the tags associated with the model package. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of the tags associated with the model package. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Adds a key-value pair to `customer_metadata_properties`.
        ///
        /// To override the contents of this collection use [`set_customer_metadata_properties`](Self::set_customer_metadata_properties).
        ///
        /// <p>The metadata properties for the model package. </p>
        pub fn customer_metadata_properties(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.customer_metadata_properties.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.customer_metadata_properties = Some(hash_map);
            self
        }
        /// <p>The metadata properties for the model package. </p>
        pub fn set_customer_metadata_properties(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.customer_metadata_properties = input;
            self
        }
        /// <p>Represents the drift check baselines that can be used when the model monitor is set using the model package.</p>
        pub fn drift_check_baselines(mut self, input: crate::model::DriftCheckBaselines) -> Self {
            self.drift_check_baselines = Some(input);
            self
        }
        /// <p>Represents the drift check baselines that can be used when the model monitor is set using the model package.</p>
        pub fn set_drift_check_baselines(
            mut self,
            input: std::option::Option<crate::model::DriftCheckBaselines>,
        ) -> Self {
            self.drift_check_baselines = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackage`](crate::model::ModelPackage).
        pub fn build(self) -> crate::model::ModelPackage {
            crate::model::ModelPackage {
                model_package_name: self.model_package_name,
                model_package_group_name: self.model_package_group_name,
                model_package_version: self.model_package_version,
                model_package_arn: self.model_package_arn,
                model_package_description: self.model_package_description,
                creation_time: self.creation_time,
                inference_specification: self.inference_specification,
                source_algorithm_specification: self.source_algorithm_specification,
                validation_specification: self.validation_specification,
                model_package_status: self.model_package_status,
                model_package_status_details: self.model_package_status_details,
                certify_for_marketplace: self.certify_for_marketplace.unwrap_or_default(),
                model_approval_status: self.model_approval_status,
                created_by: self.created_by,
                metadata_properties: self.metadata_properties,
                model_metrics: self.model_metrics,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
                approval_description: self.approval_description,
                domain: self.domain,
                task: self.task,
                sample_payload_url: self.sample_payload_url,
                additional_inference_specifications: self.additional_inference_specifications,
                tags: self.tags,
                customer_metadata_properties: self.customer_metadata_properties,
                drift_check_baselines: self.drift_check_baselines,
            }
        }
    }
}
impl ModelPackage {
    /// Creates a new builder-style object to manufacture [`ModelPackage`](crate::model::ModelPackage).
    pub fn builder() -> crate::model::model_package::Builder {
        crate::model::model_package::Builder::default()
    }
}

/// <p>Represents the drift check baselines that can be used when the model monitor is set using the model package. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DriftCheckBaselines {
    /// <p>Represents the drift check bias baselines that can be used when the model monitor is set using the model package. </p>
    #[doc(hidden)]
    pub bias: std::option::Option<crate::model::DriftCheckBias>,
    /// <p>Represents the drift check explainability baselines that can be used when the model monitor is set using the model package. </p>
    #[doc(hidden)]
    pub explainability: std::option::Option<crate::model::DriftCheckExplainability>,
    /// <p>Represents the drift check model quality baselines that can be used when the model monitor is set using the model package.</p>
    #[doc(hidden)]
    pub model_quality: std::option::Option<crate::model::DriftCheckModelQuality>,
    /// <p>Represents the drift check model data quality baselines that can be used when the model monitor is set using the model package.</p>
    #[doc(hidden)]
    pub model_data_quality: std::option::Option<crate::model::DriftCheckModelDataQuality>,
}
impl DriftCheckBaselines {
    /// <p>Represents the drift check bias baselines that can be used when the model monitor is set using the model package. </p>
    pub fn bias(&self) -> std::option::Option<&crate::model::DriftCheckBias> {
        self.bias.as_ref()
    }
    /// <p>Represents the drift check explainability baselines that can be used when the model monitor is set using the model package. </p>
    pub fn explainability(&self) -> std::option::Option<&crate::model::DriftCheckExplainability> {
        self.explainability.as_ref()
    }
    /// <p>Represents the drift check model quality baselines that can be used when the model monitor is set using the model package.</p>
    pub fn model_quality(&self) -> std::option::Option<&crate::model::DriftCheckModelQuality> {
        self.model_quality.as_ref()
    }
    /// <p>Represents the drift check model data quality baselines that can be used when the model monitor is set using the model package.</p>
    pub fn model_data_quality(
        &self,
    ) -> std::option::Option<&crate::model::DriftCheckModelDataQuality> {
        self.model_data_quality.as_ref()
    }
}
/// See [`DriftCheckBaselines`](crate::model::DriftCheckBaselines).
pub mod drift_check_baselines {

    /// A builder for [`DriftCheckBaselines`](crate::model::DriftCheckBaselines).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) bias: std::option::Option<crate::model::DriftCheckBias>,
        pub(crate) explainability: std::option::Option<crate::model::DriftCheckExplainability>,
        pub(crate) model_quality: std::option::Option<crate::model::DriftCheckModelQuality>,
        pub(crate) model_data_quality:
            std::option::Option<crate::model::DriftCheckModelDataQuality>,
    }
    impl Builder {
        /// <p>Represents the drift check bias baselines that can be used when the model monitor is set using the model package. </p>
        pub fn bias(mut self, input: crate::model::DriftCheckBias) -> Self {
            self.bias = Some(input);
            self
        }
        /// <p>Represents the drift check bias baselines that can be used when the model monitor is set using the model package. </p>
        pub fn set_bias(
            mut self,
            input: std::option::Option<crate::model::DriftCheckBias>,
        ) -> Self {
            self.bias = input;
            self
        }
        /// <p>Represents the drift check explainability baselines that can be used when the model monitor is set using the model package. </p>
        pub fn explainability(mut self, input: crate::model::DriftCheckExplainability) -> Self {
            self.explainability = Some(input);
            self
        }
        /// <p>Represents the drift check explainability baselines that can be used when the model monitor is set using the model package. </p>
        pub fn set_explainability(
            mut self,
            input: std::option::Option<crate::model::DriftCheckExplainability>,
        ) -> Self {
            self.explainability = input;
            self
        }
        /// <p>Represents the drift check model quality baselines that can be used when the model monitor is set using the model package.</p>
        pub fn model_quality(mut self, input: crate::model::DriftCheckModelQuality) -> Self {
            self.model_quality = Some(input);
            self
        }
        /// <p>Represents the drift check model quality baselines that can be used when the model monitor is set using the model package.</p>
        pub fn set_model_quality(
            mut self,
            input: std::option::Option<crate::model::DriftCheckModelQuality>,
        ) -> Self {
            self.model_quality = input;
            self
        }
        /// <p>Represents the drift check model data quality baselines that can be used when the model monitor is set using the model package.</p>
        pub fn model_data_quality(
            mut self,
            input: crate::model::DriftCheckModelDataQuality,
        ) -> Self {
            self.model_data_quality = Some(input);
            self
        }
        /// <p>Represents the drift check model data quality baselines that can be used when the model monitor is set using the model package.</p>
        pub fn set_model_data_quality(
            mut self,
            input: std::option::Option<crate::model::DriftCheckModelDataQuality>,
        ) -> Self {
            self.model_data_quality = input;
            self
        }
        /// Consumes the builder and constructs a [`DriftCheckBaselines`](crate::model::DriftCheckBaselines).
        pub fn build(self) -> crate::model::DriftCheckBaselines {
            crate::model::DriftCheckBaselines {
                bias: self.bias,
                explainability: self.explainability,
                model_quality: self.model_quality,
                model_data_quality: self.model_data_quality,
            }
        }
    }
}
impl DriftCheckBaselines {
    /// Creates a new builder-style object to manufacture [`DriftCheckBaselines`](crate::model::DriftCheckBaselines).
    pub fn builder() -> crate::model::drift_check_baselines::Builder {
        crate::model::drift_check_baselines::Builder::default()
    }
}

/// <p>Represents the drift check data quality baselines that can be used when the model monitor is set using the model package. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DriftCheckModelDataQuality {
    /// <p>The drift check model data quality statistics.</p>
    #[doc(hidden)]
    pub statistics: std::option::Option<crate::model::MetricsSource>,
    /// <p>The drift check model data quality constraints.</p>
    #[doc(hidden)]
    pub constraints: std::option::Option<crate::model::MetricsSource>,
}
impl DriftCheckModelDataQuality {
    /// <p>The drift check model data quality statistics.</p>
    pub fn statistics(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.statistics.as_ref()
    }
    /// <p>The drift check model data quality constraints.</p>
    pub fn constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.constraints.as_ref()
    }
}
/// See [`DriftCheckModelDataQuality`](crate::model::DriftCheckModelDataQuality).
pub mod drift_check_model_data_quality {

    /// A builder for [`DriftCheckModelDataQuality`](crate::model::DriftCheckModelDataQuality).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) statistics: std::option::Option<crate::model::MetricsSource>,
        pub(crate) constraints: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>The drift check model data quality statistics.</p>
        pub fn statistics(mut self, input: crate::model::MetricsSource) -> Self {
            self.statistics = Some(input);
            self
        }
        /// <p>The drift check model data quality statistics.</p>
        pub fn set_statistics(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.statistics = input;
            self
        }
        /// <p>The drift check model data quality constraints.</p>
        pub fn constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.constraints = Some(input);
            self
        }
        /// <p>The drift check model data quality constraints.</p>
        pub fn set_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.constraints = input;
            self
        }
        /// Consumes the builder and constructs a [`DriftCheckModelDataQuality`](crate::model::DriftCheckModelDataQuality).
        pub fn build(self) -> crate::model::DriftCheckModelDataQuality {
            crate::model::DriftCheckModelDataQuality {
                statistics: self.statistics,
                constraints: self.constraints,
            }
        }
    }
}
impl DriftCheckModelDataQuality {
    /// Creates a new builder-style object to manufacture [`DriftCheckModelDataQuality`](crate::model::DriftCheckModelDataQuality).
    pub fn builder() -> crate::model::drift_check_model_data_quality::Builder {
        crate::model::drift_check_model_data_quality::Builder::default()
    }
}

/// <p>Details about the metrics source.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MetricsSource {
    /// <p>The metric source content type.</p>
    #[doc(hidden)]
    pub content_type: std::option::Option<std::string::String>,
    /// <p>The hash key used for the metrics source.</p>
    #[doc(hidden)]
    pub content_digest: std::option::Option<std::string::String>,
    /// <p>The S3 URI for the metrics source.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl MetricsSource {
    /// <p>The metric source content type.</p>
    pub fn content_type(&self) -> std::option::Option<&str> {
        self.content_type.as_deref()
    }
    /// <p>The hash key used for the metrics source.</p>
    pub fn content_digest(&self) -> std::option::Option<&str> {
        self.content_digest.as_deref()
    }
    /// <p>The S3 URI for the metrics source.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`MetricsSource`](crate::model::MetricsSource).
pub mod metrics_source {

    /// A builder for [`MetricsSource`](crate::model::MetricsSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) content_type: std::option::Option<std::string::String>,
        pub(crate) content_digest: std::option::Option<std::string::String>,
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The metric source content type.</p>
        pub fn content_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_type = Some(input.into());
            self
        }
        /// <p>The metric source content type.</p>
        pub fn set_content_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content_type = input;
            self
        }
        /// <p>The hash key used for the metrics source.</p>
        pub fn content_digest(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_digest = Some(input.into());
            self
        }
        /// <p>The hash key used for the metrics source.</p>
        pub fn set_content_digest(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.content_digest = input;
            self
        }
        /// <p>The S3 URI for the metrics source.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The S3 URI for the metrics source.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`MetricsSource`](crate::model::MetricsSource).
        pub fn build(self) -> crate::model::MetricsSource {
            crate::model::MetricsSource {
                content_type: self.content_type,
                content_digest: self.content_digest,
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl MetricsSource {
    /// Creates a new builder-style object to manufacture [`MetricsSource`](crate::model::MetricsSource).
    pub fn builder() -> crate::model::metrics_source::Builder {
        crate::model::metrics_source::Builder::default()
    }
}

/// <p>Represents the drift check model quality baselines that can be used when the model monitor is set using the model package. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DriftCheckModelQuality {
    /// <p>The drift check model quality statistics.</p>
    #[doc(hidden)]
    pub statistics: std::option::Option<crate::model::MetricsSource>,
    /// <p>The drift check model quality constraints.</p>
    #[doc(hidden)]
    pub constraints: std::option::Option<crate::model::MetricsSource>,
}
impl DriftCheckModelQuality {
    /// <p>The drift check model quality statistics.</p>
    pub fn statistics(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.statistics.as_ref()
    }
    /// <p>The drift check model quality constraints.</p>
    pub fn constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.constraints.as_ref()
    }
}
/// See [`DriftCheckModelQuality`](crate::model::DriftCheckModelQuality).
pub mod drift_check_model_quality {

    /// A builder for [`DriftCheckModelQuality`](crate::model::DriftCheckModelQuality).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) statistics: std::option::Option<crate::model::MetricsSource>,
        pub(crate) constraints: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>The drift check model quality statistics.</p>
        pub fn statistics(mut self, input: crate::model::MetricsSource) -> Self {
            self.statistics = Some(input);
            self
        }
        /// <p>The drift check model quality statistics.</p>
        pub fn set_statistics(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.statistics = input;
            self
        }
        /// <p>The drift check model quality constraints.</p>
        pub fn constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.constraints = Some(input);
            self
        }
        /// <p>The drift check model quality constraints.</p>
        pub fn set_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.constraints = input;
            self
        }
        /// Consumes the builder and constructs a [`DriftCheckModelQuality`](crate::model::DriftCheckModelQuality).
        pub fn build(self) -> crate::model::DriftCheckModelQuality {
            crate::model::DriftCheckModelQuality {
                statistics: self.statistics,
                constraints: self.constraints,
            }
        }
    }
}
impl DriftCheckModelQuality {
    /// Creates a new builder-style object to manufacture [`DriftCheckModelQuality`](crate::model::DriftCheckModelQuality).
    pub fn builder() -> crate::model::drift_check_model_quality::Builder {
        crate::model::drift_check_model_quality::Builder::default()
    }
}

/// <p>Represents the drift check explainability baselines that can be used when the model monitor is set using the model package. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DriftCheckExplainability {
    /// <p>The drift check explainability constraints.</p>
    #[doc(hidden)]
    pub constraints: std::option::Option<crate::model::MetricsSource>,
    /// <p>The explainability config file for the model.</p>
    #[doc(hidden)]
    pub config_file: std::option::Option<crate::model::FileSource>,
}
impl DriftCheckExplainability {
    /// <p>The drift check explainability constraints.</p>
    pub fn constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.constraints.as_ref()
    }
    /// <p>The explainability config file for the model.</p>
    pub fn config_file(&self) -> std::option::Option<&crate::model::FileSource> {
        self.config_file.as_ref()
    }
}
/// See [`DriftCheckExplainability`](crate::model::DriftCheckExplainability).
pub mod drift_check_explainability {

    /// A builder for [`DriftCheckExplainability`](crate::model::DriftCheckExplainability).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) constraints: std::option::Option<crate::model::MetricsSource>,
        pub(crate) config_file: std::option::Option<crate::model::FileSource>,
    }
    impl Builder {
        /// <p>The drift check explainability constraints.</p>
        pub fn constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.constraints = Some(input);
            self
        }
        /// <p>The drift check explainability constraints.</p>
        pub fn set_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.constraints = input;
            self
        }
        /// <p>The explainability config file for the model.</p>
        pub fn config_file(mut self, input: crate::model::FileSource) -> Self {
            self.config_file = Some(input);
            self
        }
        /// <p>The explainability config file for the model.</p>
        pub fn set_config_file(
            mut self,
            input: std::option::Option<crate::model::FileSource>,
        ) -> Self {
            self.config_file = input;
            self
        }
        /// Consumes the builder and constructs a [`DriftCheckExplainability`](crate::model::DriftCheckExplainability).
        pub fn build(self) -> crate::model::DriftCheckExplainability {
            crate::model::DriftCheckExplainability {
                constraints: self.constraints,
                config_file: self.config_file,
            }
        }
    }
}
impl DriftCheckExplainability {
    /// Creates a new builder-style object to manufacture [`DriftCheckExplainability`](crate::model::DriftCheckExplainability).
    pub fn builder() -> crate::model::drift_check_explainability::Builder {
        crate::model::drift_check_explainability::Builder::default()
    }
}

/// <p>Contains details regarding the file source.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FileSource {
    /// <p>The type of content stored in the file source.</p>
    #[doc(hidden)]
    pub content_type: std::option::Option<std::string::String>,
    /// <p>The digest of the file source.</p>
    #[doc(hidden)]
    pub content_digest: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI for the file source.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl FileSource {
    /// <p>The type of content stored in the file source.</p>
    pub fn content_type(&self) -> std::option::Option<&str> {
        self.content_type.as_deref()
    }
    /// <p>The digest of the file source.</p>
    pub fn content_digest(&self) -> std::option::Option<&str> {
        self.content_digest.as_deref()
    }
    /// <p>The Amazon S3 URI for the file source.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`FileSource`](crate::model::FileSource).
pub mod file_source {

    /// A builder for [`FileSource`](crate::model::FileSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) content_type: std::option::Option<std::string::String>,
        pub(crate) content_digest: std::option::Option<std::string::String>,
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The type of content stored in the file source.</p>
        pub fn content_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_type = Some(input.into());
            self
        }
        /// <p>The type of content stored in the file source.</p>
        pub fn set_content_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content_type = input;
            self
        }
        /// <p>The digest of the file source.</p>
        pub fn content_digest(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_digest = Some(input.into());
            self
        }
        /// <p>The digest of the file source.</p>
        pub fn set_content_digest(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.content_digest = input;
            self
        }
        /// <p>The Amazon S3 URI for the file source.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI for the file source.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`FileSource`](crate::model::FileSource).
        pub fn build(self) -> crate::model::FileSource {
            crate::model::FileSource {
                content_type: self.content_type,
                content_digest: self.content_digest,
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl FileSource {
    /// Creates a new builder-style object to manufacture [`FileSource`](crate::model::FileSource).
    pub fn builder() -> crate::model::file_source::Builder {
        crate::model::file_source::Builder::default()
    }
}

/// <p>Represents the drift check bias baselines that can be used when the model monitor is set using the model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DriftCheckBias {
    /// <p>The bias config file for a model.</p>
    #[doc(hidden)]
    pub config_file: std::option::Option<crate::model::FileSource>,
    /// <p>The pre-training constraints.</p>
    #[doc(hidden)]
    pub pre_training_constraints: std::option::Option<crate::model::MetricsSource>,
    /// <p>The post-training constraints.</p>
    #[doc(hidden)]
    pub post_training_constraints: std::option::Option<crate::model::MetricsSource>,
}
impl DriftCheckBias {
    /// <p>The bias config file for a model.</p>
    pub fn config_file(&self) -> std::option::Option<&crate::model::FileSource> {
        self.config_file.as_ref()
    }
    /// <p>The pre-training constraints.</p>
    pub fn pre_training_constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.pre_training_constraints.as_ref()
    }
    /// <p>The post-training constraints.</p>
    pub fn post_training_constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.post_training_constraints.as_ref()
    }
}
/// See [`DriftCheckBias`](crate::model::DriftCheckBias).
pub mod drift_check_bias {

    /// A builder for [`DriftCheckBias`](crate::model::DriftCheckBias).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) config_file: std::option::Option<crate::model::FileSource>,
        pub(crate) pre_training_constraints: std::option::Option<crate::model::MetricsSource>,
        pub(crate) post_training_constraints: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>The bias config file for a model.</p>
        pub fn config_file(mut self, input: crate::model::FileSource) -> Self {
            self.config_file = Some(input);
            self
        }
        /// <p>The bias config file for a model.</p>
        pub fn set_config_file(
            mut self,
            input: std::option::Option<crate::model::FileSource>,
        ) -> Self {
            self.config_file = input;
            self
        }
        /// <p>The pre-training constraints.</p>
        pub fn pre_training_constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.pre_training_constraints = Some(input);
            self
        }
        /// <p>The pre-training constraints.</p>
        pub fn set_pre_training_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.pre_training_constraints = input;
            self
        }
        /// <p>The post-training constraints.</p>
        pub fn post_training_constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.post_training_constraints = Some(input);
            self
        }
        /// <p>The post-training constraints.</p>
        pub fn set_post_training_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.post_training_constraints = input;
            self
        }
        /// Consumes the builder and constructs a [`DriftCheckBias`](crate::model::DriftCheckBias).
        pub fn build(self) -> crate::model::DriftCheckBias {
            crate::model::DriftCheckBias {
                config_file: self.config_file,
                pre_training_constraints: self.pre_training_constraints,
                post_training_constraints: self.post_training_constraints,
            }
        }
    }
}
impl DriftCheckBias {
    /// Creates a new builder-style object to manufacture [`DriftCheckBias`](crate::model::DriftCheckBias).
    pub fn builder() -> crate::model::drift_check_bias::Builder {
        crate::model::drift_check_bias::Builder::default()
    }
}

/// <p>Contains metrics captured from a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelMetrics {
    /// <p>Metrics that measure the quality of a model.</p>
    #[doc(hidden)]
    pub model_quality: std::option::Option<crate::model::ModelQuality>,
    /// <p>Metrics that measure the quality of the input data for a model.</p>
    #[doc(hidden)]
    pub model_data_quality: std::option::Option<crate::model::ModelDataQuality>,
    /// <p>Metrics that measure bais in a model.</p>
    #[doc(hidden)]
    pub bias: std::option::Option<crate::model::Bias>,
    /// <p>Metrics that help explain a model.</p>
    #[doc(hidden)]
    pub explainability: std::option::Option<crate::model::Explainability>,
}
impl ModelMetrics {
    /// <p>Metrics that measure the quality of a model.</p>
    pub fn model_quality(&self) -> std::option::Option<&crate::model::ModelQuality> {
        self.model_quality.as_ref()
    }
    /// <p>Metrics that measure the quality of the input data for a model.</p>
    pub fn model_data_quality(&self) -> std::option::Option<&crate::model::ModelDataQuality> {
        self.model_data_quality.as_ref()
    }
    /// <p>Metrics that measure bais in a model.</p>
    pub fn bias(&self) -> std::option::Option<&crate::model::Bias> {
        self.bias.as_ref()
    }
    /// <p>Metrics that help explain a model.</p>
    pub fn explainability(&self) -> std::option::Option<&crate::model::Explainability> {
        self.explainability.as_ref()
    }
}
/// See [`ModelMetrics`](crate::model::ModelMetrics).
pub mod model_metrics {

    /// A builder for [`ModelMetrics`](crate::model::ModelMetrics).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_quality: std::option::Option<crate::model::ModelQuality>,
        pub(crate) model_data_quality: std::option::Option<crate::model::ModelDataQuality>,
        pub(crate) bias: std::option::Option<crate::model::Bias>,
        pub(crate) explainability: std::option::Option<crate::model::Explainability>,
    }
    impl Builder {
        /// <p>Metrics that measure the quality of a model.</p>
        pub fn model_quality(mut self, input: crate::model::ModelQuality) -> Self {
            self.model_quality = Some(input);
            self
        }
        /// <p>Metrics that measure the quality of a model.</p>
        pub fn set_model_quality(
            mut self,
            input: std::option::Option<crate::model::ModelQuality>,
        ) -> Self {
            self.model_quality = input;
            self
        }
        /// <p>Metrics that measure the quality of the input data for a model.</p>
        pub fn model_data_quality(mut self, input: crate::model::ModelDataQuality) -> Self {
            self.model_data_quality = Some(input);
            self
        }
        /// <p>Metrics that measure the quality of the input data for a model.</p>
        pub fn set_model_data_quality(
            mut self,
            input: std::option::Option<crate::model::ModelDataQuality>,
        ) -> Self {
            self.model_data_quality = input;
            self
        }
        /// <p>Metrics that measure bais in a model.</p>
        pub fn bias(mut self, input: crate::model::Bias) -> Self {
            self.bias = Some(input);
            self
        }
        /// <p>Metrics that measure bais in a model.</p>
        pub fn set_bias(mut self, input: std::option::Option<crate::model::Bias>) -> Self {
            self.bias = input;
            self
        }
        /// <p>Metrics that help explain a model.</p>
        pub fn explainability(mut self, input: crate::model::Explainability) -> Self {
            self.explainability = Some(input);
            self
        }
        /// <p>Metrics that help explain a model.</p>
        pub fn set_explainability(
            mut self,
            input: std::option::Option<crate::model::Explainability>,
        ) -> Self {
            self.explainability = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelMetrics`](crate::model::ModelMetrics).
        pub fn build(self) -> crate::model::ModelMetrics {
            crate::model::ModelMetrics {
                model_quality: self.model_quality,
                model_data_quality: self.model_data_quality,
                bias: self.bias,
                explainability: self.explainability,
            }
        }
    }
}
impl ModelMetrics {
    /// Creates a new builder-style object to manufacture [`ModelMetrics`](crate::model::ModelMetrics).
    pub fn builder() -> crate::model::model_metrics::Builder {
        crate::model::model_metrics::Builder::default()
    }
}

/// <p>Contains explainability metrics for a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Explainability {
    /// <p>The explainability report for a model.</p>
    #[doc(hidden)]
    pub report: std::option::Option<crate::model::MetricsSource>,
}
impl Explainability {
    /// <p>The explainability report for a model.</p>
    pub fn report(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.report.as_ref()
    }
}
/// See [`Explainability`](crate::model::Explainability).
pub mod explainability {

    /// A builder for [`Explainability`](crate::model::Explainability).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) report: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>The explainability report for a model.</p>
        pub fn report(mut self, input: crate::model::MetricsSource) -> Self {
            self.report = Some(input);
            self
        }
        /// <p>The explainability report for a model.</p>
        pub fn set_report(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.report = input;
            self
        }
        /// Consumes the builder and constructs a [`Explainability`](crate::model::Explainability).
        pub fn build(self) -> crate::model::Explainability {
            crate::model::Explainability {
                report: self.report,
            }
        }
    }
}
impl Explainability {
    /// Creates a new builder-style object to manufacture [`Explainability`](crate::model::Explainability).
    pub fn builder() -> crate::model::explainability::Builder {
        crate::model::explainability::Builder::default()
    }
}

/// <p>Contains bias metrics for a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Bias {
    /// <p>The bias report for a model</p>
    #[doc(hidden)]
    pub report: std::option::Option<crate::model::MetricsSource>,
    /// <p>The pre-training bias report for a model.</p>
    #[doc(hidden)]
    pub pre_training_report: std::option::Option<crate::model::MetricsSource>,
    /// <p>The post-training bias report for a model.</p>
    #[doc(hidden)]
    pub post_training_report: std::option::Option<crate::model::MetricsSource>,
}
impl Bias {
    /// <p>The bias report for a model</p>
    pub fn report(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.report.as_ref()
    }
    /// <p>The pre-training bias report for a model.</p>
    pub fn pre_training_report(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.pre_training_report.as_ref()
    }
    /// <p>The post-training bias report for a model.</p>
    pub fn post_training_report(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.post_training_report.as_ref()
    }
}
/// See [`Bias`](crate::model::Bias).
pub mod bias {

    /// A builder for [`Bias`](crate::model::Bias).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) report: std::option::Option<crate::model::MetricsSource>,
        pub(crate) pre_training_report: std::option::Option<crate::model::MetricsSource>,
        pub(crate) post_training_report: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>The bias report for a model</p>
        pub fn report(mut self, input: crate::model::MetricsSource) -> Self {
            self.report = Some(input);
            self
        }
        /// <p>The bias report for a model</p>
        pub fn set_report(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.report = input;
            self
        }
        /// <p>The pre-training bias report for a model.</p>
        pub fn pre_training_report(mut self, input: crate::model::MetricsSource) -> Self {
            self.pre_training_report = Some(input);
            self
        }
        /// <p>The pre-training bias report for a model.</p>
        pub fn set_pre_training_report(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.pre_training_report = input;
            self
        }
        /// <p>The post-training bias report for a model.</p>
        pub fn post_training_report(mut self, input: crate::model::MetricsSource) -> Self {
            self.post_training_report = Some(input);
            self
        }
        /// <p>The post-training bias report for a model.</p>
        pub fn set_post_training_report(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.post_training_report = input;
            self
        }
        /// Consumes the builder and constructs a [`Bias`](crate::model::Bias).
        pub fn build(self) -> crate::model::Bias {
            crate::model::Bias {
                report: self.report,
                pre_training_report: self.pre_training_report,
                post_training_report: self.post_training_report,
            }
        }
    }
}
impl Bias {
    /// Creates a new builder-style object to manufacture [`Bias`](crate::model::Bias).
    pub fn builder() -> crate::model::bias::Builder {
        crate::model::bias::Builder::default()
    }
}

/// <p>Data quality constraints and statistics for a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDataQuality {
    /// <p>Data quality statistics for a model.</p>
    #[doc(hidden)]
    pub statistics: std::option::Option<crate::model::MetricsSource>,
    /// <p>Data quality constraints for a model.</p>
    #[doc(hidden)]
    pub constraints: std::option::Option<crate::model::MetricsSource>,
}
impl ModelDataQuality {
    /// <p>Data quality statistics for a model.</p>
    pub fn statistics(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.statistics.as_ref()
    }
    /// <p>Data quality constraints for a model.</p>
    pub fn constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.constraints.as_ref()
    }
}
/// See [`ModelDataQuality`](crate::model::ModelDataQuality).
pub mod model_data_quality {

    /// A builder for [`ModelDataQuality`](crate::model::ModelDataQuality).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) statistics: std::option::Option<crate::model::MetricsSource>,
        pub(crate) constraints: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>Data quality statistics for a model.</p>
        pub fn statistics(mut self, input: crate::model::MetricsSource) -> Self {
            self.statistics = Some(input);
            self
        }
        /// <p>Data quality statistics for a model.</p>
        pub fn set_statistics(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.statistics = input;
            self
        }
        /// <p>Data quality constraints for a model.</p>
        pub fn constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.constraints = Some(input);
            self
        }
        /// <p>Data quality constraints for a model.</p>
        pub fn set_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.constraints = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDataQuality`](crate::model::ModelDataQuality).
        pub fn build(self) -> crate::model::ModelDataQuality {
            crate::model::ModelDataQuality {
                statistics: self.statistics,
                constraints: self.constraints,
            }
        }
    }
}
impl ModelDataQuality {
    /// Creates a new builder-style object to manufacture [`ModelDataQuality`](crate::model::ModelDataQuality).
    pub fn builder() -> crate::model::model_data_quality::Builder {
        crate::model::model_data_quality::Builder::default()
    }
}

/// <p>Model quality statistics and constraints.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelQuality {
    /// <p>Model quality statistics.</p>
    #[doc(hidden)]
    pub statistics: std::option::Option<crate::model::MetricsSource>,
    /// <p>Model quality constraints.</p>
    #[doc(hidden)]
    pub constraints: std::option::Option<crate::model::MetricsSource>,
}
impl ModelQuality {
    /// <p>Model quality statistics.</p>
    pub fn statistics(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.statistics.as_ref()
    }
    /// <p>Model quality constraints.</p>
    pub fn constraints(&self) -> std::option::Option<&crate::model::MetricsSource> {
        self.constraints.as_ref()
    }
}
/// See [`ModelQuality`](crate::model::ModelQuality).
pub mod model_quality {

    /// A builder for [`ModelQuality`](crate::model::ModelQuality).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) statistics: std::option::Option<crate::model::MetricsSource>,
        pub(crate) constraints: std::option::Option<crate::model::MetricsSource>,
    }
    impl Builder {
        /// <p>Model quality statistics.</p>
        pub fn statistics(mut self, input: crate::model::MetricsSource) -> Self {
            self.statistics = Some(input);
            self
        }
        /// <p>Model quality statistics.</p>
        pub fn set_statistics(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.statistics = input;
            self
        }
        /// <p>Model quality constraints.</p>
        pub fn constraints(mut self, input: crate::model::MetricsSource) -> Self {
            self.constraints = Some(input);
            self
        }
        /// <p>Model quality constraints.</p>
        pub fn set_constraints(
            mut self,
            input: std::option::Option<crate::model::MetricsSource>,
        ) -> Self {
            self.constraints = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelQuality`](crate::model::ModelQuality).
        pub fn build(self) -> crate::model::ModelQuality {
            crate::model::ModelQuality {
                statistics: self.statistics,
                constraints: self.constraints,
            }
        }
    }
}
impl ModelQuality {
    /// Creates a new builder-style object to manufacture [`ModelQuality`](crate::model::ModelQuality).
    pub fn builder() -> crate::model::model_quality::Builder {
        crate::model::model_quality::Builder::default()
    }
}

/// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MetadataProperties {
    /// <p>The commit ID.</p>
    #[doc(hidden)]
    pub commit_id: std::option::Option<std::string::String>,
    /// <p>The repository.</p>
    #[doc(hidden)]
    pub repository: std::option::Option<std::string::String>,
    /// <p>The entity this entity was generated by.</p>
    #[doc(hidden)]
    pub generated_by: std::option::Option<std::string::String>,
    /// <p>The project ID.</p>
    #[doc(hidden)]
    pub project_id: std::option::Option<std::string::String>,
}
impl MetadataProperties {
    /// <p>The commit ID.</p>
    pub fn commit_id(&self) -> std::option::Option<&str> {
        self.commit_id.as_deref()
    }
    /// <p>The repository.</p>
    pub fn repository(&self) -> std::option::Option<&str> {
        self.repository.as_deref()
    }
    /// <p>The entity this entity was generated by.</p>
    pub fn generated_by(&self) -> std::option::Option<&str> {
        self.generated_by.as_deref()
    }
    /// <p>The project ID.</p>
    pub fn project_id(&self) -> std::option::Option<&str> {
        self.project_id.as_deref()
    }
}
/// See [`MetadataProperties`](crate::model::MetadataProperties).
pub mod metadata_properties {

    /// A builder for [`MetadataProperties`](crate::model::MetadataProperties).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) commit_id: std::option::Option<std::string::String>,
        pub(crate) repository: std::option::Option<std::string::String>,
        pub(crate) generated_by: std::option::Option<std::string::String>,
        pub(crate) project_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The commit ID.</p>
        pub fn commit_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.commit_id = Some(input.into());
            self
        }
        /// <p>The commit ID.</p>
        pub fn set_commit_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.commit_id = input;
            self
        }
        /// <p>The repository.</p>
        pub fn repository(mut self, input: impl Into<std::string::String>) -> Self {
            self.repository = Some(input.into());
            self
        }
        /// <p>The repository.</p>
        pub fn set_repository(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.repository = input;
            self
        }
        /// <p>The entity this entity was generated by.</p>
        pub fn generated_by(mut self, input: impl Into<std::string::String>) -> Self {
            self.generated_by = Some(input.into());
            self
        }
        /// <p>The entity this entity was generated by.</p>
        pub fn set_generated_by(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.generated_by = input;
            self
        }
        /// <p>The project ID.</p>
        pub fn project_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_id = Some(input.into());
            self
        }
        /// <p>The project ID.</p>
        pub fn set_project_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_id = input;
            self
        }
        /// Consumes the builder and constructs a [`MetadataProperties`](crate::model::MetadataProperties).
        pub fn build(self) -> crate::model::MetadataProperties {
            crate::model::MetadataProperties {
                commit_id: self.commit_id,
                repository: self.repository,
                generated_by: self.generated_by,
                project_id: self.project_id,
            }
        }
    }
}
impl MetadataProperties {
    /// Creates a new builder-style object to manufacture [`MetadataProperties`](crate::model::MetadataProperties).
    pub fn builder() -> crate::model::metadata_properties::Builder {
        crate::model::metadata_properties::Builder::default()
    }
}

/// <p>Specifies the validation and image scan statuses of the model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageStatusDetails {
    /// <p>The validation status of the model package.</p>
    #[doc(hidden)]
    pub validation_statuses:
        std::option::Option<std::vec::Vec<crate::model::ModelPackageStatusItem>>,
    /// <p>The status of the scan of the Docker image container for the model package.</p>
    #[doc(hidden)]
    pub image_scan_statuses:
        std::option::Option<std::vec::Vec<crate::model::ModelPackageStatusItem>>,
}
impl ModelPackageStatusDetails {
    /// <p>The validation status of the model package.</p>
    pub fn validation_statuses(
        &self,
    ) -> std::option::Option<&[crate::model::ModelPackageStatusItem]> {
        self.validation_statuses.as_deref()
    }
    /// <p>The status of the scan of the Docker image container for the model package.</p>
    pub fn image_scan_statuses(
        &self,
    ) -> std::option::Option<&[crate::model::ModelPackageStatusItem]> {
        self.image_scan_statuses.as_deref()
    }
}
/// See [`ModelPackageStatusDetails`](crate::model::ModelPackageStatusDetails).
pub mod model_package_status_details {

    /// A builder for [`ModelPackageStatusDetails`](crate::model::ModelPackageStatusDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) validation_statuses:
            std::option::Option<std::vec::Vec<crate::model::ModelPackageStatusItem>>,
        pub(crate) image_scan_statuses:
            std::option::Option<std::vec::Vec<crate::model::ModelPackageStatusItem>>,
    }
    impl Builder {
        /// Appends an item to `validation_statuses`.
        ///
        /// To override the contents of this collection use [`set_validation_statuses`](Self::set_validation_statuses).
        ///
        /// <p>The validation status of the model package.</p>
        pub fn validation_statuses(mut self, input: crate::model::ModelPackageStatusItem) -> Self {
            let mut v = self.validation_statuses.unwrap_or_default();
            v.push(input);
            self.validation_statuses = Some(v);
            self
        }
        /// <p>The validation status of the model package.</p>
        pub fn set_validation_statuses(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ModelPackageStatusItem>>,
        ) -> Self {
            self.validation_statuses = input;
            self
        }
        /// Appends an item to `image_scan_statuses`.
        ///
        /// To override the contents of this collection use [`set_image_scan_statuses`](Self::set_image_scan_statuses).
        ///
        /// <p>The status of the scan of the Docker image container for the model package.</p>
        pub fn image_scan_statuses(mut self, input: crate::model::ModelPackageStatusItem) -> Self {
            let mut v = self.image_scan_statuses.unwrap_or_default();
            v.push(input);
            self.image_scan_statuses = Some(v);
            self
        }
        /// <p>The status of the scan of the Docker image container for the model package.</p>
        pub fn set_image_scan_statuses(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ModelPackageStatusItem>>,
        ) -> Self {
            self.image_scan_statuses = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageStatusDetails`](crate::model::ModelPackageStatusDetails).
        pub fn build(self) -> crate::model::ModelPackageStatusDetails {
            crate::model::ModelPackageStatusDetails {
                validation_statuses: self.validation_statuses,
                image_scan_statuses: self.image_scan_statuses,
            }
        }
    }
}
impl ModelPackageStatusDetails {
    /// Creates a new builder-style object to manufacture [`ModelPackageStatusDetails`](crate::model::ModelPackageStatusDetails).
    pub fn builder() -> crate::model::model_package_status_details::Builder {
        crate::model::model_package_status_details::Builder::default()
    }
}

/// <p>Represents the overall status of a model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageStatusItem {
    /// <p>The name of the model package for which the overall status is being reported.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The current status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::DetailedModelPackageStatus>,
    /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl ModelPackageStatusItem {
    /// <p>The name of the model package for which the overall status is being reported.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The current status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::DetailedModelPackageStatus> {
        self.status.as_ref()
    }
    /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`ModelPackageStatusItem`](crate::model::ModelPackageStatusItem).
pub mod model_package_status_item {

    /// A builder for [`ModelPackageStatusItem`](crate::model::ModelPackageStatusItem).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::DetailedModelPackageStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the model package for which the overall status is being reported.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the model package for which the overall status is being reported.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The current status.</p>
        pub fn status(mut self, input: crate::model::DetailedModelPackageStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The current status.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::DetailedModelPackageStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageStatusItem`](crate::model::ModelPackageStatusItem).
        pub fn build(self) -> crate::model::ModelPackageStatusItem {
            crate::model::ModelPackageStatusItem {
                name: self.name,
                status: self.status,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl ModelPackageStatusItem {
    /// Creates a new builder-style object to manufacture [`ModelPackageStatusItem`](crate::model::ModelPackageStatusItem).
    pub fn builder() -> crate::model::model_package_status_item::Builder {
        crate::model::model_package_status_item::Builder::default()
    }
}

/// When writing a match expression against `DetailedModelPackageStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let detailedmodelpackagestatus = unimplemented!();
/// match detailedmodelpackagestatus {
///     DetailedModelPackageStatus::Completed => { /* ... */ },
///     DetailedModelPackageStatus::Failed => { /* ... */ },
///     DetailedModelPackageStatus::InProgress => { /* ... */ },
///     DetailedModelPackageStatus::NotStarted => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `detailedmodelpackagestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DetailedModelPackageStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DetailedModelPackageStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DetailedModelPackageStatus::NewFeature` is defined.
/// Specifically, when `detailedmodelpackagestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DetailedModelPackageStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DetailedModelPackageStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    NotStarted,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DetailedModelPackageStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => DetailedModelPackageStatus::Completed,
            "Failed" => DetailedModelPackageStatus::Failed,
            "InProgress" => DetailedModelPackageStatus::InProgress,
            "NotStarted" => DetailedModelPackageStatus::NotStarted,
            other => DetailedModelPackageStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for DetailedModelPackageStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DetailedModelPackageStatus::from(s))
    }
}
impl DetailedModelPackageStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DetailedModelPackageStatus::Completed => "Completed",
            DetailedModelPackageStatus::Failed => "Failed",
            DetailedModelPackageStatus::InProgress => "InProgress",
            DetailedModelPackageStatus::NotStarted => "NotStarted",
            DetailedModelPackageStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "NotStarted"]
    }
}
impl AsRef<str> for DetailedModelPackageStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelPackageStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelpackagestatus = unimplemented!();
/// match modelpackagestatus {
///     ModelPackageStatus::Completed => { /* ... */ },
///     ModelPackageStatus::Deleting => { /* ... */ },
///     ModelPackageStatus::Failed => { /* ... */ },
///     ModelPackageStatus::InProgress => { /* ... */ },
///     ModelPackageStatus::Pending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelpackagestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelPackageStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelPackageStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelPackageStatus::NewFeature` is defined.
/// Specifically, when `modelpackagestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelPackageStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelPackageStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelPackageStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => ModelPackageStatus::Completed,
            "Deleting" => ModelPackageStatus::Deleting,
            "Failed" => ModelPackageStatus::Failed,
            "InProgress" => ModelPackageStatus::InProgress,
            "Pending" => ModelPackageStatus::Pending,
            other => {
                ModelPackageStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelPackageStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelPackageStatus::from(s))
    }
}
impl ModelPackageStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelPackageStatus::Completed => "Completed",
            ModelPackageStatus::Deleting => "Deleting",
            ModelPackageStatus::Failed => "Failed",
            ModelPackageStatus::InProgress => "InProgress",
            ModelPackageStatus::Pending => "Pending",
            ModelPackageStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Deleting", "Failed", "InProgress", "Pending"]
    }
}
impl AsRef<str> for ModelPackageStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies batch transform jobs that SageMaker runs to validate your model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageValidationSpecification {
    /// <p>The IAM roles to be used for the validation of the model package.</p>
    #[doc(hidden)]
    pub validation_role: std::option::Option<std::string::String>,
    /// <p>An array of <code>ModelPackageValidationProfile</code> objects, each of which specifies a batch transform job that SageMaker runs to validate your model package.</p>
    #[doc(hidden)]
    pub validation_profiles:
        std::option::Option<std::vec::Vec<crate::model::ModelPackageValidationProfile>>,
}
impl ModelPackageValidationSpecification {
    /// <p>The IAM roles to be used for the validation of the model package.</p>
    pub fn validation_role(&self) -> std::option::Option<&str> {
        self.validation_role.as_deref()
    }
    /// <p>An array of <code>ModelPackageValidationProfile</code> objects, each of which specifies a batch transform job that SageMaker runs to validate your model package.</p>
    pub fn validation_profiles(
        &self,
    ) -> std::option::Option<&[crate::model::ModelPackageValidationProfile]> {
        self.validation_profiles.as_deref()
    }
}
/// See [`ModelPackageValidationSpecification`](crate::model::ModelPackageValidationSpecification).
pub mod model_package_validation_specification {

    /// A builder for [`ModelPackageValidationSpecification`](crate::model::ModelPackageValidationSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) validation_role: std::option::Option<std::string::String>,
        pub(crate) validation_profiles:
            std::option::Option<std::vec::Vec<crate::model::ModelPackageValidationProfile>>,
    }
    impl Builder {
        /// <p>The IAM roles to be used for the validation of the model package.</p>
        pub fn validation_role(mut self, input: impl Into<std::string::String>) -> Self {
            self.validation_role = Some(input.into());
            self
        }
        /// <p>The IAM roles to be used for the validation of the model package.</p>
        pub fn set_validation_role(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.validation_role = input;
            self
        }
        /// Appends an item to `validation_profiles`.
        ///
        /// To override the contents of this collection use [`set_validation_profiles`](Self::set_validation_profiles).
        ///
        /// <p>An array of <code>ModelPackageValidationProfile</code> objects, each of which specifies a batch transform job that SageMaker runs to validate your model package.</p>
        pub fn validation_profiles(
            mut self,
            input: crate::model::ModelPackageValidationProfile,
        ) -> Self {
            let mut v = self.validation_profiles.unwrap_or_default();
            v.push(input);
            self.validation_profiles = Some(v);
            self
        }
        /// <p>An array of <code>ModelPackageValidationProfile</code> objects, each of which specifies a batch transform job that SageMaker runs to validate your model package.</p>
        pub fn set_validation_profiles(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ModelPackageValidationProfile>>,
        ) -> Self {
            self.validation_profiles = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageValidationSpecification`](crate::model::ModelPackageValidationSpecification).
        pub fn build(self) -> crate::model::ModelPackageValidationSpecification {
            crate::model::ModelPackageValidationSpecification {
                validation_role: self.validation_role,
                validation_profiles: self.validation_profiles,
            }
        }
    }
}
impl ModelPackageValidationSpecification {
    /// Creates a new builder-style object to manufacture [`ModelPackageValidationSpecification`](crate::model::ModelPackageValidationSpecification).
    pub fn builder() -> crate::model::model_package_validation_specification::Builder {
        crate::model::model_package_validation_specification::Builder::default()
    }
}

/// <p>Contains data, such as the inputs and targeted instance types that are used in the process of validating the model package.</p>
/// <p>The data provided in the validation profile is made available to your buyers on Amazon Web Services Marketplace.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageValidationProfile {
    /// <p>The name of the profile for the model package.</p>
    #[doc(hidden)]
    pub profile_name: std::option::Option<std::string::String>,
    /// <p>The <code>TransformJobDefinition</code> object that describes the transform job used for the validation of the model package.</p>
    #[doc(hidden)]
    pub transform_job_definition: std::option::Option<crate::model::TransformJobDefinition>,
}
impl ModelPackageValidationProfile {
    /// <p>The name of the profile for the model package.</p>
    pub fn profile_name(&self) -> std::option::Option<&str> {
        self.profile_name.as_deref()
    }
    /// <p>The <code>TransformJobDefinition</code> object that describes the transform job used for the validation of the model package.</p>
    pub fn transform_job_definition(
        &self,
    ) -> std::option::Option<&crate::model::TransformJobDefinition> {
        self.transform_job_definition.as_ref()
    }
}
/// See [`ModelPackageValidationProfile`](crate::model::ModelPackageValidationProfile).
pub mod model_package_validation_profile {

    /// A builder for [`ModelPackageValidationProfile`](crate::model::ModelPackageValidationProfile).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) profile_name: std::option::Option<std::string::String>,
        pub(crate) transform_job_definition:
            std::option::Option<crate::model::TransformJobDefinition>,
    }
    impl Builder {
        /// <p>The name of the profile for the model package.</p>
        pub fn profile_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.profile_name = Some(input.into());
            self
        }
        /// <p>The name of the profile for the model package.</p>
        pub fn set_profile_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.profile_name = input;
            self
        }
        /// <p>The <code>TransformJobDefinition</code> object that describes the transform job used for the validation of the model package.</p>
        pub fn transform_job_definition(
            mut self,
            input: crate::model::TransformJobDefinition,
        ) -> Self {
            self.transform_job_definition = Some(input);
            self
        }
        /// <p>The <code>TransformJobDefinition</code> object that describes the transform job used for the validation of the model package.</p>
        pub fn set_transform_job_definition(
            mut self,
            input: std::option::Option<crate::model::TransformJobDefinition>,
        ) -> Self {
            self.transform_job_definition = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageValidationProfile`](crate::model::ModelPackageValidationProfile).
        pub fn build(self) -> crate::model::ModelPackageValidationProfile {
            crate::model::ModelPackageValidationProfile {
                profile_name: self.profile_name,
                transform_job_definition: self.transform_job_definition,
            }
        }
    }
}
impl ModelPackageValidationProfile {
    /// Creates a new builder-style object to manufacture [`ModelPackageValidationProfile`](crate::model::ModelPackageValidationProfile).
    pub fn builder() -> crate::model::model_package_validation_profile::Builder {
        crate::model::model_package_validation_profile::Builder::default()
    }
}

/// <p>Defines the input needed to run a transform job using the inference specification specified in the algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformJobDefinition {
    /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. The default value is 1.</p>
    #[doc(hidden)]
    pub max_concurrent_transforms: std::option::Option<i32>,
    /// <p>The maximum payload size allowed, in MB. A payload is the data portion of a record (without metadata).</p>
    #[doc(hidden)]
    pub max_payload_in_mb: std::option::Option<i32>,
    /// <p>A string that determines the number of records included in a single mini-batch.</p>
    /// <p> <code>SingleRecord</code> means only one record is used per mini-batch. <code>MultiRecord</code> means a mini-batch is set to contain as many records that can fit within the <code>MaxPayloadInMB</code> limit.</p>
    #[doc(hidden)]
    pub batch_strategy: std::option::Option<crate::model::BatchStrategy>,
    /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>A description of the input source and the way the transform job consumes it.</p>
    #[doc(hidden)]
    pub transform_input: std::option::Option<crate::model::TransformInput>,
    /// <p>Identifies the Amazon S3 location where you want Amazon SageMaker to save the results from the transform job.</p>
    #[doc(hidden)]
    pub transform_output: std::option::Option<crate::model::TransformOutput>,
    /// <p>Identifies the ML compute instances for the transform job.</p>
    #[doc(hidden)]
    pub transform_resources: std::option::Option<crate::model::TransformResources>,
}
impl TransformJobDefinition {
    /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. The default value is 1.</p>
    pub fn max_concurrent_transforms(&self) -> std::option::Option<i32> {
        self.max_concurrent_transforms
    }
    /// <p>The maximum payload size allowed, in MB. A payload is the data portion of a record (without metadata).</p>
    pub fn max_payload_in_mb(&self) -> std::option::Option<i32> {
        self.max_payload_in_mb
    }
    /// <p>A string that determines the number of records included in a single mini-batch.</p>
    /// <p> <code>SingleRecord</code> means only one record is used per mini-batch. <code>MultiRecord</code> means a mini-batch is set to contain as many records that can fit within the <code>MaxPayloadInMB</code> limit.</p>
    pub fn batch_strategy(&self) -> std::option::Option<&crate::model::BatchStrategy> {
        self.batch_strategy.as_ref()
    }
    /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>A description of the input source and the way the transform job consumes it.</p>
    pub fn transform_input(&self) -> std::option::Option<&crate::model::TransformInput> {
        self.transform_input.as_ref()
    }
    /// <p>Identifies the Amazon S3 location where you want Amazon SageMaker to save the results from the transform job.</p>
    pub fn transform_output(&self) -> std::option::Option<&crate::model::TransformOutput> {
        self.transform_output.as_ref()
    }
    /// <p>Identifies the ML compute instances for the transform job.</p>
    pub fn transform_resources(&self) -> std::option::Option<&crate::model::TransformResources> {
        self.transform_resources.as_ref()
    }
}
/// See [`TransformJobDefinition`](crate::model::TransformJobDefinition).
pub mod transform_job_definition {

    /// A builder for [`TransformJobDefinition`](crate::model::TransformJobDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_concurrent_transforms: std::option::Option<i32>,
        pub(crate) max_payload_in_mb: std::option::Option<i32>,
        pub(crate) batch_strategy: std::option::Option<crate::model::BatchStrategy>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) transform_input: std::option::Option<crate::model::TransformInput>,
        pub(crate) transform_output: std::option::Option<crate::model::TransformOutput>,
        pub(crate) transform_resources: std::option::Option<crate::model::TransformResources>,
    }
    impl Builder {
        /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. The default value is 1.</p>
        pub fn max_concurrent_transforms(mut self, input: i32) -> Self {
            self.max_concurrent_transforms = Some(input);
            self
        }
        /// <p>The maximum number of parallel requests that can be sent to each instance in a transform job. The default value is 1.</p>
        pub fn set_max_concurrent_transforms(mut self, input: std::option::Option<i32>) -> Self {
            self.max_concurrent_transforms = input;
            self
        }
        /// <p>The maximum payload size allowed, in MB. A payload is the data portion of a record (without metadata).</p>
        pub fn max_payload_in_mb(mut self, input: i32) -> Self {
            self.max_payload_in_mb = Some(input);
            self
        }
        /// <p>The maximum payload size allowed, in MB. A payload is the data portion of a record (without metadata).</p>
        pub fn set_max_payload_in_mb(mut self, input: std::option::Option<i32>) -> Self {
            self.max_payload_in_mb = input;
            self
        }
        /// <p>A string that determines the number of records included in a single mini-batch.</p>
        /// <p> <code>SingleRecord</code> means only one record is used per mini-batch. <code>MultiRecord</code> means a mini-batch is set to contain as many records that can fit within the <code>MaxPayloadInMB</code> limit.</p>
        pub fn batch_strategy(mut self, input: crate::model::BatchStrategy) -> Self {
            self.batch_strategy = Some(input);
            self
        }
        /// <p>A string that determines the number of records included in a single mini-batch.</p>
        /// <p> <code>SingleRecord</code> means only one record is used per mini-batch. <code>MultiRecord</code> means a mini-batch is set to contain as many records that can fit within the <code>MaxPayloadInMB</code> limit.</p>
        pub fn set_batch_strategy(
            mut self,
            input: std::option::Option<crate::model::BatchStrategy>,
        ) -> Self {
            self.batch_strategy = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>A description of the input source and the way the transform job consumes it.</p>
        pub fn transform_input(mut self, input: crate::model::TransformInput) -> Self {
            self.transform_input = Some(input);
            self
        }
        /// <p>A description of the input source and the way the transform job consumes it.</p>
        pub fn set_transform_input(
            mut self,
            input: std::option::Option<crate::model::TransformInput>,
        ) -> Self {
            self.transform_input = input;
            self
        }
        /// <p>Identifies the Amazon S3 location where you want Amazon SageMaker to save the results from the transform job.</p>
        pub fn transform_output(mut self, input: crate::model::TransformOutput) -> Self {
            self.transform_output = Some(input);
            self
        }
        /// <p>Identifies the Amazon S3 location where you want Amazon SageMaker to save the results from the transform job.</p>
        pub fn set_transform_output(
            mut self,
            input: std::option::Option<crate::model::TransformOutput>,
        ) -> Self {
            self.transform_output = input;
            self
        }
        /// <p>Identifies the ML compute instances for the transform job.</p>
        pub fn transform_resources(mut self, input: crate::model::TransformResources) -> Self {
            self.transform_resources = Some(input);
            self
        }
        /// <p>Identifies the ML compute instances for the transform job.</p>
        pub fn set_transform_resources(
            mut self,
            input: std::option::Option<crate::model::TransformResources>,
        ) -> Self {
            self.transform_resources = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformJobDefinition`](crate::model::TransformJobDefinition).
        pub fn build(self) -> crate::model::TransformJobDefinition {
            crate::model::TransformJobDefinition {
                max_concurrent_transforms: self.max_concurrent_transforms,
                max_payload_in_mb: self.max_payload_in_mb,
                batch_strategy: self.batch_strategy,
                environment: self.environment,
                transform_input: self.transform_input,
                transform_output: self.transform_output,
                transform_resources: self.transform_resources,
            }
        }
    }
}
impl TransformJobDefinition {
    /// Creates a new builder-style object to manufacture [`TransformJobDefinition`](crate::model::TransformJobDefinition).
    pub fn builder() -> crate::model::transform_job_definition::Builder {
        crate::model::transform_job_definition::Builder::default()
    }
}

/// <p>A list of algorithms that were used to create a model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SourceAlgorithmSpecification {
    /// <p>A list of the algorithms that were used to create a model package.</p>
    #[doc(hidden)]
    pub source_algorithms: std::option::Option<std::vec::Vec<crate::model::SourceAlgorithm>>,
}
impl SourceAlgorithmSpecification {
    /// <p>A list of the algorithms that were used to create a model package.</p>
    pub fn source_algorithms(&self) -> std::option::Option<&[crate::model::SourceAlgorithm]> {
        self.source_algorithms.as_deref()
    }
}
/// See [`SourceAlgorithmSpecification`](crate::model::SourceAlgorithmSpecification).
pub mod source_algorithm_specification {

    /// A builder for [`SourceAlgorithmSpecification`](crate::model::SourceAlgorithmSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_algorithms:
            std::option::Option<std::vec::Vec<crate::model::SourceAlgorithm>>,
    }
    impl Builder {
        /// Appends an item to `source_algorithms`.
        ///
        /// To override the contents of this collection use [`set_source_algorithms`](Self::set_source_algorithms).
        ///
        /// <p>A list of the algorithms that were used to create a model package.</p>
        pub fn source_algorithms(mut self, input: crate::model::SourceAlgorithm) -> Self {
            let mut v = self.source_algorithms.unwrap_or_default();
            v.push(input);
            self.source_algorithms = Some(v);
            self
        }
        /// <p>A list of the algorithms that were used to create a model package.</p>
        pub fn set_source_algorithms(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::SourceAlgorithm>>,
        ) -> Self {
            self.source_algorithms = input;
            self
        }
        /// Consumes the builder and constructs a [`SourceAlgorithmSpecification`](crate::model::SourceAlgorithmSpecification).
        pub fn build(self) -> crate::model::SourceAlgorithmSpecification {
            crate::model::SourceAlgorithmSpecification {
                source_algorithms: self.source_algorithms,
            }
        }
    }
}
impl SourceAlgorithmSpecification {
    /// Creates a new builder-style object to manufacture [`SourceAlgorithmSpecification`](crate::model::SourceAlgorithmSpecification).
    pub fn builder() -> crate::model::source_algorithm_specification::Builder {
        crate::model::source_algorithm_specification::Builder::default()
    }
}

/// <p>Specifies an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in Amazon Web Services Marketplace that you are subscribed to.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SourceAlgorithm {
    /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
    /// <p>The model artifacts must be in an S3 bucket that is in the same region as the algorithm.</p>
    /// </note>
    #[doc(hidden)]
    pub model_data_url: std::option::Option<std::string::String>,
    /// <p>The name of an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in Amazon Web Services Marketplace that you are subscribed to.</p>
    #[doc(hidden)]
    pub algorithm_name: std::option::Option<std::string::String>,
}
impl SourceAlgorithm {
    /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
    /// <p>The model artifacts must be in an S3 bucket that is in the same region as the algorithm.</p>
    /// </note>
    pub fn model_data_url(&self) -> std::option::Option<&str> {
        self.model_data_url.as_deref()
    }
    /// <p>The name of an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in Amazon Web Services Marketplace that you are subscribed to.</p>
    pub fn algorithm_name(&self) -> std::option::Option<&str> {
        self.algorithm_name.as_deref()
    }
}
/// See [`SourceAlgorithm`](crate::model::SourceAlgorithm).
pub mod source_algorithm {

    /// A builder for [`SourceAlgorithm`](crate::model::SourceAlgorithm).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_data_url: std::option::Option<std::string::String>,
        pub(crate) algorithm_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
        /// <p>The model artifacts must be in an S3 bucket that is in the same region as the algorithm.</p>
        /// </note>
        pub fn model_data_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_data_url = Some(input.into());
            self
        }
        /// <p>The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single <code>gzip</code> compressed tar archive (<code>.tar.gz</code> suffix).</p> <note>
        /// <p>The model artifacts must be in an S3 bucket that is in the same region as the algorithm.</p>
        /// </note>
        pub fn set_model_data_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_data_url = input;
            self
        }
        /// <p>The name of an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in Amazon Web Services Marketplace that you are subscribed to.</p>
        pub fn algorithm_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.algorithm_name = Some(input.into());
            self
        }
        /// <p>The name of an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in Amazon Web Services Marketplace that you are subscribed to.</p>
        pub fn set_algorithm_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.algorithm_name = input;
            self
        }
        /// Consumes the builder and constructs a [`SourceAlgorithm`](crate::model::SourceAlgorithm).
        pub fn build(self) -> crate::model::SourceAlgorithm {
            crate::model::SourceAlgorithm {
                model_data_url: self.model_data_url,
                algorithm_name: self.algorithm_name,
            }
        }
    }
}
impl SourceAlgorithm {
    /// Creates a new builder-style object to manufacture [`SourceAlgorithm`](crate::model::SourceAlgorithm).
    pub fn builder() -> crate::model::source_algorithm::Builder {
        crate::model::source_algorithm::Builder::default()
    }
}

/// <p>Defines how to perform inference generation after a training job is run.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceSpecification {
    /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
    #[doc(hidden)]
    pub containers:
        std::option::Option<std::vec::Vec<crate::model::ModelPackageContainerDefinition>>,
    /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
    /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
    #[doc(hidden)]
    pub supported_transform_instance_types:
        std::option::Option<std::vec::Vec<crate::model::TransformInstanceType>>,
    /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
    /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
    #[doc(hidden)]
    pub supported_realtime_inference_instance_types:
        std::option::Option<std::vec::Vec<crate::model::ProductionVariantInstanceType>>,
    /// <p>The supported MIME types for the input data.</p>
    #[doc(hidden)]
    pub supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The supported MIME types for the output data.</p>
    #[doc(hidden)]
    pub supported_response_mime_types: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl InferenceSpecification {
    /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
    pub fn containers(
        &self,
    ) -> std::option::Option<&[crate::model::ModelPackageContainerDefinition]> {
        self.containers.as_deref()
    }
    /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
    /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
    pub fn supported_transform_instance_types(
        &self,
    ) -> std::option::Option<&[crate::model::TransformInstanceType]> {
        self.supported_transform_instance_types.as_deref()
    }
    /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
    /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
    pub fn supported_realtime_inference_instance_types(
        &self,
    ) -> std::option::Option<&[crate::model::ProductionVariantInstanceType]> {
        self.supported_realtime_inference_instance_types.as_deref()
    }
    /// <p>The supported MIME types for the input data.</p>
    pub fn supported_content_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_content_types.as_deref()
    }
    /// <p>The supported MIME types for the output data.</p>
    pub fn supported_response_mime_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_response_mime_types.as_deref()
    }
}
/// See [`InferenceSpecification`](crate::model::InferenceSpecification).
pub mod inference_specification {

    /// A builder for [`InferenceSpecification`](crate::model::InferenceSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) containers:
            std::option::Option<std::vec::Vec<crate::model::ModelPackageContainerDefinition>>,
        pub(crate) supported_transform_instance_types:
            std::option::Option<std::vec::Vec<crate::model::TransformInstanceType>>,
        pub(crate) supported_realtime_inference_instance_types:
            std::option::Option<std::vec::Vec<crate::model::ProductionVariantInstanceType>>,
        pub(crate) supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) supported_response_mime_types:
            std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `containers`.
        ///
        /// To override the contents of this collection use [`set_containers`](Self::set_containers).
        ///
        /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
        pub fn containers(mut self, input: crate::model::ModelPackageContainerDefinition) -> Self {
            let mut v = self.containers.unwrap_or_default();
            v.push(input);
            self.containers = Some(v);
            self
        }
        /// <p>The Amazon ECR registry path of the Docker image that contains the inference code.</p>
        pub fn set_containers(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::ModelPackageContainerDefinition>,
            >,
        ) -> Self {
            self.containers = input;
            self
        }
        /// Appends an item to `supported_transform_instance_types`.
        ///
        /// To override the contents of this collection use [`set_supported_transform_instance_types`](Self::set_supported_transform_instance_types).
        ///
        /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
        /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
        pub fn supported_transform_instance_types(
            mut self,
            input: crate::model::TransformInstanceType,
        ) -> Self {
            let mut v = self.supported_transform_instance_types.unwrap_or_default();
            v.push(input);
            self.supported_transform_instance_types = Some(v);
            self
        }
        /// <p>A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.</p>
        /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
        pub fn set_supported_transform_instance_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::TransformInstanceType>>,
        ) -> Self {
            self.supported_transform_instance_types = input;
            self
        }
        /// Appends an item to `supported_realtime_inference_instance_types`.
        ///
        /// To override the contents of this collection use [`set_supported_realtime_inference_instance_types`](Self::set_supported_realtime_inference_instance_types).
        ///
        /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
        /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
        pub fn supported_realtime_inference_instance_types(
            mut self,
            input: crate::model::ProductionVariantInstanceType,
        ) -> Self {
            let mut v = self
                .supported_realtime_inference_instance_types
                .unwrap_or_default();
            v.push(input);
            self.supported_realtime_inference_instance_types = Some(v);
            self
        }
        /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
        /// <p>This parameter is required for unversioned models, and optional for versioned models.</p>
        pub fn set_supported_realtime_inference_instance_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProductionVariantInstanceType>>,
        ) -> Self {
            self.supported_realtime_inference_instance_types = input;
            self
        }
        /// Appends an item to `supported_content_types`.
        ///
        /// To override the contents of this collection use [`set_supported_content_types`](Self::set_supported_content_types).
        ///
        /// <p>The supported MIME types for the input data.</p>
        pub fn supported_content_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.supported_content_types.unwrap_or_default();
            v.push(input.into());
            self.supported_content_types = Some(v);
            self
        }
        /// <p>The supported MIME types for the input data.</p>
        pub fn set_supported_content_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_content_types = input;
            self
        }
        /// Appends an item to `supported_response_mime_types`.
        ///
        /// To override the contents of this collection use [`set_supported_response_mime_types`](Self::set_supported_response_mime_types).
        ///
        /// <p>The supported MIME types for the output data.</p>
        pub fn supported_response_mime_types(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            let mut v = self.supported_response_mime_types.unwrap_or_default();
            v.push(input.into());
            self.supported_response_mime_types = Some(v);
            self
        }
        /// <p>The supported MIME types for the output data.</p>
        pub fn set_supported_response_mime_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_response_mime_types = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceSpecification`](crate::model::InferenceSpecification).
        pub fn build(self) -> crate::model::InferenceSpecification {
            crate::model::InferenceSpecification {
                containers: self.containers,
                supported_transform_instance_types: self.supported_transform_instance_types,
                supported_realtime_inference_instance_types: self
                    .supported_realtime_inference_instance_types,
                supported_content_types: self.supported_content_types,
                supported_response_mime_types: self.supported_response_mime_types,
            }
        }
    }
}
impl InferenceSpecification {
    /// Creates a new builder-style object to manufacture [`InferenceSpecification`](crate::model::InferenceSpecification).
    pub fn builder() -> crate::model::inference_specification::Builder {
        crate::model::inference_specification::Builder::default()
    }
}

/// <p>A hosted endpoint for real-time inference.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Endpoint {
    /// <p>The name of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_arn: std::option::Option<std::string::String>,
    /// <p>The endpoint configuration associated with the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_config_name: std::option::Option<std::string::String>,
    /// <p>A list of the production variants hosted on the endpoint. Each production variant is a model.</p>
    #[doc(hidden)]
    pub production_variants:
        std::option::Option<std::vec::Vec<crate::model::ProductionVariantSummary>>,
    /// <p>The currently active data capture configuration used by your Endpoint.</p>
    #[doc(hidden)]
    pub data_capture_config: std::option::Option<crate::model::DataCaptureConfigSummary>,
    /// <p>The status of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_status: std::option::Option<crate::model::EndpointStatus>,
    /// <p>If the endpoint failed, the reason it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The time that the endpoint was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last time the endpoint was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A list of monitoring schedules for the endpoint. For information about model monitoring, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html">Amazon SageMaker Model Monitor</a>.</p>
    #[doc(hidden)]
    pub monitoring_schedules: std::option::Option<std::vec::Vec<crate::model::MonitoringSchedule>>,
    /// <p>A list of the tags associated with the endpoint. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>A list of the shadow variants hosted on the endpoint. Each shadow variant is a model in shadow mode with production traffic replicated from the production variant.</p>
    #[doc(hidden)]
    pub shadow_production_variants:
        std::option::Option<std::vec::Vec<crate::model::ProductionVariantSummary>>,
}
impl Endpoint {
    /// <p>The name of the endpoint.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
    pub fn endpoint_arn(&self) -> std::option::Option<&str> {
        self.endpoint_arn.as_deref()
    }
    /// <p>The endpoint configuration associated with the endpoint.</p>
    pub fn endpoint_config_name(&self) -> std::option::Option<&str> {
        self.endpoint_config_name.as_deref()
    }
    /// <p>A list of the production variants hosted on the endpoint. Each production variant is a model.</p>
    pub fn production_variants(
        &self,
    ) -> std::option::Option<&[crate::model::ProductionVariantSummary]> {
        self.production_variants.as_deref()
    }
    /// <p>The currently active data capture configuration used by your Endpoint.</p>
    pub fn data_capture_config(
        &self,
    ) -> std::option::Option<&crate::model::DataCaptureConfigSummary> {
        self.data_capture_config.as_ref()
    }
    /// <p>The status of the endpoint.</p>
    pub fn endpoint_status(&self) -> std::option::Option<&crate::model::EndpointStatus> {
        self.endpoint_status.as_ref()
    }
    /// <p>If the endpoint failed, the reason it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The time that the endpoint was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last time the endpoint was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>A list of monitoring schedules for the endpoint. For information about model monitoring, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html">Amazon SageMaker Model Monitor</a>.</p>
    pub fn monitoring_schedules(&self) -> std::option::Option<&[crate::model::MonitoringSchedule]> {
        self.monitoring_schedules.as_deref()
    }
    /// <p>A list of the tags associated with the endpoint. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>A list of the shadow variants hosted on the endpoint. Each shadow variant is a model in shadow mode with production traffic replicated from the production variant.</p>
    pub fn shadow_production_variants(
        &self,
    ) -> std::option::Option<&[crate::model::ProductionVariantSummary]> {
        self.shadow_production_variants.as_deref()
    }
}
/// See [`Endpoint`](crate::model::Endpoint).
pub mod endpoint {

    /// A builder for [`Endpoint`](crate::model::Endpoint).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) endpoint_arn: std::option::Option<std::string::String>,
        pub(crate) endpoint_config_name: std::option::Option<std::string::String>,
        pub(crate) production_variants:
            std::option::Option<std::vec::Vec<crate::model::ProductionVariantSummary>>,
        pub(crate) data_capture_config: std::option::Option<crate::model::DataCaptureConfigSummary>,
        pub(crate) endpoint_status: std::option::Option<crate::model::EndpointStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) monitoring_schedules:
            std::option::Option<std::vec::Vec<crate::model::MonitoringSchedule>>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) shadow_production_variants:
            std::option::Option<std::vec::Vec<crate::model::ProductionVariantSummary>>,
    }
    impl Builder {
        /// <p>The name of the endpoint.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
        pub fn endpoint_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
        pub fn set_endpoint_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.endpoint_arn = input;
            self
        }
        /// <p>The endpoint configuration associated with the endpoint.</p>
        pub fn endpoint_config_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_config_name = Some(input.into());
            self
        }
        /// <p>The endpoint configuration associated with the endpoint.</p>
        pub fn set_endpoint_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_config_name = input;
            self
        }
        /// Appends an item to `production_variants`.
        ///
        /// To override the contents of this collection use [`set_production_variants`](Self::set_production_variants).
        ///
        /// <p>A list of the production variants hosted on the endpoint. Each production variant is a model.</p>
        pub fn production_variants(
            mut self,
            input: crate::model::ProductionVariantSummary,
        ) -> Self {
            let mut v = self.production_variants.unwrap_or_default();
            v.push(input);
            self.production_variants = Some(v);
            self
        }
        /// <p>A list of the production variants hosted on the endpoint. Each production variant is a model.</p>
        pub fn set_production_variants(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProductionVariantSummary>>,
        ) -> Self {
            self.production_variants = input;
            self
        }
        /// <p>The currently active data capture configuration used by your Endpoint.</p>
        pub fn data_capture_config(
            mut self,
            input: crate::model::DataCaptureConfigSummary,
        ) -> Self {
            self.data_capture_config = Some(input);
            self
        }
        /// <p>The currently active data capture configuration used by your Endpoint.</p>
        pub fn set_data_capture_config(
            mut self,
            input: std::option::Option<crate::model::DataCaptureConfigSummary>,
        ) -> Self {
            self.data_capture_config = input;
            self
        }
        /// <p>The status of the endpoint.</p>
        pub fn endpoint_status(mut self, input: crate::model::EndpointStatus) -> Self {
            self.endpoint_status = Some(input);
            self
        }
        /// <p>The status of the endpoint.</p>
        pub fn set_endpoint_status(
            mut self,
            input: std::option::Option<crate::model::EndpointStatus>,
        ) -> Self {
            self.endpoint_status = input;
            self
        }
        /// <p>If the endpoint failed, the reason it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the endpoint failed, the reason it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The time that the endpoint was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the endpoint was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last time the endpoint was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last time the endpoint was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Appends an item to `monitoring_schedules`.
        ///
        /// To override the contents of this collection use [`set_monitoring_schedules`](Self::set_monitoring_schedules).
        ///
        /// <p>A list of monitoring schedules for the endpoint. For information about model monitoring, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html">Amazon SageMaker Model Monitor</a>.</p>
        pub fn monitoring_schedules(mut self, input: crate::model::MonitoringSchedule) -> Self {
            let mut v = self.monitoring_schedules.unwrap_or_default();
            v.push(input);
            self.monitoring_schedules = Some(v);
            self
        }
        /// <p>A list of monitoring schedules for the endpoint. For information about model monitoring, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html">Amazon SageMaker Model Monitor</a>.</p>
        pub fn set_monitoring_schedules(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MonitoringSchedule>>,
        ) -> Self {
            self.monitoring_schedules = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of the tags associated with the endpoint. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of the tags associated with the endpoint. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Appends an item to `shadow_production_variants`.
        ///
        /// To override the contents of this collection use [`set_shadow_production_variants`](Self::set_shadow_production_variants).
        ///
        /// <p>A list of the shadow variants hosted on the endpoint. Each shadow variant is a model in shadow mode with production traffic replicated from the production variant.</p>
        pub fn shadow_production_variants(
            mut self,
            input: crate::model::ProductionVariantSummary,
        ) -> Self {
            let mut v = self.shadow_production_variants.unwrap_or_default();
            v.push(input);
            self.shadow_production_variants = Some(v);
            self
        }
        /// <p>A list of the shadow variants hosted on the endpoint. Each shadow variant is a model in shadow mode with production traffic replicated from the production variant.</p>
        pub fn set_shadow_production_variants(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProductionVariantSummary>>,
        ) -> Self {
            self.shadow_production_variants = input;
            self
        }
        /// Consumes the builder and constructs a [`Endpoint`](crate::model::Endpoint).
        pub fn build(self) -> crate::model::Endpoint {
            crate::model::Endpoint {
                endpoint_name: self.endpoint_name,
                endpoint_arn: self.endpoint_arn,
                endpoint_config_name: self.endpoint_config_name,
                production_variants: self.production_variants,
                data_capture_config: self.data_capture_config,
                endpoint_status: self.endpoint_status,
                failure_reason: self.failure_reason,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                monitoring_schedules: self.monitoring_schedules,
                tags: self.tags,
                shadow_production_variants: self.shadow_production_variants,
            }
        }
    }
}
impl Endpoint {
    /// Creates a new builder-style object to manufacture [`Endpoint`](crate::model::Endpoint).
    pub fn builder() -> crate::model::endpoint::Builder {
        crate::model::endpoint::Builder::default()
    }
}

/// <p>Describes weight and capacities for a production variant associated with an endpoint. If you sent a request to the <code>UpdateEndpointWeightsAndCapacities</code> API and the endpoint status is <code>Updating</code>, you get different desired and current values. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProductionVariantSummary {
    /// <p>The name of the variant.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
    #[doc(hidden)]
    pub deployed_images: std::option::Option<std::vec::Vec<crate::model::DeployedImage>>,
    /// <p>The weight associated with the variant.</p>
    #[doc(hidden)]
    pub current_weight: std::option::Option<f32>,
    /// <p>The requested weight, as specified in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
    #[doc(hidden)]
    pub desired_weight: std::option::Option<f32>,
    /// <p>The number of instances associated with the variant.</p>
    #[doc(hidden)]
    pub current_instance_count: std::option::Option<i32>,
    /// <p>The number of instances requested in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
    #[doc(hidden)]
    pub desired_instance_count: std::option::Option<i32>,
    /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
    #[doc(hidden)]
    pub variant_status: std::option::Option<std::vec::Vec<crate::model::ProductionVariantStatus>>,
    /// <p>The serverless configuration for the endpoint.</p>
    #[doc(hidden)]
    pub current_serverless_config:
        std::option::Option<crate::model::ProductionVariantServerlessConfig>,
    /// <p>The serverless configuration requested for the endpoint update.</p>
    #[doc(hidden)]
    pub desired_serverless_config:
        std::option::Option<crate::model::ProductionVariantServerlessConfig>,
}
impl ProductionVariantSummary {
    /// <p>The name of the variant.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
    pub fn deployed_images(&self) -> std::option::Option<&[crate::model::DeployedImage]> {
        self.deployed_images.as_deref()
    }
    /// <p>The weight associated with the variant.</p>
    pub fn current_weight(&self) -> std::option::Option<f32> {
        self.current_weight
    }
    /// <p>The requested weight, as specified in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
    pub fn desired_weight(&self) -> std::option::Option<f32> {
        self.desired_weight
    }
    /// <p>The number of instances associated with the variant.</p>
    pub fn current_instance_count(&self) -> std::option::Option<i32> {
        self.current_instance_count
    }
    /// <p>The number of instances requested in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
    pub fn desired_instance_count(&self) -> std::option::Option<i32> {
        self.desired_instance_count
    }
    /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
    pub fn variant_status(&self) -> std::option::Option<&[crate::model::ProductionVariantStatus]> {
        self.variant_status.as_deref()
    }
    /// <p>The serverless configuration for the endpoint.</p>
    pub fn current_serverless_config(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantServerlessConfig> {
        self.current_serverless_config.as_ref()
    }
    /// <p>The serverless configuration requested for the endpoint update.</p>
    pub fn desired_serverless_config(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantServerlessConfig> {
        self.desired_serverless_config.as_ref()
    }
}
/// See [`ProductionVariantSummary`](crate::model::ProductionVariantSummary).
pub mod production_variant_summary {

    /// A builder for [`ProductionVariantSummary`](crate::model::ProductionVariantSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) deployed_images: std::option::Option<std::vec::Vec<crate::model::DeployedImage>>,
        pub(crate) current_weight: std::option::Option<f32>,
        pub(crate) desired_weight: std::option::Option<f32>,
        pub(crate) current_instance_count: std::option::Option<i32>,
        pub(crate) desired_instance_count: std::option::Option<i32>,
        pub(crate) variant_status:
            std::option::Option<std::vec::Vec<crate::model::ProductionVariantStatus>>,
        pub(crate) current_serverless_config:
            std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        pub(crate) desired_serverless_config:
            std::option::Option<crate::model::ProductionVariantServerlessConfig>,
    }
    impl Builder {
        /// <p>The name of the variant.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the variant.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// Appends an item to `deployed_images`.
        ///
        /// To override the contents of this collection use [`set_deployed_images`](Self::set_deployed_images).
        ///
        /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
        pub fn deployed_images(mut self, input: crate::model::DeployedImage) -> Self {
            let mut v = self.deployed_images.unwrap_or_default();
            v.push(input);
            self.deployed_images = Some(v);
            self
        }
        /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
        pub fn set_deployed_images(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::DeployedImage>>,
        ) -> Self {
            self.deployed_images = input;
            self
        }
        /// <p>The weight associated with the variant.</p>
        pub fn current_weight(mut self, input: f32) -> Self {
            self.current_weight = Some(input);
            self
        }
        /// <p>The weight associated with the variant.</p>
        pub fn set_current_weight(mut self, input: std::option::Option<f32>) -> Self {
            self.current_weight = input;
            self
        }
        /// <p>The requested weight, as specified in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
        pub fn desired_weight(mut self, input: f32) -> Self {
            self.desired_weight = Some(input);
            self
        }
        /// <p>The requested weight, as specified in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
        pub fn set_desired_weight(mut self, input: std::option::Option<f32>) -> Self {
            self.desired_weight = input;
            self
        }
        /// <p>The number of instances associated with the variant.</p>
        pub fn current_instance_count(mut self, input: i32) -> Self {
            self.current_instance_count = Some(input);
            self
        }
        /// <p>The number of instances associated with the variant.</p>
        pub fn set_current_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.current_instance_count = input;
            self
        }
        /// <p>The number of instances requested in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
        pub fn desired_instance_count(mut self, input: i32) -> Self {
            self.desired_instance_count = Some(input);
            self
        }
        /// <p>The number of instances requested in the <code>UpdateEndpointWeightsAndCapacities</code> request. </p>
        pub fn set_desired_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.desired_instance_count = input;
            self
        }
        /// Appends an item to `variant_status`.
        ///
        /// To override the contents of this collection use [`set_variant_status`](Self::set_variant_status).
        ///
        /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
        pub fn variant_status(mut self, input: crate::model::ProductionVariantStatus) -> Self {
            let mut v = self.variant_status.unwrap_or_default();
            v.push(input);
            self.variant_status = Some(v);
            self
        }
        /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
        pub fn set_variant_status(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProductionVariantStatus>>,
        ) -> Self {
            self.variant_status = input;
            self
        }
        /// <p>The serverless configuration for the endpoint.</p>
        pub fn current_serverless_config(
            mut self,
            input: crate::model::ProductionVariantServerlessConfig,
        ) -> Self {
            self.current_serverless_config = Some(input);
            self
        }
        /// <p>The serverless configuration for the endpoint.</p>
        pub fn set_current_serverless_config(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        ) -> Self {
            self.current_serverless_config = input;
            self
        }
        /// <p>The serverless configuration requested for the endpoint update.</p>
        pub fn desired_serverless_config(
            mut self,
            input: crate::model::ProductionVariantServerlessConfig,
        ) -> Self {
            self.desired_serverless_config = Some(input);
            self
        }
        /// <p>The serverless configuration requested for the endpoint update.</p>
        pub fn set_desired_serverless_config(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        ) -> Self {
            self.desired_serverless_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ProductionVariantSummary`](crate::model::ProductionVariantSummary).
        pub fn build(self) -> crate::model::ProductionVariantSummary {
            crate::model::ProductionVariantSummary {
                variant_name: self.variant_name,
                deployed_images: self.deployed_images,
                current_weight: self.current_weight,
                desired_weight: self.desired_weight,
                current_instance_count: self.current_instance_count,
                desired_instance_count: self.desired_instance_count,
                variant_status: self.variant_status,
                current_serverless_config: self.current_serverless_config,
                desired_serverless_config: self.desired_serverless_config,
            }
        }
    }
}
impl ProductionVariantSummary {
    /// Creates a new builder-style object to manufacture [`ProductionVariantSummary`](crate::model::ProductionVariantSummary).
    pub fn builder() -> crate::model::production_variant_summary::Builder {
        crate::model::production_variant_summary::Builder::default()
    }
}

/// <p>Specifies the serverless configuration for an endpoint variant.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProductionVariantServerlessConfig {
    /// <p>The memory size of your serverless endpoint. Valid values are in 1 GB increments: 1024 MB, 2048 MB, 3072 MB, 4096 MB, 5120 MB, or 6144 MB.</p>
    #[doc(hidden)]
    pub memory_size_in_mb: std::option::Option<i32>,
    /// <p>The maximum number of concurrent invocations your serverless endpoint can process.</p>
    #[doc(hidden)]
    pub max_concurrency: std::option::Option<i32>,
}
impl ProductionVariantServerlessConfig {
    /// <p>The memory size of your serverless endpoint. Valid values are in 1 GB increments: 1024 MB, 2048 MB, 3072 MB, 4096 MB, 5120 MB, or 6144 MB.</p>
    pub fn memory_size_in_mb(&self) -> std::option::Option<i32> {
        self.memory_size_in_mb
    }
    /// <p>The maximum number of concurrent invocations your serverless endpoint can process.</p>
    pub fn max_concurrency(&self) -> std::option::Option<i32> {
        self.max_concurrency
    }
}
/// See [`ProductionVariantServerlessConfig`](crate::model::ProductionVariantServerlessConfig).
pub mod production_variant_serverless_config {

    /// A builder for [`ProductionVariantServerlessConfig`](crate::model::ProductionVariantServerlessConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) memory_size_in_mb: std::option::Option<i32>,
        pub(crate) max_concurrency: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The memory size of your serverless endpoint. Valid values are in 1 GB increments: 1024 MB, 2048 MB, 3072 MB, 4096 MB, 5120 MB, or 6144 MB.</p>
        pub fn memory_size_in_mb(mut self, input: i32) -> Self {
            self.memory_size_in_mb = Some(input);
            self
        }
        /// <p>The memory size of your serverless endpoint. Valid values are in 1 GB increments: 1024 MB, 2048 MB, 3072 MB, 4096 MB, 5120 MB, or 6144 MB.</p>
        pub fn set_memory_size_in_mb(mut self, input: std::option::Option<i32>) -> Self {
            self.memory_size_in_mb = input;
            self
        }
        /// <p>The maximum number of concurrent invocations your serverless endpoint can process.</p>
        pub fn max_concurrency(mut self, input: i32) -> Self {
            self.max_concurrency = Some(input);
            self
        }
        /// <p>The maximum number of concurrent invocations your serverless endpoint can process.</p>
        pub fn set_max_concurrency(mut self, input: std::option::Option<i32>) -> Self {
            self.max_concurrency = input;
            self
        }
        /// Consumes the builder and constructs a [`ProductionVariantServerlessConfig`](crate::model::ProductionVariantServerlessConfig).
        pub fn build(self) -> crate::model::ProductionVariantServerlessConfig {
            crate::model::ProductionVariantServerlessConfig {
                memory_size_in_mb: self.memory_size_in_mb,
                max_concurrency: self.max_concurrency,
            }
        }
    }
}
impl ProductionVariantServerlessConfig {
    /// Creates a new builder-style object to manufacture [`ProductionVariantServerlessConfig`](crate::model::ProductionVariantServerlessConfig).
    pub fn builder() -> crate::model::production_variant_serverless_config::Builder {
        crate::model::production_variant_serverless_config::Builder::default()
    }
}

/// <p>Describes the status of the production variant.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProductionVariantStatus {
    /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
    /// <ul>
    /// <li> <p> <code>Creating</code>: Creating inference resources for the production variant.</p> </li>
    /// <li> <p> <code>Deleting</code>: Terminating inference resources for the production variant.</p> </li>
    /// <li> <p> <code>Updating</code>: Updating capacity for the production variant.</p> </li>
    /// <li> <p> <code>ActivatingTraffic</code>: Turning on traffic for the production variant.</p> </li>
    /// <li> <p> <code>Baking</code>: Waiting period to monitor the CloudWatch alarms in the automatic rollback configuration.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::VariantStatus>,
    /// <p>A message that describes the status of the production variant.</p>
    #[doc(hidden)]
    pub status_message: std::option::Option<std::string::String>,
    /// <p>The start time of the current status change.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ProductionVariantStatus {
    /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
    /// <ul>
    /// <li> <p> <code>Creating</code>: Creating inference resources for the production variant.</p> </li>
    /// <li> <p> <code>Deleting</code>: Terminating inference resources for the production variant.</p> </li>
    /// <li> <p> <code>Updating</code>: Updating capacity for the production variant.</p> </li>
    /// <li> <p> <code>ActivatingTraffic</code>: Turning on traffic for the production variant.</p> </li>
    /// <li> <p> <code>Baking</code>: Waiting period to monitor the CloudWatch alarms in the automatic rollback configuration.</p> </li>
    /// </ul>
    pub fn status(&self) -> std::option::Option<&crate::model::VariantStatus> {
        self.status.as_ref()
    }
    /// <p>A message that describes the status of the production variant.</p>
    pub fn status_message(&self) -> std::option::Option<&str> {
        self.status_message.as_deref()
    }
    /// <p>The start time of the current status change.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
}
/// See [`ProductionVariantStatus`](crate::model::ProductionVariantStatus).
pub mod production_variant_status {

    /// A builder for [`ProductionVariantStatus`](crate::model::ProductionVariantStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) status: std::option::Option<crate::model::VariantStatus>,
        pub(crate) status_message: std::option::Option<std::string::String>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
        /// <ul>
        /// <li> <p> <code>Creating</code>: Creating inference resources for the production variant.</p> </li>
        /// <li> <p> <code>Deleting</code>: Terminating inference resources for the production variant.</p> </li>
        /// <li> <p> <code>Updating</code>: Updating capacity for the production variant.</p> </li>
        /// <li> <p> <code>ActivatingTraffic</code>: Turning on traffic for the production variant.</p> </li>
        /// <li> <p> <code>Baking</code>: Waiting period to monitor the CloudWatch alarms in the automatic rollback configuration.</p> </li>
        /// </ul>
        pub fn status(mut self, input: crate::model::VariantStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
        /// <ul>
        /// <li> <p> <code>Creating</code>: Creating inference resources for the production variant.</p> </li>
        /// <li> <p> <code>Deleting</code>: Terminating inference resources for the production variant.</p> </li>
        /// <li> <p> <code>Updating</code>: Updating capacity for the production variant.</p> </li>
        /// <li> <p> <code>ActivatingTraffic</code>: Turning on traffic for the production variant.</p> </li>
        /// <li> <p> <code>Baking</code>: Waiting period to monitor the CloudWatch alarms in the automatic rollback configuration.</p> </li>
        /// </ul>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::VariantStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>A message that describes the status of the production variant.</p>
        pub fn status_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.status_message = Some(input.into());
            self
        }
        /// <p>A message that describes the status of the production variant.</p>
        pub fn set_status_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.status_message = input;
            self
        }
        /// <p>The start time of the current status change.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>The start time of the current status change.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ProductionVariantStatus`](crate::model::ProductionVariantStatus).
        pub fn build(self) -> crate::model::ProductionVariantStatus {
            crate::model::ProductionVariantStatus {
                status: self.status,
                status_message: self.status_message,
                start_time: self.start_time,
            }
        }
    }
}
impl ProductionVariantStatus {
    /// Creates a new builder-style object to manufacture [`ProductionVariantStatus`](crate::model::ProductionVariantStatus).
    pub fn builder() -> crate::model::production_variant_status::Builder {
        crate::model::production_variant_status::Builder::default()
    }
}

/// When writing a match expression against `VariantStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let variantstatus = unimplemented!();
/// match variantstatus {
///     VariantStatus::ActivatingTraffic => { /* ... */ },
///     VariantStatus::Baking => { /* ... */ },
///     VariantStatus::Creating => { /* ... */ },
///     VariantStatus::Deleting => { /* ... */ },
///     VariantStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `variantstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `VariantStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `VariantStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `VariantStatus::NewFeature` is defined.
/// Specifically, when `variantstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `VariantStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum VariantStatus {
    #[allow(missing_docs)] // documentation missing in model
    ActivatingTraffic,
    #[allow(missing_docs)] // documentation missing in model
    Baking,
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for VariantStatus {
    fn from(s: &str) -> Self {
        match s {
            "ActivatingTraffic" => VariantStatus::ActivatingTraffic,
            "Baking" => VariantStatus::Baking,
            "Creating" => VariantStatus::Creating,
            "Deleting" => VariantStatus::Deleting,
            "Updating" => VariantStatus::Updating,
            other => VariantStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for VariantStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(VariantStatus::from(s))
    }
}
impl VariantStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            VariantStatus::ActivatingTraffic => "ActivatingTraffic",
            VariantStatus::Baking => "Baking",
            VariantStatus::Creating => "Creating",
            VariantStatus::Deleting => "Deleting",
            VariantStatus::Updating => "Updating",
            VariantStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ActivatingTraffic",
            "Baking",
            "Creating",
            "Deleting",
            "Updating",
        ]
    }
}
impl AsRef<str> for VariantStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Gets the Amazon EC2 Container Registry path of the docker image of the model that is hosted in this <code>ProductionVariant</code>.</p>
/// <p>If you used the <code>registry/repository[:tag]</code> form to specify the image path of the primary container when you created the model hosted in this <code>ProductionVariant</code>, the path resolves to a path of the form <code>registry/repository[@digest]</code>. A digest is a hash value that identifies a specific version of an image. For information about Amazon ECR paths, see <a href="https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-pull-ecr-image.html">Pulling an Image</a> in the <i>Amazon ECR User Guide</i>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeployedImage {
    /// <p>The image path you specified when you created the model.</p>
    #[doc(hidden)]
    pub specified_image: std::option::Option<std::string::String>,
    /// <p>The specific digest path of the image hosted in this <code>ProductionVariant</code>.</p>
    #[doc(hidden)]
    pub resolved_image: std::option::Option<std::string::String>,
    /// <p>The date and time when the image path for the model resolved to the <code>ResolvedImage</code> </p>
    #[doc(hidden)]
    pub resolution_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl DeployedImage {
    /// <p>The image path you specified when you created the model.</p>
    pub fn specified_image(&self) -> std::option::Option<&str> {
        self.specified_image.as_deref()
    }
    /// <p>The specific digest path of the image hosted in this <code>ProductionVariant</code>.</p>
    pub fn resolved_image(&self) -> std::option::Option<&str> {
        self.resolved_image.as_deref()
    }
    /// <p>The date and time when the image path for the model resolved to the <code>ResolvedImage</code> </p>
    pub fn resolution_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.resolution_time.as_ref()
    }
}
/// See [`DeployedImage`](crate::model::DeployedImage).
pub mod deployed_image {

    /// A builder for [`DeployedImage`](crate::model::DeployedImage).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) specified_image: std::option::Option<std::string::String>,
        pub(crate) resolved_image: std::option::Option<std::string::String>,
        pub(crate) resolution_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The image path you specified when you created the model.</p>
        pub fn specified_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.specified_image = Some(input.into());
            self
        }
        /// <p>The image path you specified when you created the model.</p>
        pub fn set_specified_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.specified_image = input;
            self
        }
        /// <p>The specific digest path of the image hosted in this <code>ProductionVariant</code>.</p>
        pub fn resolved_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.resolved_image = Some(input.into());
            self
        }
        /// <p>The specific digest path of the image hosted in this <code>ProductionVariant</code>.</p>
        pub fn set_resolved_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.resolved_image = input;
            self
        }
        /// <p>The date and time when the image path for the model resolved to the <code>ResolvedImage</code> </p>
        pub fn resolution_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.resolution_time = Some(input);
            self
        }
        /// <p>The date and time when the image path for the model resolved to the <code>ResolvedImage</code> </p>
        pub fn set_resolution_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.resolution_time = input;
            self
        }
        /// Consumes the builder and constructs a [`DeployedImage`](crate::model::DeployedImage).
        pub fn build(self) -> crate::model::DeployedImage {
            crate::model::DeployedImage {
                specified_image: self.specified_image,
                resolved_image: self.resolved_image,
                resolution_time: self.resolution_time,
            }
        }
    }
}
impl DeployedImage {
    /// Creates a new builder-style object to manufacture [`DeployedImage`](crate::model::DeployedImage).
    pub fn builder() -> crate::model::deployed_image::Builder {
        crate::model::deployed_image::Builder::default()
    }
}

/// <p>A schedule for a model monitoring job. For information about model monitor, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html">Amazon SageMaker Model Monitor</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringSchedule {
    /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_arn: std::option::Option<std::string::String>,
    /// <p>The name of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_name: std::option::Option<std::string::String>,
    /// <p>The status of the monitoring schedule. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>PENDING</code> - The schedule is pending being created.</p> </li>
    /// <li> <p> <code>FAILED</code> - The schedule failed.</p> </li>
    /// <li> <p> <code>SCHEDULED</code> - The schedule was successfully created.</p> </li>
    /// <li> <p> <code>STOPPED</code> - The schedule was stopped.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub monitoring_schedule_status: std::option::Option<crate::model::ScheduleStatus>,
    /// <p>The type of the monitoring job definition to schedule.</p>
    #[doc(hidden)]
    pub monitoring_type: std::option::Option<crate::model::MonitoringType>,
    /// <p>If the monitoring schedule failed, the reason it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The time that the monitoring schedule was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last time the monitoring schedule was changed.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_schedule_config: std::option::Option<crate::model::MonitoringScheduleConfig>,
    /// <p>The endpoint that hosts the model being monitored.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>Summary of information about the last monitoring job to run.</p>
    #[doc(hidden)]
    pub last_monitoring_execution_summary:
        std::option::Option<crate::model::MonitoringExecutionSummary>,
    /// <p>A list of the tags associated with the monitoring schedlue. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl MonitoringSchedule {
    /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
    pub fn monitoring_schedule_arn(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_arn.as_deref()
    }
    /// <p>The name of the monitoring schedule.</p>
    pub fn monitoring_schedule_name(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_name.as_deref()
    }
    /// <p>The status of the monitoring schedule. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>PENDING</code> - The schedule is pending being created.</p> </li>
    /// <li> <p> <code>FAILED</code> - The schedule failed.</p> </li>
    /// <li> <p> <code>SCHEDULED</code> - The schedule was successfully created.</p> </li>
    /// <li> <p> <code>STOPPED</code> - The schedule was stopped.</p> </li>
    /// </ul>
    pub fn monitoring_schedule_status(&self) -> std::option::Option<&crate::model::ScheduleStatus> {
        self.monitoring_schedule_status.as_ref()
    }
    /// <p>The type of the monitoring job definition to schedule.</p>
    pub fn monitoring_type(&self) -> std::option::Option<&crate::model::MonitoringType> {
        self.monitoring_type.as_ref()
    }
    /// <p>If the monitoring schedule failed, the reason it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The time that the monitoring schedule was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last time the monitoring schedule was changed.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
    pub fn monitoring_schedule_config(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringScheduleConfig> {
        self.monitoring_schedule_config.as_ref()
    }
    /// <p>The endpoint that hosts the model being monitored.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>Summary of information about the last monitoring job to run.</p>
    pub fn last_monitoring_execution_summary(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringExecutionSummary> {
        self.last_monitoring_execution_summary.as_ref()
    }
    /// <p>A list of the tags associated with the monitoring schedlue. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`MonitoringSchedule`](crate::model::MonitoringSchedule).
pub mod monitoring_schedule {

    /// A builder for [`MonitoringSchedule`](crate::model::MonitoringSchedule).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_schedule_arn: std::option::Option<std::string::String>,
        pub(crate) monitoring_schedule_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_schedule_status: std::option::Option<crate::model::ScheduleStatus>,
        pub(crate) monitoring_type: std::option::Option<crate::model::MonitoringType>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) monitoring_schedule_config:
            std::option::Option<crate::model::MonitoringScheduleConfig>,
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) last_monitoring_execution_summary:
            std::option::Option<crate::model::MonitoringExecutionSummary>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
        pub fn monitoring_schedule_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_arn = input;
            self
        }
        /// <p>The name of the monitoring schedule.</p>
        pub fn monitoring_schedule_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_name = input;
            self
        }
        /// <p>The status of the monitoring schedule. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>PENDING</code> - The schedule is pending being created.</p> </li>
        /// <li> <p> <code>FAILED</code> - The schedule failed.</p> </li>
        /// <li> <p> <code>SCHEDULED</code> - The schedule was successfully created.</p> </li>
        /// <li> <p> <code>STOPPED</code> - The schedule was stopped.</p> </li>
        /// </ul>
        pub fn monitoring_schedule_status(mut self, input: crate::model::ScheduleStatus) -> Self {
            self.monitoring_schedule_status = Some(input);
            self
        }
        /// <p>The status of the monitoring schedule. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>PENDING</code> - The schedule is pending being created.</p> </li>
        /// <li> <p> <code>FAILED</code> - The schedule failed.</p> </li>
        /// <li> <p> <code>SCHEDULED</code> - The schedule was successfully created.</p> </li>
        /// <li> <p> <code>STOPPED</code> - The schedule was stopped.</p> </li>
        /// </ul>
        pub fn set_monitoring_schedule_status(
            mut self,
            input: std::option::Option<crate::model::ScheduleStatus>,
        ) -> Self {
            self.monitoring_schedule_status = input;
            self
        }
        /// <p>The type of the monitoring job definition to schedule.</p>
        pub fn monitoring_type(mut self, input: crate::model::MonitoringType) -> Self {
            self.monitoring_type = Some(input);
            self
        }
        /// <p>The type of the monitoring job definition to schedule.</p>
        pub fn set_monitoring_type(
            mut self,
            input: std::option::Option<crate::model::MonitoringType>,
        ) -> Self {
            self.monitoring_type = input;
            self
        }
        /// <p>If the monitoring schedule failed, the reason it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the monitoring schedule failed, the reason it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The time that the monitoring schedule was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the monitoring schedule was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last time the monitoring schedule was changed.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last time the monitoring schedule was changed.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
        pub fn monitoring_schedule_config(
            mut self,
            input: crate::model::MonitoringScheduleConfig,
        ) -> Self {
            self.monitoring_schedule_config = Some(input);
            self
        }
        /// <p>Configures the monitoring schedule and defines the monitoring job.</p>
        pub fn set_monitoring_schedule_config(
            mut self,
            input: std::option::Option<crate::model::MonitoringScheduleConfig>,
        ) -> Self {
            self.monitoring_schedule_config = input;
            self
        }
        /// <p>The endpoint that hosts the model being monitored.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The endpoint that hosts the model being monitored.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>Summary of information about the last monitoring job to run.</p>
        pub fn last_monitoring_execution_summary(
            mut self,
            input: crate::model::MonitoringExecutionSummary,
        ) -> Self {
            self.last_monitoring_execution_summary = Some(input);
            self
        }
        /// <p>Summary of information about the last monitoring job to run.</p>
        pub fn set_last_monitoring_execution_summary(
            mut self,
            input: std::option::Option<crate::model::MonitoringExecutionSummary>,
        ) -> Self {
            self.last_monitoring_execution_summary = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>A list of the tags associated with the monitoring schedlue. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>A list of the tags associated with the monitoring schedlue. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services resources</a> in the <i>Amazon Web Services General Reference Guide</i>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringSchedule`](crate::model::MonitoringSchedule).
        pub fn build(self) -> crate::model::MonitoringSchedule {
            crate::model::MonitoringSchedule {
                monitoring_schedule_arn: self.monitoring_schedule_arn,
                monitoring_schedule_name: self.monitoring_schedule_name,
                monitoring_schedule_status: self.monitoring_schedule_status,
                monitoring_type: self.monitoring_type,
                failure_reason: self.failure_reason,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                monitoring_schedule_config: self.monitoring_schedule_config,
                endpoint_name: self.endpoint_name,
                last_monitoring_execution_summary: self.last_monitoring_execution_summary,
                tags: self.tags,
            }
        }
    }
}
impl MonitoringSchedule {
    /// Creates a new builder-style object to manufacture [`MonitoringSchedule`](crate::model::MonitoringSchedule).
    pub fn builder() -> crate::model::monitoring_schedule::Builder {
        crate::model::monitoring_schedule::Builder::default()
    }
}

/// <p>The currently active data capture configuration used by your Endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataCaptureConfigSummary {
    /// <p>Whether data capture is enabled or disabled.</p>
    #[doc(hidden)]
    pub enable_capture: bool,
    /// <p>Whether data capture is currently functional.</p>
    #[doc(hidden)]
    pub capture_status: std::option::Option<crate::model::CaptureStatus>,
    /// <p>The percentage of requests being captured by your Endpoint.</p>
    #[doc(hidden)]
    pub current_sampling_percentage: std::option::Option<i32>,
    /// <p>The Amazon S3 location being used to capture the data.</p>
    #[doc(hidden)]
    pub destination_s3_uri: std::option::Option<std::string::String>,
    /// <p>The KMS key being used to encrypt the data in Amazon S3.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl DataCaptureConfigSummary {
    /// <p>Whether data capture is enabled or disabled.</p>
    pub fn enable_capture(&self) -> bool {
        self.enable_capture
    }
    /// <p>Whether data capture is currently functional.</p>
    pub fn capture_status(&self) -> std::option::Option<&crate::model::CaptureStatus> {
        self.capture_status.as_ref()
    }
    /// <p>The percentage of requests being captured by your Endpoint.</p>
    pub fn current_sampling_percentage(&self) -> std::option::Option<i32> {
        self.current_sampling_percentage
    }
    /// <p>The Amazon S3 location being used to capture the data.</p>
    pub fn destination_s3_uri(&self) -> std::option::Option<&str> {
        self.destination_s3_uri.as_deref()
    }
    /// <p>The KMS key being used to encrypt the data in Amazon S3.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`DataCaptureConfigSummary`](crate::model::DataCaptureConfigSummary).
pub mod data_capture_config_summary {

    /// A builder for [`DataCaptureConfigSummary`](crate::model::DataCaptureConfigSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) enable_capture: std::option::Option<bool>,
        pub(crate) capture_status: std::option::Option<crate::model::CaptureStatus>,
        pub(crate) current_sampling_percentage: std::option::Option<i32>,
        pub(crate) destination_s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Whether data capture is enabled or disabled.</p>
        pub fn enable_capture(mut self, input: bool) -> Self {
            self.enable_capture = Some(input);
            self
        }
        /// <p>Whether data capture is enabled or disabled.</p>
        pub fn set_enable_capture(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_capture = input;
            self
        }
        /// <p>Whether data capture is currently functional.</p>
        pub fn capture_status(mut self, input: crate::model::CaptureStatus) -> Self {
            self.capture_status = Some(input);
            self
        }
        /// <p>Whether data capture is currently functional.</p>
        pub fn set_capture_status(
            mut self,
            input: std::option::Option<crate::model::CaptureStatus>,
        ) -> Self {
            self.capture_status = input;
            self
        }
        /// <p>The percentage of requests being captured by your Endpoint.</p>
        pub fn current_sampling_percentage(mut self, input: i32) -> Self {
            self.current_sampling_percentage = Some(input);
            self
        }
        /// <p>The percentage of requests being captured by your Endpoint.</p>
        pub fn set_current_sampling_percentage(mut self, input: std::option::Option<i32>) -> Self {
            self.current_sampling_percentage = input;
            self
        }
        /// <p>The Amazon S3 location being used to capture the data.</p>
        pub fn destination_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location being used to capture the data.</p>
        pub fn set_destination_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_s3_uri = input;
            self
        }
        /// <p>The KMS key being used to encrypt the data in Amazon S3.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The KMS key being used to encrypt the data in Amazon S3.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`DataCaptureConfigSummary`](crate::model::DataCaptureConfigSummary).
        pub fn build(self) -> crate::model::DataCaptureConfigSummary {
            crate::model::DataCaptureConfigSummary {
                enable_capture: self.enable_capture.unwrap_or_default(),
                capture_status: self.capture_status,
                current_sampling_percentage: self.current_sampling_percentage,
                destination_s3_uri: self.destination_s3_uri,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl DataCaptureConfigSummary {
    /// Creates a new builder-style object to manufacture [`DataCaptureConfigSummary`](crate::model::DataCaptureConfigSummary).
    pub fn builder() -> crate::model::data_capture_config_summary::Builder {
        crate::model::data_capture_config_summary::Builder::default()
    }
}

/// When writing a match expression against `CaptureStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let capturestatus = unimplemented!();
/// match capturestatus {
///     CaptureStatus::Started => { /* ... */ },
///     CaptureStatus::Stopped => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `capturestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CaptureStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CaptureStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CaptureStatus::NewFeature` is defined.
/// Specifically, when `capturestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CaptureStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CaptureStatus {
    #[allow(missing_docs)] // documentation missing in model
    Started,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CaptureStatus {
    fn from(s: &str) -> Self {
        match s {
            "Started" => CaptureStatus::Started,
            "Stopped" => CaptureStatus::Stopped,
            other => CaptureStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for CaptureStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CaptureStatus::from(s))
    }
}
impl CaptureStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CaptureStatus::Started => "Started",
            CaptureStatus::Stopped => "Stopped",
            CaptureStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Started", "Stopped"]
    }
}
impl AsRef<str> for CaptureStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The properties of a trial component as returned by the <code>Search</code> API.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponent {
    /// <p>The name of the trial component.</p>
    #[doc(hidden)]
    pub trial_component_name: std::option::Option<std::string::String>,
    /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
    #[doc(hidden)]
    pub trial_component_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) and job type of the source of the component.</p>
    #[doc(hidden)]
    pub source: std::option::Option<crate::model::TrialComponentSource>,
    /// <p>The status of the trial component.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::TrialComponentStatus>,
    /// <p>When the component started.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the component ended.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the component was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Who created the trial component.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>When the component was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>The hyperparameters of the component.</p>
    #[doc(hidden)]
    pub parameters: std::option::Option<
        std::collections::HashMap<std::string::String, crate::model::TrialComponentParameterValue>,
    >,
    /// <p>The input artifacts of the component.</p>
    #[doc(hidden)]
    pub input_artifacts: std::option::Option<
        std::collections::HashMap<std::string::String, crate::model::TrialComponentArtifact>,
    >,
    /// <p>The output artifacts of the component.</p>
    #[doc(hidden)]
    pub output_artifacts: std::option::Option<
        std::collections::HashMap<std::string::String, crate::model::TrialComponentArtifact>,
    >,
    /// <p>The metrics for the component.</p>
    #[doc(hidden)]
    pub metrics: std::option::Option<std::vec::Vec<crate::model::TrialComponentMetricSummary>>,
    /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
    #[doc(hidden)]
    pub metadata_properties: std::option::Option<crate::model::MetadataProperties>,
    /// <p>Details of the source of the component.</p>
    #[doc(hidden)]
    pub source_detail: std::option::Option<crate::model::TrialComponentSourceDetail>,
    /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
    #[doc(hidden)]
    pub lineage_group_arn: std::option::Option<std::string::String>,
    /// <p>The list of tags that are associated with the component. You can use <code>Search</code> API to search on the tags.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>An array of the parents of the component. A parent is a trial the component is associated with and the experiment the trial is part of. A component might not have any parents.</p>
    #[doc(hidden)]
    pub parents: std::option::Option<std::vec::Vec<crate::model::Parent>>,
    /// <p>The name of the experiment run.</p>
    #[doc(hidden)]
    pub run_name: std::option::Option<std::string::String>,
}
impl TrialComponent {
    /// <p>The name of the trial component.</p>
    pub fn trial_component_name(&self) -> std::option::Option<&str> {
        self.trial_component_name.as_deref()
    }
    /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
    pub fn trial_component_arn(&self) -> std::option::Option<&str> {
        self.trial_component_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) and job type of the source of the component.</p>
    pub fn source(&self) -> std::option::Option<&crate::model::TrialComponentSource> {
        self.source.as_ref()
    }
    /// <p>The status of the trial component.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::TrialComponentStatus> {
        self.status.as_ref()
    }
    /// <p>When the component started.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>When the component ended.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
    /// <p>When the component was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Who created the trial component.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>When the component was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>The hyperparameters of the component.</p>
    pub fn parameters(
        &self,
    ) -> std::option::Option<
        &std::collections::HashMap<std::string::String, crate::model::TrialComponentParameterValue>,
    > {
        self.parameters.as_ref()
    }
    /// <p>The input artifacts of the component.</p>
    pub fn input_artifacts(
        &self,
    ) -> std::option::Option<
        &std::collections::HashMap<std::string::String, crate::model::TrialComponentArtifact>,
    > {
        self.input_artifacts.as_ref()
    }
    /// <p>The output artifacts of the component.</p>
    pub fn output_artifacts(
        &self,
    ) -> std::option::Option<
        &std::collections::HashMap<std::string::String, crate::model::TrialComponentArtifact>,
    > {
        self.output_artifacts.as_ref()
    }
    /// <p>The metrics for the component.</p>
    pub fn metrics(&self) -> std::option::Option<&[crate::model::TrialComponentMetricSummary]> {
        self.metrics.as_deref()
    }
    /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
    pub fn metadata_properties(&self) -> std::option::Option<&crate::model::MetadataProperties> {
        self.metadata_properties.as_ref()
    }
    /// <p>Details of the source of the component.</p>
    pub fn source_detail(&self) -> std::option::Option<&crate::model::TrialComponentSourceDetail> {
        self.source_detail.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
    pub fn lineage_group_arn(&self) -> std::option::Option<&str> {
        self.lineage_group_arn.as_deref()
    }
    /// <p>The list of tags that are associated with the component. You can use <code>Search</code> API to search on the tags.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>An array of the parents of the component. A parent is a trial the component is associated with and the experiment the trial is part of. A component might not have any parents.</p>
    pub fn parents(&self) -> std::option::Option<&[crate::model::Parent]> {
        self.parents.as_deref()
    }
    /// <p>The name of the experiment run.</p>
    pub fn run_name(&self) -> std::option::Option<&str> {
        self.run_name.as_deref()
    }
}
/// See [`TrialComponent`](crate::model::TrialComponent).
pub mod trial_component {

    /// A builder for [`TrialComponent`](crate::model::TrialComponent).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) trial_component_name: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) trial_component_arn: std::option::Option<std::string::String>,
        pub(crate) source: std::option::Option<crate::model::TrialComponentSource>,
        pub(crate) status: std::option::Option<crate::model::TrialComponentStatus>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) parameters: std::option::Option<
            std::collections::HashMap<
                std::string::String,
                crate::model::TrialComponentParameterValue,
            >,
        >,
        pub(crate) input_artifacts: std::option::Option<
            std::collections::HashMap<std::string::String, crate::model::TrialComponentArtifact>,
        >,
        pub(crate) output_artifacts: std::option::Option<
            std::collections::HashMap<std::string::String, crate::model::TrialComponentArtifact>,
        >,
        pub(crate) metrics:
            std::option::Option<std::vec::Vec<crate::model::TrialComponentMetricSummary>>,
        pub(crate) metadata_properties: std::option::Option<crate::model::MetadataProperties>,
        pub(crate) source_detail: std::option::Option<crate::model::TrialComponentSourceDetail>,
        pub(crate) lineage_group_arn: std::option::Option<std::string::String>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) parents: std::option::Option<std::vec::Vec<crate::model::Parent>>,
        pub(crate) run_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the trial component.</p>
        pub fn trial_component_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_component_name = Some(input.into());
            self
        }
        /// <p>The name of the trial component.</p>
        pub fn set_trial_component_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_name = input;
            self
        }
        /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
        pub fn trial_component_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_component_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
        pub fn set_trial_component_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) and job type of the source of the component.</p>
        pub fn source(mut self, input: crate::model::TrialComponentSource) -> Self {
            self.source = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) and job type of the source of the component.</p>
        pub fn set_source(
            mut self,
            input: std::option::Option<crate::model::TrialComponentSource>,
        ) -> Self {
            self.source = input;
            self
        }
        /// <p>The status of the trial component.</p>
        pub fn status(mut self, input: crate::model::TrialComponentStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the trial component.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::TrialComponentStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>When the component started.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>When the component started.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// <p>When the component ended.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>When the component ended.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// <p>When the component was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the component was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Who created the trial component.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Who created the trial component.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>When the component was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the component was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// Adds a key-value pair to `parameters`.
        ///
        /// To override the contents of this collection use [`set_parameters`](Self::set_parameters).
        ///
        /// <p>The hyperparameters of the component.</p>
        pub fn parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: crate::model::TrialComponentParameterValue,
        ) -> Self {
            let mut hash_map = self.parameters.unwrap_or_default();
            hash_map.insert(k.into(), v);
            self.parameters = Some(hash_map);
            self
        }
        /// <p>The hyperparameters of the component.</p>
        pub fn set_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<
                    std::string::String,
                    crate::model::TrialComponentParameterValue,
                >,
            >,
        ) -> Self {
            self.parameters = input;
            self
        }
        /// Adds a key-value pair to `input_artifacts`.
        ///
        /// To override the contents of this collection use [`set_input_artifacts`](Self::set_input_artifacts).
        ///
        /// <p>The input artifacts of the component.</p>
        pub fn input_artifacts(
            mut self,
            k: impl Into<std::string::String>,
            v: crate::model::TrialComponentArtifact,
        ) -> Self {
            let mut hash_map = self.input_artifacts.unwrap_or_default();
            hash_map.insert(k.into(), v);
            self.input_artifacts = Some(hash_map);
            self
        }
        /// <p>The input artifacts of the component.</p>
        pub fn set_input_artifacts(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<
                    std::string::String,
                    crate::model::TrialComponentArtifact,
                >,
            >,
        ) -> Self {
            self.input_artifacts = input;
            self
        }
        /// Adds a key-value pair to `output_artifacts`.
        ///
        /// To override the contents of this collection use [`set_output_artifacts`](Self::set_output_artifacts).
        ///
        /// <p>The output artifacts of the component.</p>
        pub fn output_artifacts(
            mut self,
            k: impl Into<std::string::String>,
            v: crate::model::TrialComponentArtifact,
        ) -> Self {
            let mut hash_map = self.output_artifacts.unwrap_or_default();
            hash_map.insert(k.into(), v);
            self.output_artifacts = Some(hash_map);
            self
        }
        /// <p>The output artifacts of the component.</p>
        pub fn set_output_artifacts(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<
                    std::string::String,
                    crate::model::TrialComponentArtifact,
                >,
            >,
        ) -> Self {
            self.output_artifacts = input;
            self
        }
        /// Appends an item to `metrics`.
        ///
        /// To override the contents of this collection use [`set_metrics`](Self::set_metrics).
        ///
        /// <p>The metrics for the component.</p>
        pub fn metrics(mut self, input: crate::model::TrialComponentMetricSummary) -> Self {
            let mut v = self.metrics.unwrap_or_default();
            v.push(input);
            self.metrics = Some(v);
            self
        }
        /// <p>The metrics for the component.</p>
        pub fn set_metrics(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::TrialComponentMetricSummary>>,
        ) -> Self {
            self.metrics = input;
            self
        }
        /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
        pub fn metadata_properties(mut self, input: crate::model::MetadataProperties) -> Self {
            self.metadata_properties = Some(input);
            self
        }
        /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
        pub fn set_metadata_properties(
            mut self,
            input: std::option::Option<crate::model::MetadataProperties>,
        ) -> Self {
            self.metadata_properties = input;
            self
        }
        /// <p>Details of the source of the component.</p>
        pub fn source_detail(mut self, input: crate::model::TrialComponentSourceDetail) -> Self {
            self.source_detail = Some(input);
            self
        }
        /// <p>Details of the source of the component.</p>
        pub fn set_source_detail(
            mut self,
            input: std::option::Option<crate::model::TrialComponentSourceDetail>,
        ) -> Self {
            self.source_detail = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
        pub fn lineage_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.lineage_group_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
        pub fn set_lineage_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.lineage_group_arn = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>The list of tags that are associated with the component. You can use <code>Search</code> API to search on the tags.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>The list of tags that are associated with the component. You can use <code>Search</code> API to search on the tags.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Appends an item to `parents`.
        ///
        /// To override the contents of this collection use [`set_parents`](Self::set_parents).
        ///
        /// <p>An array of the parents of the component. A parent is a trial the component is associated with and the experiment the trial is part of. A component might not have any parents.</p>
        pub fn parents(mut self, input: crate::model::Parent) -> Self {
            let mut v = self.parents.unwrap_or_default();
            v.push(input);
            self.parents = Some(v);
            self
        }
        /// <p>An array of the parents of the component. A parent is a trial the component is associated with and the experiment the trial is part of. A component might not have any parents.</p>
        pub fn set_parents(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Parent>>,
        ) -> Self {
            self.parents = input;
            self
        }
        /// <p>The name of the experiment run.</p>
        pub fn run_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.run_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment run.</p>
        pub fn set_run_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.run_name = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponent`](crate::model::TrialComponent).
        pub fn build(self) -> crate::model::TrialComponent {
            crate::model::TrialComponent {
                trial_component_name: self.trial_component_name,
                display_name: self.display_name,
                trial_component_arn: self.trial_component_arn,
                source: self.source,
                status: self.status,
                start_time: self.start_time,
                end_time: self.end_time,
                creation_time: self.creation_time,
                created_by: self.created_by,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
                parameters: self.parameters,
                input_artifacts: self.input_artifacts,
                output_artifacts: self.output_artifacts,
                metrics: self.metrics,
                metadata_properties: self.metadata_properties,
                source_detail: self.source_detail,
                lineage_group_arn: self.lineage_group_arn,
                tags: self.tags,
                parents: self.parents,
                run_name: self.run_name,
            }
        }
    }
}
impl TrialComponent {
    /// Creates a new builder-style object to manufacture [`TrialComponent`](crate::model::TrialComponent).
    pub fn builder() -> crate::model::trial_component::Builder {
        crate::model::trial_component::Builder::default()
    }
}

/// <p>The trial that a trial component is associated with and the experiment the trial is part of. A component might not be associated with a trial. A component can be associated with multiple trials.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Parent {
    /// <p>The name of the trial.</p>
    #[doc(hidden)]
    pub trial_name: std::option::Option<std::string::String>,
    /// <p>The name of the experiment.</p>
    #[doc(hidden)]
    pub experiment_name: std::option::Option<std::string::String>,
}
impl Parent {
    /// <p>The name of the trial.</p>
    pub fn trial_name(&self) -> std::option::Option<&str> {
        self.trial_name.as_deref()
    }
    /// <p>The name of the experiment.</p>
    pub fn experiment_name(&self) -> std::option::Option<&str> {
        self.experiment_name.as_deref()
    }
}
/// See [`Parent`](crate::model::Parent).
pub mod parent {

    /// A builder for [`Parent`](crate::model::Parent).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) trial_name: std::option::Option<std::string::String>,
        pub(crate) experiment_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the trial.</p>
        pub fn trial_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_name = Some(input.into());
            self
        }
        /// <p>The name of the trial.</p>
        pub fn set_trial_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_name = input;
            self
        }
        /// <p>The name of the experiment.</p>
        pub fn experiment_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment.</p>
        pub fn set_experiment_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_name = input;
            self
        }
        /// Consumes the builder and constructs a [`Parent`](crate::model::Parent).
        pub fn build(self) -> crate::model::Parent {
            crate::model::Parent {
                trial_name: self.trial_name,
                experiment_name: self.experiment_name,
            }
        }
    }
}
impl Parent {
    /// Creates a new builder-style object to manufacture [`Parent`](crate::model::Parent).
    pub fn builder() -> crate::model::parent::Builder {
        crate::model::parent::Builder::default()
    }
}

/// <p>Detailed information about the source of a trial component. Either <code>ProcessingJob</code> or <code>TrainingJob</code> is returned.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentSourceDetail {
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>Information about a training job that's the source of a trial component.</p>
    #[doc(hidden)]
    pub training_job: std::option::Option<crate::model::TrainingJob>,
    /// <p>Information about a processing job that's the source of a trial component.</p>
    #[doc(hidden)]
    pub processing_job: std::option::Option<crate::model::ProcessingJob>,
    /// <p>Information about a transform job that's the source of a trial component.</p>
    #[doc(hidden)]
    pub transform_job: std::option::Option<crate::model::TransformJob>,
}
impl TrialComponentSourceDetail {
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>Information about a training job that's the source of a trial component.</p>
    pub fn training_job(&self) -> std::option::Option<&crate::model::TrainingJob> {
        self.training_job.as_ref()
    }
    /// <p>Information about a processing job that's the source of a trial component.</p>
    pub fn processing_job(&self) -> std::option::Option<&crate::model::ProcessingJob> {
        self.processing_job.as_ref()
    }
    /// <p>Information about a transform job that's the source of a trial component.</p>
    pub fn transform_job(&self) -> std::option::Option<&crate::model::TransformJob> {
        self.transform_job.as_ref()
    }
}
/// See [`TrialComponentSourceDetail`](crate::model::TrialComponentSourceDetail).
pub mod trial_component_source_detail {

    /// A builder for [`TrialComponentSourceDetail`](crate::model::TrialComponentSourceDetail).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) training_job: std::option::Option<crate::model::TrainingJob>,
        pub(crate) processing_job: std::option::Option<crate::model::ProcessingJob>,
        pub(crate) transform_job: std::option::Option<crate::model::TransformJob>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>Information about a training job that's the source of a trial component.</p>
        pub fn training_job(mut self, input: crate::model::TrainingJob) -> Self {
            self.training_job = Some(input);
            self
        }
        /// <p>Information about a training job that's the source of a trial component.</p>
        pub fn set_training_job(
            mut self,
            input: std::option::Option<crate::model::TrainingJob>,
        ) -> Self {
            self.training_job = input;
            self
        }
        /// <p>Information about a processing job that's the source of a trial component.</p>
        pub fn processing_job(mut self, input: crate::model::ProcessingJob) -> Self {
            self.processing_job = Some(input);
            self
        }
        /// <p>Information about a processing job that's the source of a trial component.</p>
        pub fn set_processing_job(
            mut self,
            input: std::option::Option<crate::model::ProcessingJob>,
        ) -> Self {
            self.processing_job = input;
            self
        }
        /// <p>Information about a transform job that's the source of a trial component.</p>
        pub fn transform_job(mut self, input: crate::model::TransformJob) -> Self {
            self.transform_job = Some(input);
            self
        }
        /// <p>Information about a transform job that's the source of a trial component.</p>
        pub fn set_transform_job(
            mut self,
            input: std::option::Option<crate::model::TransformJob>,
        ) -> Self {
            self.transform_job = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentSourceDetail`](crate::model::TrialComponentSourceDetail).
        pub fn build(self) -> crate::model::TrialComponentSourceDetail {
            crate::model::TrialComponentSourceDetail {
                source_arn: self.source_arn,
                training_job: self.training_job,
                processing_job: self.processing_job,
                transform_job: self.transform_job,
            }
        }
    }
}
impl TrialComponentSourceDetail {
    /// Creates a new builder-style object to manufacture [`TrialComponentSourceDetail`](crate::model::TrialComponentSourceDetail).
    pub fn builder() -> crate::model::trial_component_source_detail::Builder {
        crate::model::trial_component_source_detail::Builder::default()
    }
}

/// <p>An Amazon SageMaker processing job that is used to analyze data and evaluate models. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/processing-job.html">Process Data and Evaluate Models</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingJob {
    /// <p>List of input configurations for the processing job.</p>
    #[doc(hidden)]
    pub processing_inputs: std::option::Option<std::vec::Vec<crate::model::ProcessingInput>>,
    /// <p>Configuration for uploading output from the processing container.</p>
    #[doc(hidden)]
    pub processing_output_config: std::option::Option<crate::model::ProcessingOutputConfig>,
    /// <p>The name of the processing job.</p>
    #[doc(hidden)]
    pub processing_job_name: std::option::Option<std::string::String>,
    /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a processing job. In distributed training, you specify more than one instance.</p>
    #[doc(hidden)]
    pub processing_resources: std::option::Option<crate::model::ProcessingResources>,
    /// <p>Configures conditions under which the processing job should be stopped, such as how long the processing job has been running. After the condition is met, the processing job is stopped.</p>
    #[doc(hidden)]
    pub stopping_condition: std::option::Option<crate::model::ProcessingStoppingCondition>,
    /// <p>Configuration to run a processing job in a specified container image.</p>
    #[doc(hidden)]
    pub app_specification: std::option::Option<crate::model::AppSpecification>,
    /// <p>Sets the environment variables in the Docker container.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.</p>
    #[doc(hidden)]
    pub network_config: std::option::Option<crate::model::NetworkConfig>,
    /// <p>The ARN of the role used to create the processing job.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
    /// <ul>
    /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
    /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
    /// <li> <p> <code>CreateTransformJob</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub experiment_config: std::option::Option<crate::model::ExperimentConfig>,
    /// <p>The ARN of the processing job.</p>
    #[doc(hidden)]
    pub processing_job_arn: std::option::Option<std::string::String>,
    /// <p>The status of the processing job.</p>
    #[doc(hidden)]
    pub processing_job_status: std::option::Option<crate::model::ProcessingJobStatus>,
    /// <p>A string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
    #[doc(hidden)]
    pub exit_message: std::option::Option<std::string::String>,
    /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The time that the processing job ended.</p>
    #[doc(hidden)]
    pub processing_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that the processing job started.</p>
    #[doc(hidden)]
    pub processing_start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time the processing job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time the processing job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The ARN of a monitoring schedule for an endpoint associated with this processing job.</p>
    #[doc(hidden)]
    pub monitoring_schedule_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the AutoML job associated with this processing job.</p>
    #[doc(hidden)]
    pub auto_ml_job_arn: std::option::Option<std::string::String>,
    /// <p>The ARN of the training job associated with this processing job.</p>
    #[doc(hidden)]
    pub training_job_arn: std::option::Option<std::string::String>,
    /// <p>An array of key-value pairs. For more information, see <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-whatURL">Using Cost Allocation Tags</a> in the <i>Amazon Web Services Billing and Cost Management User Guide</i>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl ProcessingJob {
    /// <p>List of input configurations for the processing job.</p>
    pub fn processing_inputs(&self) -> std::option::Option<&[crate::model::ProcessingInput]> {
        self.processing_inputs.as_deref()
    }
    /// <p>Configuration for uploading output from the processing container.</p>
    pub fn processing_output_config(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingOutputConfig> {
        self.processing_output_config.as_ref()
    }
    /// <p>The name of the processing job.</p>
    pub fn processing_job_name(&self) -> std::option::Option<&str> {
        self.processing_job_name.as_deref()
    }
    /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a processing job. In distributed training, you specify more than one instance.</p>
    pub fn processing_resources(&self) -> std::option::Option<&crate::model::ProcessingResources> {
        self.processing_resources.as_ref()
    }
    /// <p>Configures conditions under which the processing job should be stopped, such as how long the processing job has been running. After the condition is met, the processing job is stopped.</p>
    pub fn stopping_condition(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingStoppingCondition> {
        self.stopping_condition.as_ref()
    }
    /// <p>Configuration to run a processing job in a specified container image.</p>
    pub fn app_specification(&self) -> std::option::Option<&crate::model::AppSpecification> {
        self.app_specification.as_ref()
    }
    /// <p>Sets the environment variables in the Docker container.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.</p>
    pub fn network_config(&self) -> std::option::Option<&crate::model::NetworkConfig> {
        self.network_config.as_ref()
    }
    /// <p>The ARN of the role used to create the processing job.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
    /// <ul>
    /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
    /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
    /// <li> <p> <code>CreateTransformJob</code> </p> </li>
    /// </ul>
    pub fn experiment_config(&self) -> std::option::Option<&crate::model::ExperimentConfig> {
        self.experiment_config.as_ref()
    }
    /// <p>The ARN of the processing job.</p>
    pub fn processing_job_arn(&self) -> std::option::Option<&str> {
        self.processing_job_arn.as_deref()
    }
    /// <p>The status of the processing job.</p>
    pub fn processing_job_status(&self) -> std::option::Option<&crate::model::ProcessingJobStatus> {
        self.processing_job_status.as_ref()
    }
    /// <p>A string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
    pub fn exit_message(&self) -> std::option::Option<&str> {
        self.exit_message.as_deref()
    }
    /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The time that the processing job ended.</p>
    pub fn processing_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.processing_end_time.as_ref()
    }
    /// <p>The time that the processing job started.</p>
    pub fn processing_start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.processing_start_time.as_ref()
    }
    /// <p>The time the processing job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The time the processing job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The ARN of a monitoring schedule for an endpoint associated with this processing job.</p>
    pub fn monitoring_schedule_arn(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the AutoML job associated with this processing job.</p>
    pub fn auto_ml_job_arn(&self) -> std::option::Option<&str> {
        self.auto_ml_job_arn.as_deref()
    }
    /// <p>The ARN of the training job associated with this processing job.</p>
    pub fn training_job_arn(&self) -> std::option::Option<&str> {
        self.training_job_arn.as_deref()
    }
    /// <p>An array of key-value pairs. For more information, see <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-whatURL">Using Cost Allocation Tags</a> in the <i>Amazon Web Services Billing and Cost Management User Guide</i>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`ProcessingJob`](crate::model::ProcessingJob).
pub mod processing_job {

    /// A builder for [`ProcessingJob`](crate::model::ProcessingJob).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) processing_inputs:
            std::option::Option<std::vec::Vec<crate::model::ProcessingInput>>,
        pub(crate) processing_output_config:
            std::option::Option<crate::model::ProcessingOutputConfig>,
        pub(crate) processing_job_name: std::option::Option<std::string::String>,
        pub(crate) processing_resources: std::option::Option<crate::model::ProcessingResources>,
        pub(crate) stopping_condition:
            std::option::Option<crate::model::ProcessingStoppingCondition>,
        pub(crate) app_specification: std::option::Option<crate::model::AppSpecification>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) network_config: std::option::Option<crate::model::NetworkConfig>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) experiment_config: std::option::Option<crate::model::ExperimentConfig>,
        pub(crate) processing_job_arn: std::option::Option<std::string::String>,
        pub(crate) processing_job_status: std::option::Option<crate::model::ProcessingJobStatus>,
        pub(crate) exit_message: std::option::Option<std::string::String>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) processing_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) processing_start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) monitoring_schedule_arn: std::option::Option<std::string::String>,
        pub(crate) auto_ml_job_arn: std::option::Option<std::string::String>,
        pub(crate) training_job_arn: std::option::Option<std::string::String>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// Appends an item to `processing_inputs`.
        ///
        /// To override the contents of this collection use [`set_processing_inputs`](Self::set_processing_inputs).
        ///
        /// <p>List of input configurations for the processing job.</p>
        pub fn processing_inputs(mut self, input: crate::model::ProcessingInput) -> Self {
            let mut v = self.processing_inputs.unwrap_or_default();
            v.push(input);
            self.processing_inputs = Some(v);
            self
        }
        /// <p>List of input configurations for the processing job.</p>
        pub fn set_processing_inputs(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProcessingInput>>,
        ) -> Self {
            self.processing_inputs = input;
            self
        }
        /// <p>Configuration for uploading output from the processing container.</p>
        pub fn processing_output_config(
            mut self,
            input: crate::model::ProcessingOutputConfig,
        ) -> Self {
            self.processing_output_config = Some(input);
            self
        }
        /// <p>Configuration for uploading output from the processing container.</p>
        pub fn set_processing_output_config(
            mut self,
            input: std::option::Option<crate::model::ProcessingOutputConfig>,
        ) -> Self {
            self.processing_output_config = input;
            self
        }
        /// <p>The name of the processing job.</p>
        pub fn processing_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.processing_job_name = Some(input.into());
            self
        }
        /// <p>The name of the processing job.</p>
        pub fn set_processing_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.processing_job_name = input;
            self
        }
        /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a processing job. In distributed training, you specify more than one instance.</p>
        pub fn processing_resources(mut self, input: crate::model::ProcessingResources) -> Self {
            self.processing_resources = Some(input);
            self
        }
        /// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a processing job. In distributed training, you specify more than one instance.</p>
        pub fn set_processing_resources(
            mut self,
            input: std::option::Option<crate::model::ProcessingResources>,
        ) -> Self {
            self.processing_resources = input;
            self
        }
        /// <p>Configures conditions under which the processing job should be stopped, such as how long the processing job has been running. After the condition is met, the processing job is stopped.</p>
        pub fn stopping_condition(
            mut self,
            input: crate::model::ProcessingStoppingCondition,
        ) -> Self {
            self.stopping_condition = Some(input);
            self
        }
        /// <p>Configures conditions under which the processing job should be stopped, such as how long the processing job has been running. After the condition is met, the processing job is stopped.</p>
        pub fn set_stopping_condition(
            mut self,
            input: std::option::Option<crate::model::ProcessingStoppingCondition>,
        ) -> Self {
            self.stopping_condition = input;
            self
        }
        /// <p>Configuration to run a processing job in a specified container image.</p>
        pub fn app_specification(mut self, input: crate::model::AppSpecification) -> Self {
            self.app_specification = Some(input);
            self
        }
        /// <p>Configuration to run a processing job in a specified container image.</p>
        pub fn set_app_specification(
            mut self,
            input: std::option::Option<crate::model::AppSpecification>,
        ) -> Self {
            self.app_specification = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.</p>
        pub fn network_config(mut self, input: crate::model::NetworkConfig) -> Self {
            self.network_config = Some(input);
            self
        }
        /// <p>Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.</p>
        pub fn set_network_config(
            mut self,
            input: std::option::Option<crate::model::NetworkConfig>,
        ) -> Self {
            self.network_config = input;
            self
        }
        /// <p>The ARN of the role used to create the processing job.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the role used to create the processing job.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
        /// <ul>
        /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
        /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
        /// <li> <p> <code>CreateTransformJob</code> </p> </li>
        /// </ul>
        pub fn experiment_config(mut self, input: crate::model::ExperimentConfig) -> Self {
            self.experiment_config = Some(input);
            self
        }
        /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
        /// <ul>
        /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
        /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
        /// <li> <p> <code>CreateTransformJob</code> </p> </li>
        /// </ul>
        pub fn set_experiment_config(
            mut self,
            input: std::option::Option<crate::model::ExperimentConfig>,
        ) -> Self {
            self.experiment_config = input;
            self
        }
        /// <p>The ARN of the processing job.</p>
        pub fn processing_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.processing_job_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the processing job.</p>
        pub fn set_processing_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.processing_job_arn = input;
            self
        }
        /// <p>The status of the processing job.</p>
        pub fn processing_job_status(mut self, input: crate::model::ProcessingJobStatus) -> Self {
            self.processing_job_status = Some(input);
            self
        }
        /// <p>The status of the processing job.</p>
        pub fn set_processing_job_status(
            mut self,
            input: std::option::Option<crate::model::ProcessingJobStatus>,
        ) -> Self {
            self.processing_job_status = input;
            self
        }
        /// <p>A string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
        pub fn exit_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.exit_message = Some(input.into());
            self
        }
        /// <p>A string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
        pub fn set_exit_message(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.exit_message = input;
            self
        }
        /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The time that the processing job ended.</p>
        pub fn processing_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.processing_end_time = Some(input);
            self
        }
        /// <p>The time that the processing job ended.</p>
        pub fn set_processing_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.processing_end_time = input;
            self
        }
        /// <p>The time that the processing job started.</p>
        pub fn processing_start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.processing_start_time = Some(input);
            self
        }
        /// <p>The time that the processing job started.</p>
        pub fn set_processing_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.processing_start_time = input;
            self
        }
        /// <p>The time the processing job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time the processing job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The time the processing job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time the processing job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The ARN of a monitoring schedule for an endpoint associated with this processing job.</p>
        pub fn monitoring_schedule_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_arn = Some(input.into());
            self
        }
        /// <p>The ARN of a monitoring schedule for an endpoint associated with this processing job.</p>
        pub fn set_monitoring_schedule_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job associated with this processing job.</p>
        pub fn auto_ml_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.auto_ml_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job associated with this processing job.</p>
        pub fn set_auto_ml_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.auto_ml_job_arn = input;
            self
        }
        /// <p>The ARN of the training job associated with this processing job.</p>
        pub fn training_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the training job associated with this processing job.</p>
        pub fn set_training_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_arn = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>An array of key-value pairs. For more information, see <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-whatURL">Using Cost Allocation Tags</a> in the <i>Amazon Web Services Billing and Cost Management User Guide</i>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>An array of key-value pairs. For more information, see <a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-whatURL">Using Cost Allocation Tags</a> in the <i>Amazon Web Services Billing and Cost Management User Guide</i>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingJob`](crate::model::ProcessingJob).
        pub fn build(self) -> crate::model::ProcessingJob {
            crate::model::ProcessingJob {
                processing_inputs: self.processing_inputs,
                processing_output_config: self.processing_output_config,
                processing_job_name: self.processing_job_name,
                processing_resources: self.processing_resources,
                stopping_condition: self.stopping_condition,
                app_specification: self.app_specification,
                environment: self.environment,
                network_config: self.network_config,
                role_arn: self.role_arn,
                experiment_config: self.experiment_config,
                processing_job_arn: self.processing_job_arn,
                processing_job_status: self.processing_job_status,
                exit_message: self.exit_message,
                failure_reason: self.failure_reason,
                processing_end_time: self.processing_end_time,
                processing_start_time: self.processing_start_time,
                last_modified_time: self.last_modified_time,
                creation_time: self.creation_time,
                monitoring_schedule_arn: self.monitoring_schedule_arn,
                auto_ml_job_arn: self.auto_ml_job_arn,
                training_job_arn: self.training_job_arn,
                tags: self.tags,
            }
        }
    }
}
impl ProcessingJob {
    /// Creates a new builder-style object to manufacture [`ProcessingJob`](crate::model::ProcessingJob).
    pub fn builder() -> crate::model::processing_job::Builder {
        crate::model::processing_job::Builder::default()
    }
}

/// When writing a match expression against `ProcessingJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processingjobstatus = unimplemented!();
/// match processingjobstatus {
///     ProcessingJobStatus::Completed => { /* ... */ },
///     ProcessingJobStatus::Failed => { /* ... */ },
///     ProcessingJobStatus::InProgress => { /* ... */ },
///     ProcessingJobStatus::Stopped => { /* ... */ },
///     ProcessingJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processingjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingJobStatus::NewFeature` is defined.
/// Specifically, when `processingjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => ProcessingJobStatus::Completed,
            "Failed" => ProcessingJobStatus::Failed,
            "InProgress" => ProcessingJobStatus::InProgress,
            "Stopped" => ProcessingJobStatus::Stopped,
            "Stopping" => ProcessingJobStatus::Stopping,
            other => {
                ProcessingJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ProcessingJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingJobStatus::from(s))
    }
}
impl ProcessingJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingJobStatus::Completed => "Completed",
            ProcessingJobStatus::Failed => "Failed",
            ProcessingJobStatus::InProgress => "InProgress",
            ProcessingJobStatus::Stopped => "Stopped",
            ProcessingJobStatus::Stopping => "Stopping",
            ProcessingJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for ProcessingJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration to run a processing job in a specified container image.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AppSpecification {
    /// <p>The container image to be run by the processing job.</p>
    #[doc(hidden)]
    pub image_uri: std::option::Option<std::string::String>,
    /// <p>The entrypoint for a container used to run a processing job.</p>
    #[doc(hidden)]
    pub container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The arguments for a container used to run a processing job.</p>
    #[doc(hidden)]
    pub container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl AppSpecification {
    /// <p>The container image to be run by the processing job.</p>
    pub fn image_uri(&self) -> std::option::Option<&str> {
        self.image_uri.as_deref()
    }
    /// <p>The entrypoint for a container used to run a processing job.</p>
    pub fn container_entrypoint(&self) -> std::option::Option<&[std::string::String]> {
        self.container_entrypoint.as_deref()
    }
    /// <p>The arguments for a container used to run a processing job.</p>
    pub fn container_arguments(&self) -> std::option::Option<&[std::string::String]> {
        self.container_arguments.as_deref()
    }
}
/// See [`AppSpecification`](crate::model::AppSpecification).
pub mod app_specification {

    /// A builder for [`AppSpecification`](crate::model::AppSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_uri: std::option::Option<std::string::String>,
        pub(crate) container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The container image to be run by the processing job.</p>
        pub fn image_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_uri = Some(input.into());
            self
        }
        /// <p>The container image to be run by the processing job.</p>
        pub fn set_image_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_uri = input;
            self
        }
        /// Appends an item to `container_entrypoint`.
        ///
        /// To override the contents of this collection use [`set_container_entrypoint`](Self::set_container_entrypoint).
        ///
        /// <p>The entrypoint for a container used to run a processing job.</p>
        pub fn container_entrypoint(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_entrypoint.unwrap_or_default();
            v.push(input.into());
            self.container_entrypoint = Some(v);
            self
        }
        /// <p>The entrypoint for a container used to run a processing job.</p>
        pub fn set_container_entrypoint(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_entrypoint = input;
            self
        }
        /// Appends an item to `container_arguments`.
        ///
        /// To override the contents of this collection use [`set_container_arguments`](Self::set_container_arguments).
        ///
        /// <p>The arguments for a container used to run a processing job.</p>
        pub fn container_arguments(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_arguments.unwrap_or_default();
            v.push(input.into());
            self.container_arguments = Some(v);
            self
        }
        /// <p>The arguments for a container used to run a processing job.</p>
        pub fn set_container_arguments(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_arguments = input;
            self
        }
        /// Consumes the builder and constructs a [`AppSpecification`](crate::model::AppSpecification).
        pub fn build(self) -> crate::model::AppSpecification {
            crate::model::AppSpecification {
                image_uri: self.image_uri,
                container_entrypoint: self.container_entrypoint,
                container_arguments: self.container_arguments,
            }
        }
    }
}
impl AppSpecification {
    /// Creates a new builder-style object to manufacture [`AppSpecification`](crate::model::AppSpecification).
    pub fn builder() -> crate::model::app_specification::Builder {
        crate::model::app_specification::Builder::default()
    }
}

/// <p>Configures conditions under which the processing job should be stopped, such as how long the processing job has been running. After the condition is met, the processing job is stopped.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingStoppingCondition {
    /// <p>Specifies the maximum runtime in seconds.</p>
    #[doc(hidden)]
    pub max_runtime_in_seconds: i32,
}
impl ProcessingStoppingCondition {
    /// <p>Specifies the maximum runtime in seconds.</p>
    pub fn max_runtime_in_seconds(&self) -> i32 {
        self.max_runtime_in_seconds
    }
}
/// See [`ProcessingStoppingCondition`](crate::model::ProcessingStoppingCondition).
pub mod processing_stopping_condition {

    /// A builder for [`ProcessingStoppingCondition`](crate::model::ProcessingStoppingCondition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_runtime_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Specifies the maximum runtime in seconds.</p>
        pub fn max_runtime_in_seconds(mut self, input: i32) -> Self {
            self.max_runtime_in_seconds = Some(input);
            self
        }
        /// <p>Specifies the maximum runtime in seconds.</p>
        pub fn set_max_runtime_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.max_runtime_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingStoppingCondition`](crate::model::ProcessingStoppingCondition).
        pub fn build(self) -> crate::model::ProcessingStoppingCondition {
            crate::model::ProcessingStoppingCondition {
                max_runtime_in_seconds: self.max_runtime_in_seconds.unwrap_or_default(),
            }
        }
    }
}
impl ProcessingStoppingCondition {
    /// Creates a new builder-style object to manufacture [`ProcessingStoppingCondition`](crate::model::ProcessingStoppingCondition).
    pub fn builder() -> crate::model::processing_stopping_condition::Builder {
        crate::model::processing_stopping_condition::Builder::default()
    }
}

/// <p>Identifies the resources, ML compute instances, and ML storage volumes to deploy for a processing job. In distributed training, you specify more than one instance.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingResources {
    /// <p>The configuration for the resources in a cluster used to run the processing job.</p>
    #[doc(hidden)]
    pub cluster_config: std::option::Option<crate::model::ProcessingClusterConfig>,
}
impl ProcessingResources {
    /// <p>The configuration for the resources in a cluster used to run the processing job.</p>
    pub fn cluster_config(&self) -> std::option::Option<&crate::model::ProcessingClusterConfig> {
        self.cluster_config.as_ref()
    }
}
/// See [`ProcessingResources`](crate::model::ProcessingResources).
pub mod processing_resources {

    /// A builder for [`ProcessingResources`](crate::model::ProcessingResources).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cluster_config: std::option::Option<crate::model::ProcessingClusterConfig>,
    }
    impl Builder {
        /// <p>The configuration for the resources in a cluster used to run the processing job.</p>
        pub fn cluster_config(mut self, input: crate::model::ProcessingClusterConfig) -> Self {
            self.cluster_config = Some(input);
            self
        }
        /// <p>The configuration for the resources in a cluster used to run the processing job.</p>
        pub fn set_cluster_config(
            mut self,
            input: std::option::Option<crate::model::ProcessingClusterConfig>,
        ) -> Self {
            self.cluster_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingResources`](crate::model::ProcessingResources).
        pub fn build(self) -> crate::model::ProcessingResources {
            crate::model::ProcessingResources {
                cluster_config: self.cluster_config,
            }
        }
    }
}
impl ProcessingResources {
    /// Creates a new builder-style object to manufacture [`ProcessingResources`](crate::model::ProcessingResources).
    pub fn builder() -> crate::model::processing_resources::Builder {
        crate::model::processing_resources::Builder::default()
    }
}

/// <p>Configuration for the cluster used to run a processing job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingClusterConfig {
    /// <p>The number of ML compute instances to use in the processing job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
    #[doc(hidden)]
    pub instance_count: std::option::Option<i32>,
    /// <p>The ML compute instance type for the processing job.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
    /// <p>The size of the ML storage volume in gigabytes that you want to provision. You must specify sufficient ML storage for your scenario.</p> <note>
    /// <p>Certain Nitro-based instances include local storage with a fixed total size, dependent on the instance type. When using these instances for processing, Amazon SageMaker mounts the local instance storage instead of Amazon EBS gp2 storage. You can't request a <code>VolumeSizeInGB</code> greater than the total size of the local instance storage.</p>
    /// <p>For a list of instance types that support local instance storage, including the total size per instance type, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// </note>
    #[doc(hidden)]
    pub volume_size_in_gb: std::option::Option<i32>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the processing job. </p> <note>
    /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
    /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
    /// </note>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
}
impl ProcessingClusterConfig {
    /// <p>The number of ML compute instances to use in the processing job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
    pub fn instance_count(&self) -> std::option::Option<i32> {
        self.instance_count
    }
    /// <p>The ML compute instance type for the processing job.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::ProcessingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The size of the ML storage volume in gigabytes that you want to provision. You must specify sufficient ML storage for your scenario.</p> <note>
    /// <p>Certain Nitro-based instances include local storage with a fixed total size, dependent on the instance type. When using these instances for processing, Amazon SageMaker mounts the local instance storage instead of Amazon EBS gp2 storage. You can't request a <code>VolumeSizeInGB</code> greater than the total size of the local instance storage.</p>
    /// <p>For a list of instance types that support local instance storage, including the total size per instance type, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// </note>
    pub fn volume_size_in_gb(&self) -> std::option::Option<i32> {
        self.volume_size_in_gb
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the processing job. </p> <note>
    /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
    /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
    /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
    /// </note>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
}
/// See [`ProcessingClusterConfig`](crate::model::ProcessingClusterConfig).
pub mod processing_cluster_config {

    /// A builder for [`ProcessingClusterConfig`](crate::model::ProcessingClusterConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_count: std::option::Option<i32>,
        pub(crate) instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The number of ML compute instances to use in the processing job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
        pub fn instance_count(mut self, input: i32) -> Self {
            self.instance_count = Some(input);
            self
        }
        /// <p>The number of ML compute instances to use in the processing job. For distributed processing jobs, specify a value greater than 1. The default value is 1.</p>
        pub fn set_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.instance_count = input;
            self
        }
        /// <p>The ML compute instance type for the processing job.</p>
        pub fn instance_type(mut self, input: crate::model::ProcessingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The ML compute instance type for the processing job.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The size of the ML storage volume in gigabytes that you want to provision. You must specify sufficient ML storage for your scenario.</p> <note>
        /// <p>Certain Nitro-based instances include local storage with a fixed total size, dependent on the instance type. When using these instances for processing, Amazon SageMaker mounts the local instance storage instead of Amazon EBS gp2 storage. You can't request a <code>VolumeSizeInGB</code> greater than the total size of the local instance storage.</p>
        /// <p>For a list of instance types that support local instance storage, including the total size per instance type, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// </note>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The size of the ML storage volume in gigabytes that you want to provision. You must specify sufficient ML storage for your scenario.</p> <note>
        /// <p>Certain Nitro-based instances include local storage with a fixed total size, dependent on the instance type. When using these instances for processing, Amazon SageMaker mounts the local instance storage instead of Amazon EBS gp2 storage. You can't request a <code>VolumeSizeInGB</code> greater than the total size of the local instance storage.</p>
        /// <p>For a list of instance types that support local instance storage, including the total size per instance type, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// </note>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the processing job. </p> <note>
        /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
        /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
        /// </note>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the processing job. </p> <note>
        /// <p>Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can't request a <code>VolumeKmsKeyId</code> when using an instance type with local storage.</p>
        /// <p>For a list of instance types that support local instance storage, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes">Instance Store Volumes</a>.</p>
        /// <p>For more information about local instance storage encryption, see <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html">SSD Instance Store Volumes</a>.</p>
        /// </note>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingClusterConfig`](crate::model::ProcessingClusterConfig).
        pub fn build(self) -> crate::model::ProcessingClusterConfig {
            crate::model::ProcessingClusterConfig {
                instance_count: self.instance_count,
                instance_type: self.instance_type,
                volume_size_in_gb: self.volume_size_in_gb,
                volume_kms_key_id: self.volume_kms_key_id,
            }
        }
    }
}
impl ProcessingClusterConfig {
    /// Creates a new builder-style object to manufacture [`ProcessingClusterConfig`](crate::model::ProcessingClusterConfig).
    pub fn builder() -> crate::model::processing_cluster_config::Builder {
        crate::model::processing_cluster_config::Builder::default()
    }
}

/// <p>Configuration for uploading output from the processing container.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingOutputConfig {
    /// <p>An array of outputs configuring the data to upload from the processing container.</p>
    #[doc(hidden)]
    pub outputs: std::option::Option<std::vec::Vec<crate::model::ProcessingOutput>>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the processing job output. <code>KmsKeyId</code> can be an ID of a KMS key, ARN of a KMS key, alias of a KMS key, or alias of a KMS key. The <code>KmsKeyId</code> is applied to all outputs.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl ProcessingOutputConfig {
    /// <p>An array of outputs configuring the data to upload from the processing container.</p>
    pub fn outputs(&self) -> std::option::Option<&[crate::model::ProcessingOutput]> {
        self.outputs.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the processing job output. <code>KmsKeyId</code> can be an ID of a KMS key, ARN of a KMS key, alias of a KMS key, or alias of a KMS key. The <code>KmsKeyId</code> is applied to all outputs.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`ProcessingOutputConfig`](crate::model::ProcessingOutputConfig).
pub mod processing_output_config {

    /// A builder for [`ProcessingOutputConfig`](crate::model::ProcessingOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) outputs: std::option::Option<std::vec::Vec<crate::model::ProcessingOutput>>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// Appends an item to `outputs`.
        ///
        /// To override the contents of this collection use [`set_outputs`](Self::set_outputs).
        ///
        /// <p>An array of outputs configuring the data to upload from the processing container.</p>
        pub fn outputs(mut self, input: crate::model::ProcessingOutput) -> Self {
            let mut v = self.outputs.unwrap_or_default();
            v.push(input);
            self.outputs = Some(v);
            self
        }
        /// <p>An array of outputs configuring the data to upload from the processing container.</p>
        pub fn set_outputs(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProcessingOutput>>,
        ) -> Self {
            self.outputs = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the processing job output. <code>KmsKeyId</code> can be an ID of a KMS key, ARN of a KMS key, alias of a KMS key, or alias of a KMS key. The <code>KmsKeyId</code> is applied to all outputs.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt the processing job output. <code>KmsKeyId</code> can be an ID of a KMS key, ARN of a KMS key, alias of a KMS key, or alias of a KMS key. The <code>KmsKeyId</code> is applied to all outputs.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingOutputConfig`](crate::model::ProcessingOutputConfig).
        pub fn build(self) -> crate::model::ProcessingOutputConfig {
            crate::model::ProcessingOutputConfig {
                outputs: self.outputs,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl ProcessingOutputConfig {
    /// Creates a new builder-style object to manufacture [`ProcessingOutputConfig`](crate::model::ProcessingOutputConfig).
    pub fn builder() -> crate::model::processing_output_config::Builder {
        crate::model::processing_output_config::Builder::default()
    }
}

/// <p>Describes the results of a processing job. The processing output must specify exactly one of either <code>S3Output</code> or <code>FeatureStoreOutput</code> types.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingOutput {
    /// <p>The name for the processing job output.</p>
    #[doc(hidden)]
    pub output_name: std::option::Option<std::string::String>,
    /// <p>Configuration for processing job outputs in Amazon S3.</p>
    #[doc(hidden)]
    pub s3_output: std::option::Option<crate::model::ProcessingS3Output>,
    /// <p>Configuration for processing job outputs in Amazon SageMaker Feature Store. This processing output type is only supported when <code>AppManaged</code> is specified. </p>
    #[doc(hidden)]
    pub feature_store_output: std::option::Option<crate::model::ProcessingFeatureStoreOutput>,
    /// <p>When <code>True</code>, output operations such as data upload are managed natively by the processing job application. When <code>False</code> (default), output operations are managed by Amazon SageMaker.</p>
    #[doc(hidden)]
    pub app_managed: bool,
}
impl ProcessingOutput {
    /// <p>The name for the processing job output.</p>
    pub fn output_name(&self) -> std::option::Option<&str> {
        self.output_name.as_deref()
    }
    /// <p>Configuration for processing job outputs in Amazon S3.</p>
    pub fn s3_output(&self) -> std::option::Option<&crate::model::ProcessingS3Output> {
        self.s3_output.as_ref()
    }
    /// <p>Configuration for processing job outputs in Amazon SageMaker Feature Store. This processing output type is only supported when <code>AppManaged</code> is specified. </p>
    pub fn feature_store_output(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingFeatureStoreOutput> {
        self.feature_store_output.as_ref()
    }
    /// <p>When <code>True</code>, output operations such as data upload are managed natively by the processing job application. When <code>False</code> (default), output operations are managed by Amazon SageMaker.</p>
    pub fn app_managed(&self) -> bool {
        self.app_managed
    }
}
/// See [`ProcessingOutput`](crate::model::ProcessingOutput).
pub mod processing_output {

    /// A builder for [`ProcessingOutput`](crate::model::ProcessingOutput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) output_name: std::option::Option<std::string::String>,
        pub(crate) s3_output: std::option::Option<crate::model::ProcessingS3Output>,
        pub(crate) feature_store_output:
            std::option::Option<crate::model::ProcessingFeatureStoreOutput>,
        pub(crate) app_managed: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>The name for the processing job output.</p>
        pub fn output_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.output_name = Some(input.into());
            self
        }
        /// <p>The name for the processing job output.</p>
        pub fn set_output_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.output_name = input;
            self
        }
        /// <p>Configuration for processing job outputs in Amazon S3.</p>
        pub fn s3_output(mut self, input: crate::model::ProcessingS3Output) -> Self {
            self.s3_output = Some(input);
            self
        }
        /// <p>Configuration for processing job outputs in Amazon S3.</p>
        pub fn set_s3_output(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3Output>,
        ) -> Self {
            self.s3_output = input;
            self
        }
        /// <p>Configuration for processing job outputs in Amazon SageMaker Feature Store. This processing output type is only supported when <code>AppManaged</code> is specified. </p>
        pub fn feature_store_output(
            mut self,
            input: crate::model::ProcessingFeatureStoreOutput,
        ) -> Self {
            self.feature_store_output = Some(input);
            self
        }
        /// <p>Configuration for processing job outputs in Amazon SageMaker Feature Store. This processing output type is only supported when <code>AppManaged</code> is specified. </p>
        pub fn set_feature_store_output(
            mut self,
            input: std::option::Option<crate::model::ProcessingFeatureStoreOutput>,
        ) -> Self {
            self.feature_store_output = input;
            self
        }
        /// <p>When <code>True</code>, output operations such as data upload are managed natively by the processing job application. When <code>False</code> (default), output operations are managed by Amazon SageMaker.</p>
        pub fn app_managed(mut self, input: bool) -> Self {
            self.app_managed = Some(input);
            self
        }
        /// <p>When <code>True</code>, output operations such as data upload are managed natively by the processing job application. When <code>False</code> (default), output operations are managed by Amazon SageMaker.</p>
        pub fn set_app_managed(mut self, input: std::option::Option<bool>) -> Self {
            self.app_managed = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingOutput`](crate::model::ProcessingOutput).
        pub fn build(self) -> crate::model::ProcessingOutput {
            crate::model::ProcessingOutput {
                output_name: self.output_name,
                s3_output: self.s3_output,
                feature_store_output: self.feature_store_output,
                app_managed: self.app_managed.unwrap_or_default(),
            }
        }
    }
}
impl ProcessingOutput {
    /// Creates a new builder-style object to manufacture [`ProcessingOutput`](crate::model::ProcessingOutput).
    pub fn builder() -> crate::model::processing_output::Builder {
        crate::model::processing_output::Builder::default()
    }
}

/// <p>Configuration for processing job outputs in Amazon SageMaker Feature Store.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingFeatureStoreOutput {
    /// <p>The name of the Amazon SageMaker FeatureGroup to use as the destination for processing job output. Note that your processing script is responsible for putting records into your Feature Store.</p>
    #[doc(hidden)]
    pub feature_group_name: std::option::Option<std::string::String>,
}
impl ProcessingFeatureStoreOutput {
    /// <p>The name of the Amazon SageMaker FeatureGroup to use as the destination for processing job output. Note that your processing script is responsible for putting records into your Feature Store.</p>
    pub fn feature_group_name(&self) -> std::option::Option<&str> {
        self.feature_group_name.as_deref()
    }
}
/// See [`ProcessingFeatureStoreOutput`](crate::model::ProcessingFeatureStoreOutput).
pub mod processing_feature_store_output {

    /// A builder for [`ProcessingFeatureStoreOutput`](crate::model::ProcessingFeatureStoreOutput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) feature_group_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the Amazon SageMaker FeatureGroup to use as the destination for processing job output. Note that your processing script is responsible for putting records into your Feature Store.</p>
        pub fn feature_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_name = Some(input.into());
            self
        }
        /// <p>The name of the Amazon SageMaker FeatureGroup to use as the destination for processing job output. Note that your processing script is responsible for putting records into your Feature Store.</p>
        pub fn set_feature_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_name = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingFeatureStoreOutput`](crate::model::ProcessingFeatureStoreOutput).
        pub fn build(self) -> crate::model::ProcessingFeatureStoreOutput {
            crate::model::ProcessingFeatureStoreOutput {
                feature_group_name: self.feature_group_name,
            }
        }
    }
}
impl ProcessingFeatureStoreOutput {
    /// Creates a new builder-style object to manufacture [`ProcessingFeatureStoreOutput`](crate::model::ProcessingFeatureStoreOutput).
    pub fn builder() -> crate::model::processing_feature_store_output::Builder {
        crate::model::processing_feature_store_output::Builder::default()
    }
}

/// <p>Configuration for uploading output data to Amazon S3 from the processing container.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingS3Output {
    /// <p>A URI that identifies the Amazon S3 bucket where you want Amazon SageMaker to save the results of a processing job.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>The local path of a directory where you want Amazon SageMaker to upload its contents to Amazon S3. <code>LocalPath</code> is an absolute path to a directory containing output files. This directory will be created by the platform and exist when your container's entrypoint is invoked.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Whether to upload the results of the processing job continuously or after the job completes.</p>
    #[doc(hidden)]
    pub s3_upload_mode: std::option::Option<crate::model::ProcessingS3UploadMode>,
}
impl ProcessingS3Output {
    /// <p>A URI that identifies the Amazon S3 bucket where you want Amazon SageMaker to save the results of a processing job.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>The local path of a directory where you want Amazon SageMaker to upload its contents to Amazon S3. <code>LocalPath</code> is an absolute path to a directory containing output files. This directory will be created by the platform and exist when your container's entrypoint is invoked.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Whether to upload the results of the processing job continuously or after the job completes.</p>
    pub fn s3_upload_mode(&self) -> std::option::Option<&crate::model::ProcessingS3UploadMode> {
        self.s3_upload_mode.as_ref()
    }
}
/// See [`ProcessingS3Output`](crate::model::ProcessingS3Output).
pub mod processing_s3_output {

    /// A builder for [`ProcessingS3Output`](crate::model::ProcessingS3Output).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_upload_mode: std::option::Option<crate::model::ProcessingS3UploadMode>,
    }
    impl Builder {
        /// <p>A URI that identifies the Amazon S3 bucket where you want Amazon SageMaker to save the results of a processing job.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>A URI that identifies the Amazon S3 bucket where you want Amazon SageMaker to save the results of a processing job.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>The local path of a directory where you want Amazon SageMaker to upload its contents to Amazon S3. <code>LocalPath</code> is an absolute path to a directory containing output files. This directory will be created by the platform and exist when your container's entrypoint is invoked.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>The local path of a directory where you want Amazon SageMaker to upload its contents to Amazon S3. <code>LocalPath</code> is an absolute path to a directory containing output files. This directory will be created by the platform and exist when your container's entrypoint is invoked.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Whether to upload the results of the processing job continuously or after the job completes.</p>
        pub fn s3_upload_mode(mut self, input: crate::model::ProcessingS3UploadMode) -> Self {
            self.s3_upload_mode = Some(input);
            self
        }
        /// <p>Whether to upload the results of the processing job continuously or after the job completes.</p>
        pub fn set_s3_upload_mode(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3UploadMode>,
        ) -> Self {
            self.s3_upload_mode = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingS3Output`](crate::model::ProcessingS3Output).
        pub fn build(self) -> crate::model::ProcessingS3Output {
            crate::model::ProcessingS3Output {
                s3_uri: self.s3_uri,
                local_path: self.local_path,
                s3_upload_mode: self.s3_upload_mode,
            }
        }
    }
}
impl ProcessingS3Output {
    /// Creates a new builder-style object to manufacture [`ProcessingS3Output`](crate::model::ProcessingS3Output).
    pub fn builder() -> crate::model::processing_s3_output::Builder {
        crate::model::processing_s3_output::Builder::default()
    }
}

/// <p>The inputs for a processing job. The processing input must specify exactly one of either <code>S3Input</code> or <code>DatasetDefinition</code> types.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingInput {
    /// <p>The name for the processing job input.</p>
    #[doc(hidden)]
    pub input_name: std::option::Option<std::string::String>,
    /// <p>When <code>True</code>, input operations such as data download are managed natively by the processing job application. When <code>False</code> (default), input operations are managed by Amazon SageMaker.</p>
    #[doc(hidden)]
    pub app_managed: bool,
    /// <p>Configuration for downloading input data from Amazon S3 into the processing container.</p>
    #[doc(hidden)]
    pub s3_input: std::option::Option<crate::model::ProcessingS3Input>,
    /// <p>Configuration for a Dataset Definition input. </p>
    #[doc(hidden)]
    pub dataset_definition: std::option::Option<crate::model::DatasetDefinition>,
}
impl ProcessingInput {
    /// <p>The name for the processing job input.</p>
    pub fn input_name(&self) -> std::option::Option<&str> {
        self.input_name.as_deref()
    }
    /// <p>When <code>True</code>, input operations such as data download are managed natively by the processing job application. When <code>False</code> (default), input operations are managed by Amazon SageMaker.</p>
    pub fn app_managed(&self) -> bool {
        self.app_managed
    }
    /// <p>Configuration for downloading input data from Amazon S3 into the processing container.</p>
    pub fn s3_input(&self) -> std::option::Option<&crate::model::ProcessingS3Input> {
        self.s3_input.as_ref()
    }
    /// <p>Configuration for a Dataset Definition input. </p>
    pub fn dataset_definition(&self) -> std::option::Option<&crate::model::DatasetDefinition> {
        self.dataset_definition.as_ref()
    }
}
/// See [`ProcessingInput`](crate::model::ProcessingInput).
pub mod processing_input {

    /// A builder for [`ProcessingInput`](crate::model::ProcessingInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) input_name: std::option::Option<std::string::String>,
        pub(crate) app_managed: std::option::Option<bool>,
        pub(crate) s3_input: std::option::Option<crate::model::ProcessingS3Input>,
        pub(crate) dataset_definition: std::option::Option<crate::model::DatasetDefinition>,
    }
    impl Builder {
        /// <p>The name for the processing job input.</p>
        pub fn input_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.input_name = Some(input.into());
            self
        }
        /// <p>The name for the processing job input.</p>
        pub fn set_input_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.input_name = input;
            self
        }
        /// <p>When <code>True</code>, input operations such as data download are managed natively by the processing job application. When <code>False</code> (default), input operations are managed by Amazon SageMaker.</p>
        pub fn app_managed(mut self, input: bool) -> Self {
            self.app_managed = Some(input);
            self
        }
        /// <p>When <code>True</code>, input operations such as data download are managed natively by the processing job application. When <code>False</code> (default), input operations are managed by Amazon SageMaker.</p>
        pub fn set_app_managed(mut self, input: std::option::Option<bool>) -> Self {
            self.app_managed = input;
            self
        }
        /// <p>Configuration for downloading input data from Amazon S3 into the processing container.</p>
        pub fn s3_input(mut self, input: crate::model::ProcessingS3Input) -> Self {
            self.s3_input = Some(input);
            self
        }
        /// <p>Configuration for downloading input data from Amazon S3 into the processing container.</p>
        pub fn set_s3_input(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3Input>,
        ) -> Self {
            self.s3_input = input;
            self
        }
        /// <p>Configuration for a Dataset Definition input. </p>
        pub fn dataset_definition(mut self, input: crate::model::DatasetDefinition) -> Self {
            self.dataset_definition = Some(input);
            self
        }
        /// <p>Configuration for a Dataset Definition input. </p>
        pub fn set_dataset_definition(
            mut self,
            input: std::option::Option<crate::model::DatasetDefinition>,
        ) -> Self {
            self.dataset_definition = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingInput`](crate::model::ProcessingInput).
        pub fn build(self) -> crate::model::ProcessingInput {
            crate::model::ProcessingInput {
                input_name: self.input_name,
                app_managed: self.app_managed.unwrap_or_default(),
                s3_input: self.s3_input,
                dataset_definition: self.dataset_definition,
            }
        }
    }
}
impl ProcessingInput {
    /// Creates a new builder-style object to manufacture [`ProcessingInput`](crate::model::ProcessingInput).
    pub fn builder() -> crate::model::processing_input::Builder {
        crate::model::processing_input::Builder::default()
    }
}

/// <p>Configuration for Dataset Definition inputs. The Dataset Definition input must specify exactly one of either <code>AthenaDatasetDefinition</code> or <code>RedshiftDatasetDefinition</code> types.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DatasetDefinition {
    /// <p>Configuration for Athena Dataset Definition input.</p>
    #[doc(hidden)]
    pub athena_dataset_definition: std::option::Option<crate::model::AthenaDatasetDefinition>,
    /// <p>Configuration for Redshift Dataset Definition input.</p>
    #[doc(hidden)]
    pub redshift_dataset_definition: std::option::Option<crate::model::RedshiftDatasetDefinition>,
    /// <p>The local path where you want Amazon SageMaker to download the Dataset Definition inputs to run a processing job. <code>LocalPath</code> is an absolute path to the input data. This is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Whether the generated dataset is <code>FullyReplicated</code> or <code>ShardedByS3Key</code> (default).</p>
    #[doc(hidden)]
    pub data_distribution_type: std::option::Option<crate::model::DataDistributionType>,
    /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In <code>File</code> (default) mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
    #[doc(hidden)]
    pub input_mode: std::option::Option<crate::model::InputMode>,
}
impl DatasetDefinition {
    /// <p>Configuration for Athena Dataset Definition input.</p>
    pub fn athena_dataset_definition(
        &self,
    ) -> std::option::Option<&crate::model::AthenaDatasetDefinition> {
        self.athena_dataset_definition.as_ref()
    }
    /// <p>Configuration for Redshift Dataset Definition input.</p>
    pub fn redshift_dataset_definition(
        &self,
    ) -> std::option::Option<&crate::model::RedshiftDatasetDefinition> {
        self.redshift_dataset_definition.as_ref()
    }
    /// <p>The local path where you want Amazon SageMaker to download the Dataset Definition inputs to run a processing job. <code>LocalPath</code> is an absolute path to the input data. This is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Whether the generated dataset is <code>FullyReplicated</code> or <code>ShardedByS3Key</code> (default).</p>
    pub fn data_distribution_type(
        &self,
    ) -> std::option::Option<&crate::model::DataDistributionType> {
        self.data_distribution_type.as_ref()
    }
    /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In <code>File</code> (default) mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
    pub fn input_mode(&self) -> std::option::Option<&crate::model::InputMode> {
        self.input_mode.as_ref()
    }
}
/// See [`DatasetDefinition`](crate::model::DatasetDefinition).
pub mod dataset_definition {

    /// A builder for [`DatasetDefinition`](crate::model::DatasetDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) athena_dataset_definition:
            std::option::Option<crate::model::AthenaDatasetDefinition>,
        pub(crate) redshift_dataset_definition:
            std::option::Option<crate::model::RedshiftDatasetDefinition>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) data_distribution_type: std::option::Option<crate::model::DataDistributionType>,
        pub(crate) input_mode: std::option::Option<crate::model::InputMode>,
    }
    impl Builder {
        /// <p>Configuration for Athena Dataset Definition input.</p>
        pub fn athena_dataset_definition(
            mut self,
            input: crate::model::AthenaDatasetDefinition,
        ) -> Self {
            self.athena_dataset_definition = Some(input);
            self
        }
        /// <p>Configuration for Athena Dataset Definition input.</p>
        pub fn set_athena_dataset_definition(
            mut self,
            input: std::option::Option<crate::model::AthenaDatasetDefinition>,
        ) -> Self {
            self.athena_dataset_definition = input;
            self
        }
        /// <p>Configuration for Redshift Dataset Definition input.</p>
        pub fn redshift_dataset_definition(
            mut self,
            input: crate::model::RedshiftDatasetDefinition,
        ) -> Self {
            self.redshift_dataset_definition = Some(input);
            self
        }
        /// <p>Configuration for Redshift Dataset Definition input.</p>
        pub fn set_redshift_dataset_definition(
            mut self,
            input: std::option::Option<crate::model::RedshiftDatasetDefinition>,
        ) -> Self {
            self.redshift_dataset_definition = input;
            self
        }
        /// <p>The local path where you want Amazon SageMaker to download the Dataset Definition inputs to run a processing job. <code>LocalPath</code> is an absolute path to the input data. This is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>The local path where you want Amazon SageMaker to download the Dataset Definition inputs to run a processing job. <code>LocalPath</code> is an absolute path to the input data. This is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Whether the generated dataset is <code>FullyReplicated</code> or <code>ShardedByS3Key</code> (default).</p>
        pub fn data_distribution_type(mut self, input: crate::model::DataDistributionType) -> Self {
            self.data_distribution_type = Some(input);
            self
        }
        /// <p>Whether the generated dataset is <code>FullyReplicated</code> or <code>ShardedByS3Key</code> (default).</p>
        pub fn set_data_distribution_type(
            mut self,
            input: std::option::Option<crate::model::DataDistributionType>,
        ) -> Self {
            self.data_distribution_type = input;
            self
        }
        /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In <code>File</code> (default) mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
        pub fn input_mode(mut self, input: crate::model::InputMode) -> Self {
            self.input_mode = Some(input);
            self
        }
        /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In <code>File</code> (default) mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
        pub fn set_input_mode(
            mut self,
            input: std::option::Option<crate::model::InputMode>,
        ) -> Self {
            self.input_mode = input;
            self
        }
        /// Consumes the builder and constructs a [`DatasetDefinition`](crate::model::DatasetDefinition).
        pub fn build(self) -> crate::model::DatasetDefinition {
            crate::model::DatasetDefinition {
                athena_dataset_definition: self.athena_dataset_definition,
                redshift_dataset_definition: self.redshift_dataset_definition,
                local_path: self.local_path,
                data_distribution_type: self.data_distribution_type,
                input_mode: self.input_mode,
            }
        }
    }
}
impl DatasetDefinition {
    /// Creates a new builder-style object to manufacture [`DatasetDefinition`](crate::model::DatasetDefinition).
    pub fn builder() -> crate::model::dataset_definition::Builder {
        crate::model::dataset_definition::Builder::default()
    }
}

/// When writing a match expression against `InputMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let inputmode = unimplemented!();
/// match inputmode {
///     InputMode::File => { /* ... */ },
///     InputMode::Pipe => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `inputmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `InputMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `InputMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `InputMode::NewFeature` is defined.
/// Specifically, when `inputmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `InputMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum InputMode {
    #[allow(missing_docs)] // documentation missing in model
    File,
    #[allow(missing_docs)] // documentation missing in model
    Pipe,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for InputMode {
    fn from(s: &str) -> Self {
        match s {
            "File" => InputMode::File,
            "Pipe" => InputMode::Pipe,
            other => InputMode::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for InputMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(InputMode::from(s))
    }
}
impl InputMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            InputMode::File => "File",
            InputMode::Pipe => "Pipe",
            InputMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["File", "Pipe"]
    }
}
impl AsRef<str> for InputMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `DataDistributionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let datadistributiontype = unimplemented!();
/// match datadistributiontype {
///     DataDistributionType::Fullyreplicated => { /* ... */ },
///     DataDistributionType::Shardedbys3Key => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `datadistributiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DataDistributionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DataDistributionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DataDistributionType::NewFeature` is defined.
/// Specifically, when `datadistributiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DataDistributionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DataDistributionType {
    #[allow(missing_docs)] // documentation missing in model
    Fullyreplicated,
    #[allow(missing_docs)] // documentation missing in model
    Shardedbys3Key,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DataDistributionType {
    fn from(s: &str) -> Self {
        match s {
            "FullyReplicated" => DataDistributionType::Fullyreplicated,
            "ShardedByS3Key" => DataDistributionType::Shardedbys3Key,
            other => {
                DataDistributionType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for DataDistributionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DataDistributionType::from(s))
    }
}
impl DataDistributionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DataDistributionType::Fullyreplicated => "FullyReplicated",
            DataDistributionType::Shardedbys3Key => "ShardedByS3Key",
            DataDistributionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["FullyReplicated", "ShardedByS3Key"]
    }
}
impl AsRef<str> for DataDistributionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration for Redshift Dataset Definition input.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RedshiftDatasetDefinition {
    /// <p>The Redshift cluster Identifier.</p>
    #[doc(hidden)]
    pub cluster_id: std::option::Option<std::string::String>,
    /// <p>The name of the Redshift database used in Redshift query execution.</p>
    #[doc(hidden)]
    pub database: std::option::Option<std::string::String>,
    /// <p>The database user name used in Redshift query execution.</p>
    #[doc(hidden)]
    pub db_user: std::option::Option<std::string::String>,
    /// <p>The SQL query statements to be executed.</p>
    #[doc(hidden)]
    pub query_string: std::option::Option<std::string::String>,
    /// <p>The IAM role attached to your Redshift cluster that Amazon SageMaker uses to generate datasets.</p>
    #[doc(hidden)]
    pub cluster_role_arn: std::option::Option<std::string::String>,
    /// <p>The location in Amazon S3 where the Redshift query results are stored.</p>
    #[doc(hidden)]
    pub output_s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data from a Redshift execution.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>The data storage format for Redshift query results.</p>
    #[doc(hidden)]
    pub output_format: std::option::Option<crate::model::RedshiftResultFormat>,
    /// <p>The compression used for Redshift query results.</p>
    #[doc(hidden)]
    pub output_compression: std::option::Option<crate::model::RedshiftResultCompressionType>,
}
impl RedshiftDatasetDefinition {
    /// <p>The Redshift cluster Identifier.</p>
    pub fn cluster_id(&self) -> std::option::Option<&str> {
        self.cluster_id.as_deref()
    }
    /// <p>The name of the Redshift database used in Redshift query execution.</p>
    pub fn database(&self) -> std::option::Option<&str> {
        self.database.as_deref()
    }
    /// <p>The database user name used in Redshift query execution.</p>
    pub fn db_user(&self) -> std::option::Option<&str> {
        self.db_user.as_deref()
    }
    /// <p>The SQL query statements to be executed.</p>
    pub fn query_string(&self) -> std::option::Option<&str> {
        self.query_string.as_deref()
    }
    /// <p>The IAM role attached to your Redshift cluster that Amazon SageMaker uses to generate datasets.</p>
    pub fn cluster_role_arn(&self) -> std::option::Option<&str> {
        self.cluster_role_arn.as_deref()
    }
    /// <p>The location in Amazon S3 where the Redshift query results are stored.</p>
    pub fn output_s3_uri(&self) -> std::option::Option<&str> {
        self.output_s3_uri.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data from a Redshift execution.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>The data storage format for Redshift query results.</p>
    pub fn output_format(&self) -> std::option::Option<&crate::model::RedshiftResultFormat> {
        self.output_format.as_ref()
    }
    /// <p>The compression used for Redshift query results.</p>
    pub fn output_compression(
        &self,
    ) -> std::option::Option<&crate::model::RedshiftResultCompressionType> {
        self.output_compression.as_ref()
    }
}
/// See [`RedshiftDatasetDefinition`](crate::model::RedshiftDatasetDefinition).
pub mod redshift_dataset_definition {

    /// A builder for [`RedshiftDatasetDefinition`](crate::model::RedshiftDatasetDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cluster_id: std::option::Option<std::string::String>,
        pub(crate) database: std::option::Option<std::string::String>,
        pub(crate) db_user: std::option::Option<std::string::String>,
        pub(crate) query_string: std::option::Option<std::string::String>,
        pub(crate) cluster_role_arn: std::option::Option<std::string::String>,
        pub(crate) output_s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) output_format: std::option::Option<crate::model::RedshiftResultFormat>,
        pub(crate) output_compression:
            std::option::Option<crate::model::RedshiftResultCompressionType>,
    }
    impl Builder {
        /// <p>The Redshift cluster Identifier.</p>
        pub fn cluster_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.cluster_id = Some(input.into());
            self
        }
        /// <p>The Redshift cluster Identifier.</p>
        pub fn set_cluster_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.cluster_id = input;
            self
        }
        /// <p>The name of the Redshift database used in Redshift query execution.</p>
        pub fn database(mut self, input: impl Into<std::string::String>) -> Self {
            self.database = Some(input.into());
            self
        }
        /// <p>The name of the Redshift database used in Redshift query execution.</p>
        pub fn set_database(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.database = input;
            self
        }
        /// <p>The database user name used in Redshift query execution.</p>
        pub fn db_user(mut self, input: impl Into<std::string::String>) -> Self {
            self.db_user = Some(input.into());
            self
        }
        /// <p>The database user name used in Redshift query execution.</p>
        pub fn set_db_user(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.db_user = input;
            self
        }
        /// <p>The SQL query statements to be executed.</p>
        pub fn query_string(mut self, input: impl Into<std::string::String>) -> Self {
            self.query_string = Some(input.into());
            self
        }
        /// <p>The SQL query statements to be executed.</p>
        pub fn set_query_string(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.query_string = input;
            self
        }
        /// <p>The IAM role attached to your Redshift cluster that Amazon SageMaker uses to generate datasets.</p>
        pub fn cluster_role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.cluster_role_arn = Some(input.into());
            self
        }
        /// <p>The IAM role attached to your Redshift cluster that Amazon SageMaker uses to generate datasets.</p>
        pub fn set_cluster_role_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.cluster_role_arn = input;
            self
        }
        /// <p>The location in Amazon S3 where the Redshift query results are stored.</p>
        pub fn output_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.output_s3_uri = Some(input.into());
            self
        }
        /// <p>The location in Amazon S3 where the Redshift query results are stored.</p>
        pub fn set_output_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.output_s3_uri = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data from a Redshift execution.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data from a Redshift execution.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>The data storage format for Redshift query results.</p>
        pub fn output_format(mut self, input: crate::model::RedshiftResultFormat) -> Self {
            self.output_format = Some(input);
            self
        }
        /// <p>The data storage format for Redshift query results.</p>
        pub fn set_output_format(
            mut self,
            input: std::option::Option<crate::model::RedshiftResultFormat>,
        ) -> Self {
            self.output_format = input;
            self
        }
        /// <p>The compression used for Redshift query results.</p>
        pub fn output_compression(
            mut self,
            input: crate::model::RedshiftResultCompressionType,
        ) -> Self {
            self.output_compression = Some(input);
            self
        }
        /// <p>The compression used for Redshift query results.</p>
        pub fn set_output_compression(
            mut self,
            input: std::option::Option<crate::model::RedshiftResultCompressionType>,
        ) -> Self {
            self.output_compression = input;
            self
        }
        /// Consumes the builder and constructs a [`RedshiftDatasetDefinition`](crate::model::RedshiftDatasetDefinition).
        pub fn build(self) -> crate::model::RedshiftDatasetDefinition {
            crate::model::RedshiftDatasetDefinition {
                cluster_id: self.cluster_id,
                database: self.database,
                db_user: self.db_user,
                query_string: self.query_string,
                cluster_role_arn: self.cluster_role_arn,
                output_s3_uri: self.output_s3_uri,
                kms_key_id: self.kms_key_id,
                output_format: self.output_format,
                output_compression: self.output_compression,
            }
        }
    }
}
impl RedshiftDatasetDefinition {
    /// Creates a new builder-style object to manufacture [`RedshiftDatasetDefinition`](crate::model::RedshiftDatasetDefinition).
    pub fn builder() -> crate::model::redshift_dataset_definition::Builder {
        crate::model::redshift_dataset_definition::Builder::default()
    }
}

/// When writing a match expression against `RedshiftResultCompressionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let redshiftresultcompressiontype = unimplemented!();
/// match redshiftresultcompressiontype {
///     RedshiftResultCompressionType::Bzip2 => { /* ... */ },
///     RedshiftResultCompressionType::Gzip => { /* ... */ },
///     RedshiftResultCompressionType::None => { /* ... */ },
///     RedshiftResultCompressionType::Snappy => { /* ... */ },
///     RedshiftResultCompressionType::Zstd => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `redshiftresultcompressiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RedshiftResultCompressionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RedshiftResultCompressionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RedshiftResultCompressionType::NewFeature` is defined.
/// Specifically, when `redshiftresultcompressiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RedshiftResultCompressionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// <p>The compression used for Redshift query results.</p>
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RedshiftResultCompressionType {
    #[allow(missing_docs)] // documentation missing in model
    Bzip2,
    #[allow(missing_docs)] // documentation missing in model
    Gzip,
    #[allow(missing_docs)] // documentation missing in model
    None,
    #[allow(missing_docs)] // documentation missing in model
    Snappy,
    #[allow(missing_docs)] // documentation missing in model
    Zstd,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RedshiftResultCompressionType {
    fn from(s: &str) -> Self {
        match s {
            "BZIP2" => RedshiftResultCompressionType::Bzip2,
            "GZIP" => RedshiftResultCompressionType::Gzip,
            "None" => RedshiftResultCompressionType::None,
            "SNAPPY" => RedshiftResultCompressionType::Snappy,
            "ZSTD" => RedshiftResultCompressionType::Zstd,
            other => RedshiftResultCompressionType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for RedshiftResultCompressionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RedshiftResultCompressionType::from(s))
    }
}
impl RedshiftResultCompressionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RedshiftResultCompressionType::Bzip2 => "BZIP2",
            RedshiftResultCompressionType::Gzip => "GZIP",
            RedshiftResultCompressionType::None => "None",
            RedshiftResultCompressionType::Snappy => "SNAPPY",
            RedshiftResultCompressionType::Zstd => "ZSTD",
            RedshiftResultCompressionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["BZIP2", "GZIP", "None", "SNAPPY", "ZSTD"]
    }
}
impl AsRef<str> for RedshiftResultCompressionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `RedshiftResultFormat`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let redshiftresultformat = unimplemented!();
/// match redshiftresultformat {
///     RedshiftResultFormat::Csv => { /* ... */ },
///     RedshiftResultFormat::Parquet => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `redshiftresultformat` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RedshiftResultFormat::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RedshiftResultFormat::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RedshiftResultFormat::NewFeature` is defined.
/// Specifically, when `redshiftresultformat` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RedshiftResultFormat::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// <p>The data storage format for Redshift query results.</p>
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RedshiftResultFormat {
    #[allow(missing_docs)] // documentation missing in model
    Csv,
    #[allow(missing_docs)] // documentation missing in model
    Parquet,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RedshiftResultFormat {
    fn from(s: &str) -> Self {
        match s {
            "CSV" => RedshiftResultFormat::Csv,
            "PARQUET" => RedshiftResultFormat::Parquet,
            other => {
                RedshiftResultFormat::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for RedshiftResultFormat {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RedshiftResultFormat::from(s))
    }
}
impl RedshiftResultFormat {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RedshiftResultFormat::Csv => "CSV",
            RedshiftResultFormat::Parquet => "PARQUET",
            RedshiftResultFormat::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CSV", "PARQUET"]
    }
}
impl AsRef<str> for RedshiftResultFormat {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration for Athena Dataset Definition input.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AthenaDatasetDefinition {
    /// <p>The name of the data catalog used in Athena query execution.</p>
    #[doc(hidden)]
    pub catalog: std::option::Option<std::string::String>,
    /// <p>The name of the database used in the Athena query execution.</p>
    #[doc(hidden)]
    pub database: std::option::Option<std::string::String>,
    /// <p>The SQL query statements, to be executed.</p>
    #[doc(hidden)]
    pub query_string: std::option::Option<std::string::String>,
    /// <p>The name of the workgroup in which the Athena query is being started.</p>
    #[doc(hidden)]
    pub work_group: std::option::Option<std::string::String>,
    /// <p>The location in Amazon S3 where Athena query results are stored.</p>
    #[doc(hidden)]
    pub output_s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data generated from an Athena query execution.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>The data storage format for Athena query results.</p>
    #[doc(hidden)]
    pub output_format: std::option::Option<crate::model::AthenaResultFormat>,
    /// <p>The compression used for Athena query results.</p>
    #[doc(hidden)]
    pub output_compression: std::option::Option<crate::model::AthenaResultCompressionType>,
}
impl AthenaDatasetDefinition {
    /// <p>The name of the data catalog used in Athena query execution.</p>
    pub fn catalog(&self) -> std::option::Option<&str> {
        self.catalog.as_deref()
    }
    /// <p>The name of the database used in the Athena query execution.</p>
    pub fn database(&self) -> std::option::Option<&str> {
        self.database.as_deref()
    }
    /// <p>The SQL query statements, to be executed.</p>
    pub fn query_string(&self) -> std::option::Option<&str> {
        self.query_string.as_deref()
    }
    /// <p>The name of the workgroup in which the Athena query is being started.</p>
    pub fn work_group(&self) -> std::option::Option<&str> {
        self.work_group.as_deref()
    }
    /// <p>The location in Amazon S3 where Athena query results are stored.</p>
    pub fn output_s3_uri(&self) -> std::option::Option<&str> {
        self.output_s3_uri.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data generated from an Athena query execution.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>The data storage format for Athena query results.</p>
    pub fn output_format(&self) -> std::option::Option<&crate::model::AthenaResultFormat> {
        self.output_format.as_ref()
    }
    /// <p>The compression used for Athena query results.</p>
    pub fn output_compression(
        &self,
    ) -> std::option::Option<&crate::model::AthenaResultCompressionType> {
        self.output_compression.as_ref()
    }
}
/// See [`AthenaDatasetDefinition`](crate::model::AthenaDatasetDefinition).
pub mod athena_dataset_definition {

    /// A builder for [`AthenaDatasetDefinition`](crate::model::AthenaDatasetDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) catalog: std::option::Option<std::string::String>,
        pub(crate) database: std::option::Option<std::string::String>,
        pub(crate) query_string: std::option::Option<std::string::String>,
        pub(crate) work_group: std::option::Option<std::string::String>,
        pub(crate) output_s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) output_format: std::option::Option<crate::model::AthenaResultFormat>,
        pub(crate) output_compression:
            std::option::Option<crate::model::AthenaResultCompressionType>,
    }
    impl Builder {
        /// <p>The name of the data catalog used in Athena query execution.</p>
        pub fn catalog(mut self, input: impl Into<std::string::String>) -> Self {
            self.catalog = Some(input.into());
            self
        }
        /// <p>The name of the data catalog used in Athena query execution.</p>
        pub fn set_catalog(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.catalog = input;
            self
        }
        /// <p>The name of the database used in the Athena query execution.</p>
        pub fn database(mut self, input: impl Into<std::string::String>) -> Self {
            self.database = Some(input.into());
            self
        }
        /// <p>The name of the database used in the Athena query execution.</p>
        pub fn set_database(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.database = input;
            self
        }
        /// <p>The SQL query statements, to be executed.</p>
        pub fn query_string(mut self, input: impl Into<std::string::String>) -> Self {
            self.query_string = Some(input.into());
            self
        }
        /// <p>The SQL query statements, to be executed.</p>
        pub fn set_query_string(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.query_string = input;
            self
        }
        /// <p>The name of the workgroup in which the Athena query is being started.</p>
        pub fn work_group(mut self, input: impl Into<std::string::String>) -> Self {
            self.work_group = Some(input.into());
            self
        }
        /// <p>The name of the workgroup in which the Athena query is being started.</p>
        pub fn set_work_group(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.work_group = input;
            self
        }
        /// <p>The location in Amazon S3 where Athena query results are stored.</p>
        pub fn output_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.output_s3_uri = Some(input.into());
            self
        }
        /// <p>The location in Amazon S3 where Athena query results are stored.</p>
        pub fn set_output_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.output_s3_uri = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data generated from an Athena query execution.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data generated from an Athena query execution.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>The data storage format for Athena query results.</p>
        pub fn output_format(mut self, input: crate::model::AthenaResultFormat) -> Self {
            self.output_format = Some(input);
            self
        }
        /// <p>The data storage format for Athena query results.</p>
        pub fn set_output_format(
            mut self,
            input: std::option::Option<crate::model::AthenaResultFormat>,
        ) -> Self {
            self.output_format = input;
            self
        }
        /// <p>The compression used for Athena query results.</p>
        pub fn output_compression(
            mut self,
            input: crate::model::AthenaResultCompressionType,
        ) -> Self {
            self.output_compression = Some(input);
            self
        }
        /// <p>The compression used for Athena query results.</p>
        pub fn set_output_compression(
            mut self,
            input: std::option::Option<crate::model::AthenaResultCompressionType>,
        ) -> Self {
            self.output_compression = input;
            self
        }
        /// Consumes the builder and constructs a [`AthenaDatasetDefinition`](crate::model::AthenaDatasetDefinition).
        pub fn build(self) -> crate::model::AthenaDatasetDefinition {
            crate::model::AthenaDatasetDefinition {
                catalog: self.catalog,
                database: self.database,
                query_string: self.query_string,
                work_group: self.work_group,
                output_s3_uri: self.output_s3_uri,
                kms_key_id: self.kms_key_id,
                output_format: self.output_format,
                output_compression: self.output_compression,
            }
        }
    }
}
impl AthenaDatasetDefinition {
    /// Creates a new builder-style object to manufacture [`AthenaDatasetDefinition`](crate::model::AthenaDatasetDefinition).
    pub fn builder() -> crate::model::athena_dataset_definition::Builder {
        crate::model::athena_dataset_definition::Builder::default()
    }
}

/// When writing a match expression against `AthenaResultCompressionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let athenaresultcompressiontype = unimplemented!();
/// match athenaresultcompressiontype {
///     AthenaResultCompressionType::Gzip => { /* ... */ },
///     AthenaResultCompressionType::Snappy => { /* ... */ },
///     AthenaResultCompressionType::Zlib => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `athenaresultcompressiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AthenaResultCompressionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AthenaResultCompressionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AthenaResultCompressionType::NewFeature` is defined.
/// Specifically, when `athenaresultcompressiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AthenaResultCompressionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// <p>The compression used for Athena query results.</p>
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AthenaResultCompressionType {
    #[allow(missing_docs)] // documentation missing in model
    Gzip,
    #[allow(missing_docs)] // documentation missing in model
    Snappy,
    #[allow(missing_docs)] // documentation missing in model
    Zlib,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AthenaResultCompressionType {
    fn from(s: &str) -> Self {
        match s {
            "GZIP" => AthenaResultCompressionType::Gzip,
            "SNAPPY" => AthenaResultCompressionType::Snappy,
            "ZLIB" => AthenaResultCompressionType::Zlib,
            other => AthenaResultCompressionType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for AthenaResultCompressionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AthenaResultCompressionType::from(s))
    }
}
impl AthenaResultCompressionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AthenaResultCompressionType::Gzip => "GZIP",
            AthenaResultCompressionType::Snappy => "SNAPPY",
            AthenaResultCompressionType::Zlib => "ZLIB",
            AthenaResultCompressionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["GZIP", "SNAPPY", "ZLIB"]
    }
}
impl AsRef<str> for AthenaResultCompressionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AthenaResultFormat`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let athenaresultformat = unimplemented!();
/// match athenaresultformat {
///     AthenaResultFormat::Avro => { /* ... */ },
///     AthenaResultFormat::Json => { /* ... */ },
///     AthenaResultFormat::Orc => { /* ... */ },
///     AthenaResultFormat::Parquet => { /* ... */ },
///     AthenaResultFormat::Textfile => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `athenaresultformat` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AthenaResultFormat::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AthenaResultFormat::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AthenaResultFormat::NewFeature` is defined.
/// Specifically, when `athenaresultformat` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AthenaResultFormat::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// <p>The data storage format for Athena query results.</p>
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AthenaResultFormat {
    #[allow(missing_docs)] // documentation missing in model
    Avro,
    #[allow(missing_docs)] // documentation missing in model
    Json,
    #[allow(missing_docs)] // documentation missing in model
    Orc,
    #[allow(missing_docs)] // documentation missing in model
    Parquet,
    #[allow(missing_docs)] // documentation missing in model
    Textfile,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AthenaResultFormat {
    fn from(s: &str) -> Self {
        match s {
            "AVRO" => AthenaResultFormat::Avro,
            "JSON" => AthenaResultFormat::Json,
            "ORC" => AthenaResultFormat::Orc,
            "PARQUET" => AthenaResultFormat::Parquet,
            "TEXTFILE" => AthenaResultFormat::Textfile,
            other => {
                AthenaResultFormat::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for AthenaResultFormat {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AthenaResultFormat::from(s))
    }
}
impl AthenaResultFormat {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AthenaResultFormat::Avro => "AVRO",
            AthenaResultFormat::Json => "JSON",
            AthenaResultFormat::Orc => "ORC",
            AthenaResultFormat::Parquet => "PARQUET",
            AthenaResultFormat::Textfile => "TEXTFILE",
            AthenaResultFormat::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["AVRO", "JSON", "ORC", "PARQUET", "TEXTFILE"]
    }
}
impl AsRef<str> for AthenaResultFormat {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration for downloading input data from Amazon S3 into the processing container.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingS3Input {
    /// <p>The URI of the Amazon S3 prefix Amazon SageMaker downloads data required to run a processing job.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>The local path in your container where you want Amazon SageMaker to write input data to. <code>LocalPath</code> is an absolute path to the input data and must begin with <code>/opt/ml/processing/</code>. <code>LocalPath</code> is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Whether you use an <code>S3Prefix</code> or a <code>ManifestFile</code> for the data type. 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 the processing job. 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 the processing job.</p>
    #[doc(hidden)]
    pub s3_data_type: std::option::Option<crate::model::ProcessingS3DataType>,
    /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In File mode, Amazon SageMaker copies the data from the input source onto the local ML storage volume before starting your processing container. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your processing container into named pipes without using the ML storage volume.</p>
    #[doc(hidden)]
    pub s3_input_mode: std::option::Option<crate::model::ProcessingS3InputMode>,
    /// <p>Whether to distribute the data from Amazon S3 to all processing instances with <code>FullyReplicated</code>, or whether the data from Amazon S3 is shared by Amazon S3 key, downloading one shard of data to each processing instance.</p>
    #[doc(hidden)]
    pub s3_data_distribution_type:
        std::option::Option<crate::model::ProcessingS3DataDistributionType>,
    /// <p>Whether to GZIP-decompress the data in Amazon S3 as it is streamed into the processing container. <code>Gzip</code> can only be used when <code>Pipe</code> mode is specified as the <code>S3InputMode</code>. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your container without using the EBS volume.</p>
    #[doc(hidden)]
    pub s3_compression_type: std::option::Option<crate::model::ProcessingS3CompressionType>,
}
impl ProcessingS3Input {
    /// <p>The URI of the Amazon S3 prefix Amazon SageMaker downloads data required to run a processing job.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>The local path in your container where you want Amazon SageMaker to write input data to. <code>LocalPath</code> is an absolute path to the input data and must begin with <code>/opt/ml/processing/</code>. <code>LocalPath</code> is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Whether you use an <code>S3Prefix</code> or a <code>ManifestFile</code> for the data type. 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 the processing job. 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 the processing job.</p>
    pub fn s3_data_type(&self) -> std::option::Option<&crate::model::ProcessingS3DataType> {
        self.s3_data_type.as_ref()
    }
    /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In File mode, Amazon SageMaker copies the data from the input source onto the local ML storage volume before starting your processing container. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your processing container into named pipes without using the ML storage volume.</p>
    pub fn s3_input_mode(&self) -> std::option::Option<&crate::model::ProcessingS3InputMode> {
        self.s3_input_mode.as_ref()
    }
    /// <p>Whether to distribute the data from Amazon S3 to all processing instances with <code>FullyReplicated</code>, or whether the data from Amazon S3 is shared by Amazon S3 key, downloading one shard of data to each processing instance.</p>
    pub fn s3_data_distribution_type(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingS3DataDistributionType> {
        self.s3_data_distribution_type.as_ref()
    }
    /// <p>Whether to GZIP-decompress the data in Amazon S3 as it is streamed into the processing container. <code>Gzip</code> can only be used when <code>Pipe</code> mode is specified as the <code>S3InputMode</code>. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your container without using the EBS volume.</p>
    pub fn s3_compression_type(
        &self,
    ) -> std::option::Option<&crate::model::ProcessingS3CompressionType> {
        self.s3_compression_type.as_ref()
    }
}
/// See [`ProcessingS3Input`](crate::model::ProcessingS3Input).
pub mod processing_s3_input {

    /// A builder for [`ProcessingS3Input`](crate::model::ProcessingS3Input).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_data_type: std::option::Option<crate::model::ProcessingS3DataType>,
        pub(crate) s3_input_mode: std::option::Option<crate::model::ProcessingS3InputMode>,
        pub(crate) s3_data_distribution_type:
            std::option::Option<crate::model::ProcessingS3DataDistributionType>,
        pub(crate) s3_compression_type:
            std::option::Option<crate::model::ProcessingS3CompressionType>,
    }
    impl Builder {
        /// <p>The URI of the Amazon S3 prefix Amazon SageMaker downloads data required to run a processing job.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The URI of the Amazon S3 prefix Amazon SageMaker downloads data required to run a processing job.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>The local path in your container where you want Amazon SageMaker to write input data to. <code>LocalPath</code> is an absolute path to the input data and must begin with <code>/opt/ml/processing/</code>. <code>LocalPath</code> is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>The local path in your container where you want Amazon SageMaker to write input data to. <code>LocalPath</code> is an absolute path to the input data and must begin with <code>/opt/ml/processing/</code>. <code>LocalPath</code> is a required parameter when <code>AppManaged</code> is <code>False</code> (default).</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Whether you use an <code>S3Prefix</code> or a <code>ManifestFile</code> for the data type. 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 the processing job. 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 the processing job.</p>
        pub fn s3_data_type(mut self, input: crate::model::ProcessingS3DataType) -> Self {
            self.s3_data_type = Some(input);
            self
        }
        /// <p>Whether you use an <code>S3Prefix</code> or a <code>ManifestFile</code> for the data type. 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 the processing job. 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 the processing job.</p>
        pub fn set_s3_data_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3DataType>,
        ) -> Self {
            self.s3_data_type = input;
            self
        }
        /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In File mode, Amazon SageMaker copies the data from the input source onto the local ML storage volume before starting your processing container. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your processing container into named pipes without using the ML storage volume.</p>
        pub fn s3_input_mode(mut self, input: crate::model::ProcessingS3InputMode) -> Self {
            self.s3_input_mode = Some(input);
            self
        }
        /// <p>Whether to use <code>File</code> or <code>Pipe</code> input mode. In File mode, Amazon SageMaker copies the data from the input source onto the local ML storage volume before starting your processing container. This is the most commonly used input mode. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your processing container into named pipes without using the ML storage volume.</p>
        pub fn set_s3_input_mode(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3InputMode>,
        ) -> Self {
            self.s3_input_mode = input;
            self
        }
        /// <p>Whether to distribute the data from Amazon S3 to all processing instances with <code>FullyReplicated</code>, or whether the data from Amazon S3 is shared by Amazon S3 key, downloading one shard of data to each processing instance.</p>
        pub fn s3_data_distribution_type(
            mut self,
            input: crate::model::ProcessingS3DataDistributionType,
        ) -> Self {
            self.s3_data_distribution_type = Some(input);
            self
        }
        /// <p>Whether to distribute the data from Amazon S3 to all processing instances with <code>FullyReplicated</code>, or whether the data from Amazon S3 is shared by Amazon S3 key, downloading one shard of data to each processing instance.</p>
        pub fn set_s3_data_distribution_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3DataDistributionType>,
        ) -> Self {
            self.s3_data_distribution_type = input;
            self
        }
        /// <p>Whether to GZIP-decompress the data in Amazon S3 as it is streamed into the processing container. <code>Gzip</code> can only be used when <code>Pipe</code> mode is specified as the <code>S3InputMode</code>. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your container without using the EBS volume.</p>
        pub fn s3_compression_type(
            mut self,
            input: crate::model::ProcessingS3CompressionType,
        ) -> Self {
            self.s3_compression_type = Some(input);
            self
        }
        /// <p>Whether to GZIP-decompress the data in Amazon S3 as it is streamed into the processing container. <code>Gzip</code> can only be used when <code>Pipe</code> mode is specified as the <code>S3InputMode</code>. In <code>Pipe</code> mode, Amazon SageMaker streams input data from the source directly to your container without using the EBS volume.</p>
        pub fn set_s3_compression_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingS3CompressionType>,
        ) -> Self {
            self.s3_compression_type = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingS3Input`](crate::model::ProcessingS3Input).
        pub fn build(self) -> crate::model::ProcessingS3Input {
            crate::model::ProcessingS3Input {
                s3_uri: self.s3_uri,
                local_path: self.local_path,
                s3_data_type: self.s3_data_type,
                s3_input_mode: self.s3_input_mode,
                s3_data_distribution_type: self.s3_data_distribution_type,
                s3_compression_type: self.s3_compression_type,
            }
        }
    }
}
impl ProcessingS3Input {
    /// Creates a new builder-style object to manufacture [`ProcessingS3Input`](crate::model::ProcessingS3Input).
    pub fn builder() -> crate::model::processing_s3_input::Builder {
        crate::model::processing_s3_input::Builder::default()
    }
}

/// When writing a match expression against `ProcessingS3CompressionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processings3compressiontype = unimplemented!();
/// match processings3compressiontype {
///     ProcessingS3CompressionType::Gzip => { /* ... */ },
///     ProcessingS3CompressionType::None => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processings3compressiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingS3CompressionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingS3CompressionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingS3CompressionType::NewFeature` is defined.
/// Specifically, when `processings3compressiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingS3CompressionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingS3CompressionType {
    #[allow(missing_docs)] // documentation missing in model
    Gzip,
    #[allow(missing_docs)] // documentation missing in model
    None,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingS3CompressionType {
    fn from(s: &str) -> Self {
        match s {
            "Gzip" => ProcessingS3CompressionType::Gzip,
            "None" => ProcessingS3CompressionType::None,
            other => ProcessingS3CompressionType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ProcessingS3CompressionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingS3CompressionType::from(s))
    }
}
impl ProcessingS3CompressionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingS3CompressionType::Gzip => "Gzip",
            ProcessingS3CompressionType::None => "None",
            ProcessingS3CompressionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Gzip", "None"]
    }
}
impl AsRef<str> for ProcessingS3CompressionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ProcessingS3DataType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let processings3datatype = unimplemented!();
/// match processings3datatype {
///     ProcessingS3DataType::ManifestFile => { /* ... */ },
///     ProcessingS3DataType::S3Prefix => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `processings3datatype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProcessingS3DataType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProcessingS3DataType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProcessingS3DataType::NewFeature` is defined.
/// Specifically, when `processings3datatype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProcessingS3DataType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProcessingS3DataType {
    #[allow(missing_docs)] // documentation missing in model
    ManifestFile,
    #[allow(missing_docs)] // documentation missing in model
    S3Prefix,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProcessingS3DataType {
    fn from(s: &str) -> Self {
        match s {
            "ManifestFile" => ProcessingS3DataType::ManifestFile,
            "S3Prefix" => ProcessingS3DataType::S3Prefix,
            other => {
                ProcessingS3DataType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ProcessingS3DataType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProcessingS3DataType::from(s))
    }
}
impl ProcessingS3DataType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProcessingS3DataType::ManifestFile => "ManifestFile",
            ProcessingS3DataType::S3Prefix => "S3Prefix",
            ProcessingS3DataType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ManifestFile", "S3Prefix"]
    }
}
impl AsRef<str> for ProcessingS3DataType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information about a training job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrainingJob {
    /// <p>The name of the training job.</p>
    #[doc(hidden)]
    pub training_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the training job.</p>
    #[doc(hidden)]
    pub training_job_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the associated hyperparameter tuning job if the training job was launched by a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub tuning_job_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the labeling job.</p>
    #[doc(hidden)]
    pub labeling_job_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the job.</p>
    #[doc(hidden)]
    pub auto_ml_job_arn: std::option::Option<std::string::String>,
    /// <p>Information about the Amazon S3 location that is configured for storing model artifacts.</p>
    #[doc(hidden)]
    pub model_artifacts: std::option::Option<crate::model::ModelArtifacts>,
    /// <p>The status of the training job.</p>
    /// <p>Training job statuses are:</p>
    /// <ul>
    /// <li> <p> <code>InProgress</code> - The training is in progress.</p> </li>
    /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
    /// <li> <p> <code>Failed</code> - The training job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTrainingJobResponse</code> call.</p> </li>
    /// <li> <p> <code>Stopping</code> - The training job is stopping.</p> </li>
    /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
    /// </ul>
    /// <p>For more detailed information, see <code>SecondaryStatus</code>. </p>
    #[doc(hidden)]
    pub training_job_status: std::option::Option<crate::model::TrainingJobStatus>,
    /// <p> Provides detailed information about the state of the training job. For detailed information about the secondary status of the training job, see <code>StatusMessage</code> under <code>SecondaryStatusTransition</code>.</p>
    /// <p>SageMaker provides primary statuses and secondary statuses that apply to each of them:</p>
    /// <dl>
    /// <dt>
    /// InProgress
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
    /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
    /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
    /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Completed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Failed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopped
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
    /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopping
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
    /// </ul>
    /// </dd>
    /// </dl> <important>
    /// <p>Valid values for <code>SecondaryStatus</code> are subject to change. </p>
    /// </important>
    /// <p>We no longer support the following secondary statuses:</p>
    /// <ul>
    /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
    /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
    /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub secondary_status: std::option::Option<crate::model::SecondaryStatus>,
    /// <p>If the training job failed, the reason it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>Algorithm-specific parameters.</p>
    #[doc(hidden)]
    pub hyper_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Information about the algorithm used for training, and algorithm metadata.</p>
    #[doc(hidden)]
    pub algorithm_specification: std::option::Option<crate::model::AlgorithmSpecification>,
    /// <p>The Amazon Web Services Identity and Access Management (IAM) role configured for the training job.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>An array of <code>Channel</code> objects that describes each data input channel.</p>
    #[doc(hidden)]
    pub input_data_config: std::option::Option<std::vec::Vec<crate::model::Channel>>,
    /// <p>The S3 path where model artifacts that you configured when creating the job are stored. SageMaker creates subfolders for model artifacts.</p>
    #[doc(hidden)]
    pub output_data_config: std::option::Option<crate::model::OutputDataConfig>,
    /// <p>Resources, including ML compute instances and ML storage volumes, that are configured for model training.</p>
    #[doc(hidden)]
    pub resource_config: std::option::Option<crate::model::ResourceConfig>,
    /// <p>A <code>VpcConfig</code> object that specifies the VPC that this training job has access to. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
    /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
    /// <p>To stop a job, SageMaker sends the algorithm the <code>SIGTERM</code> signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost. </p>
    #[doc(hidden)]
    pub stopping_condition: std::option::Option<crate::model::StoppingCondition>,
    /// <p>A timestamp that indicates when the training job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Indicates the time when the training job starts on training instances. You are billed for the time interval between this time and the value of <code>TrainingEndTime</code>. The start time in CloudWatch Logs might be later than this time. The difference is due to the time it takes to download the training data and to the size of the training container.</p>
    #[doc(hidden)]
    pub training_start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Indicates the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
    #[doc(hidden)]
    pub training_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that indicates when the status of the training job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A history of all of the secondary statuses that the training job has transitioned through.</p>
    #[doc(hidden)]
    pub secondary_status_transitions:
        std::option::Option<std::vec::Vec<crate::model::SecondaryStatusTransition>>,
    /// <p>A list of final metric values that are set when the training job completes. Used only if the training job was configured to use metrics.</p>
    #[doc(hidden)]
    pub final_metric_data_list: std::option::Option<std::vec::Vec<crate::model::MetricData>>,
    /// <p>If the <code>TrainingJob</code> was created with network isolation, the value is set to <code>true</code>. If network isolation is enabled, nodes can't communicate beyond the VPC they run in.</p>
    #[doc(hidden)]
    pub enable_network_isolation: bool,
    /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
    #[doc(hidden)]
    pub enable_inter_container_traffic_encryption: bool,
    /// <p>When true, enables managed spot training using Amazon EC2 Spot instances to run training jobs instead of on-demand instances. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-managed-spot-training.html">Managed Spot Training</a>.</p>
    #[doc(hidden)]
    pub enable_managed_spot_training: bool,
    /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
    #[doc(hidden)]
    pub checkpoint_config: std::option::Option<crate::model::CheckpointConfig>,
    /// <p>The training time in seconds.</p>
    #[doc(hidden)]
    pub training_time_in_seconds: std::option::Option<i32>,
    /// <p>The billable time in seconds.</p>
    #[doc(hidden)]
    pub billable_time_in_seconds: std::option::Option<i32>,
    /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters, metric and tensor collections, and storage paths. To learn more about how to configure the <code>DebugHookConfig</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>.</p>
    #[doc(hidden)]
    pub debug_hook_config: std::option::Option<crate::model::DebugHookConfig>,
    /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
    /// <ul>
    /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
    /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
    /// <li> <p> <code>CreateTransformJob</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub experiment_config: std::option::Option<crate::model::ExperimentConfig>,
    /// <p>Information about the debug rule configuration.</p>
    #[doc(hidden)]
    pub debug_rule_configurations:
        std::option::Option<std::vec::Vec<crate::model::DebugRuleConfiguration>>,
    /// <p>Configuration of storage locations for the Amazon SageMaker Debugger TensorBoard output data.</p>
    #[doc(hidden)]
    pub tensor_board_output_config: std::option::Option<crate::model::TensorBoardOutputConfig>,
    /// <p>Information about the evaluation status of the rules for the training job.</p>
    #[doc(hidden)]
    pub debug_rule_evaluation_statuses:
        std::option::Option<std::vec::Vec<crate::model::DebugRuleEvaluationStatus>>,
    /// <p>The environment variables to set in the Docker container.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
    #[doc(hidden)]
    pub retry_strategy: std::option::Option<crate::model::RetryStrategy>,
    /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl TrainingJob {
    /// <p>The name of the training job.</p>
    pub fn training_job_name(&self) -> std::option::Option<&str> {
        self.training_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the training job.</p>
    pub fn training_job_arn(&self) -> std::option::Option<&str> {
        self.training_job_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the associated hyperparameter tuning job if the training job was launched by a hyperparameter tuning job.</p>
    pub fn tuning_job_arn(&self) -> std::option::Option<&str> {
        self.tuning_job_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the labeling job.</p>
    pub fn labeling_job_arn(&self) -> std::option::Option<&str> {
        self.labeling_job_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the job.</p>
    pub fn auto_ml_job_arn(&self) -> std::option::Option<&str> {
        self.auto_ml_job_arn.as_deref()
    }
    /// <p>Information about the Amazon S3 location that is configured for storing model artifacts.</p>
    pub fn model_artifacts(&self) -> std::option::Option<&crate::model::ModelArtifacts> {
        self.model_artifacts.as_ref()
    }
    /// <p>The status of the training job.</p>
    /// <p>Training job statuses are:</p>
    /// <ul>
    /// <li> <p> <code>InProgress</code> - The training is in progress.</p> </li>
    /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
    /// <li> <p> <code>Failed</code> - The training job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTrainingJobResponse</code> call.</p> </li>
    /// <li> <p> <code>Stopping</code> - The training job is stopping.</p> </li>
    /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
    /// </ul>
    /// <p>For more detailed information, see <code>SecondaryStatus</code>. </p>
    pub fn training_job_status(&self) -> std::option::Option<&crate::model::TrainingJobStatus> {
        self.training_job_status.as_ref()
    }
    /// <p> Provides detailed information about the state of the training job. For detailed information about the secondary status of the training job, see <code>StatusMessage</code> under <code>SecondaryStatusTransition</code>.</p>
    /// <p>SageMaker provides primary statuses and secondary statuses that apply to each of them:</p>
    /// <dl>
    /// <dt>
    /// InProgress
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
    /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
    /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
    /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Completed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Failed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopped
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
    /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopping
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
    /// </ul>
    /// </dd>
    /// </dl> <important>
    /// <p>Valid values for <code>SecondaryStatus</code> are subject to change. </p>
    /// </important>
    /// <p>We no longer support the following secondary statuses:</p>
    /// <ul>
    /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
    /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
    /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
    /// </ul>
    pub fn secondary_status(&self) -> std::option::Option<&crate::model::SecondaryStatus> {
        self.secondary_status.as_ref()
    }
    /// <p>If the training job failed, the reason it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>Algorithm-specific parameters.</p>
    pub fn hyper_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.hyper_parameters.as_ref()
    }
    /// <p>Information about the algorithm used for training, and algorithm metadata.</p>
    pub fn algorithm_specification(
        &self,
    ) -> std::option::Option<&crate::model::AlgorithmSpecification> {
        self.algorithm_specification.as_ref()
    }
    /// <p>The Amazon Web Services Identity and Access Management (IAM) role configured for the training job.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>An array of <code>Channel</code> objects that describes each data input channel.</p>
    pub fn input_data_config(&self) -> std::option::Option<&[crate::model::Channel]> {
        self.input_data_config.as_deref()
    }
    /// <p>The S3 path where model artifacts that you configured when creating the job are stored. SageMaker creates subfolders for model artifacts.</p>
    pub fn output_data_config(&self) -> std::option::Option<&crate::model::OutputDataConfig> {
        self.output_data_config.as_ref()
    }
    /// <p>Resources, including ML compute instances and ML storage volumes, that are configured for model training.</p>
    pub fn resource_config(&self) -> std::option::Option<&crate::model::ResourceConfig> {
        self.resource_config.as_ref()
    }
    /// <p>A <code>VpcConfig</code> object that specifies the VPC that this training job has access to. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
    /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
    /// <p>To stop a job, SageMaker sends the algorithm the <code>SIGTERM</code> signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost. </p>
    pub fn stopping_condition(&self) -> std::option::Option<&crate::model::StoppingCondition> {
        self.stopping_condition.as_ref()
    }
    /// <p>A timestamp that indicates when the training job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Indicates the time when the training job starts on training instances. You are billed for the time interval between this time and the value of <code>TrainingEndTime</code>. The start time in CloudWatch Logs might be later than this time. The difference is due to the time it takes to download the training data and to the size of the training container.</p>
    pub fn training_start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.training_start_time.as_ref()
    }
    /// <p>Indicates the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
    pub fn training_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.training_end_time.as_ref()
    }
    /// <p>A timestamp that indicates when the status of the training job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>A history of all of the secondary statuses that the training job has transitioned through.</p>
    pub fn secondary_status_transitions(
        &self,
    ) -> std::option::Option<&[crate::model::SecondaryStatusTransition]> {
        self.secondary_status_transitions.as_deref()
    }
    /// <p>A list of final metric values that are set when the training job completes. Used only if the training job was configured to use metrics.</p>
    pub fn final_metric_data_list(&self) -> std::option::Option<&[crate::model::MetricData]> {
        self.final_metric_data_list.as_deref()
    }
    /// <p>If the <code>TrainingJob</code> was created with network isolation, the value is set to <code>true</code>. If network isolation is enabled, nodes can't communicate beyond the VPC they run in.</p>
    pub fn enable_network_isolation(&self) -> bool {
        self.enable_network_isolation
    }
    /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
    pub fn enable_inter_container_traffic_encryption(&self) -> bool {
        self.enable_inter_container_traffic_encryption
    }
    /// <p>When true, enables managed spot training using Amazon EC2 Spot instances to run training jobs instead of on-demand instances. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-managed-spot-training.html">Managed Spot Training</a>.</p>
    pub fn enable_managed_spot_training(&self) -> bool {
        self.enable_managed_spot_training
    }
    /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
    pub fn checkpoint_config(&self) -> std::option::Option<&crate::model::CheckpointConfig> {
        self.checkpoint_config.as_ref()
    }
    /// <p>The training time in seconds.</p>
    pub fn training_time_in_seconds(&self) -> std::option::Option<i32> {
        self.training_time_in_seconds
    }
    /// <p>The billable time in seconds.</p>
    pub fn billable_time_in_seconds(&self) -> std::option::Option<i32> {
        self.billable_time_in_seconds
    }
    /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters, metric and tensor collections, and storage paths. To learn more about how to configure the <code>DebugHookConfig</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>.</p>
    pub fn debug_hook_config(&self) -> std::option::Option<&crate::model::DebugHookConfig> {
        self.debug_hook_config.as_ref()
    }
    /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
    /// <ul>
    /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
    /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
    /// <li> <p> <code>CreateTransformJob</code> </p> </li>
    /// </ul>
    pub fn experiment_config(&self) -> std::option::Option<&crate::model::ExperimentConfig> {
        self.experiment_config.as_ref()
    }
    /// <p>Information about the debug rule configuration.</p>
    pub fn debug_rule_configurations(
        &self,
    ) -> std::option::Option<&[crate::model::DebugRuleConfiguration]> {
        self.debug_rule_configurations.as_deref()
    }
    /// <p>Configuration of storage locations for the Amazon SageMaker Debugger TensorBoard output data.</p>
    pub fn tensor_board_output_config(
        &self,
    ) -> std::option::Option<&crate::model::TensorBoardOutputConfig> {
        self.tensor_board_output_config.as_ref()
    }
    /// <p>Information about the evaluation status of the rules for the training job.</p>
    pub fn debug_rule_evaluation_statuses(
        &self,
    ) -> std::option::Option<&[crate::model::DebugRuleEvaluationStatus]> {
        self.debug_rule_evaluation_statuses.as_deref()
    }
    /// <p>The environment variables to set in the Docker container.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
    /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
    pub fn retry_strategy(&self) -> std::option::Option<&crate::model::RetryStrategy> {
        self.retry_strategy.as_ref()
    }
    /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`TrainingJob`](crate::model::TrainingJob).
pub mod training_job {

    /// A builder for [`TrainingJob`](crate::model::TrainingJob).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_job_name: std::option::Option<std::string::String>,
        pub(crate) training_job_arn: std::option::Option<std::string::String>,
        pub(crate) tuning_job_arn: std::option::Option<std::string::String>,
        pub(crate) labeling_job_arn: std::option::Option<std::string::String>,
        pub(crate) auto_ml_job_arn: std::option::Option<std::string::String>,
        pub(crate) model_artifacts: std::option::Option<crate::model::ModelArtifacts>,
        pub(crate) training_job_status: std::option::Option<crate::model::TrainingJobStatus>,
        pub(crate) secondary_status: std::option::Option<crate::model::SecondaryStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) hyper_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) algorithm_specification:
            std::option::Option<crate::model::AlgorithmSpecification>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) input_data_config: std::option::Option<std::vec::Vec<crate::model::Channel>>,
        pub(crate) output_data_config: std::option::Option<crate::model::OutputDataConfig>,
        pub(crate) resource_config: std::option::Option<crate::model::ResourceConfig>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
        pub(crate) stopping_condition: std::option::Option<crate::model::StoppingCondition>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) secondary_status_transitions:
            std::option::Option<std::vec::Vec<crate::model::SecondaryStatusTransition>>,
        pub(crate) final_metric_data_list:
            std::option::Option<std::vec::Vec<crate::model::MetricData>>,
        pub(crate) enable_network_isolation: std::option::Option<bool>,
        pub(crate) enable_inter_container_traffic_encryption: std::option::Option<bool>,
        pub(crate) enable_managed_spot_training: std::option::Option<bool>,
        pub(crate) checkpoint_config: std::option::Option<crate::model::CheckpointConfig>,
        pub(crate) training_time_in_seconds: std::option::Option<i32>,
        pub(crate) billable_time_in_seconds: std::option::Option<i32>,
        pub(crate) debug_hook_config: std::option::Option<crate::model::DebugHookConfig>,
        pub(crate) experiment_config: std::option::Option<crate::model::ExperimentConfig>,
        pub(crate) debug_rule_configurations:
            std::option::Option<std::vec::Vec<crate::model::DebugRuleConfiguration>>,
        pub(crate) tensor_board_output_config:
            std::option::Option<crate::model::TensorBoardOutputConfig>,
        pub(crate) debug_rule_evaluation_statuses:
            std::option::Option<std::vec::Vec<crate::model::DebugRuleEvaluationStatus>>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) retry_strategy: std::option::Option<crate::model::RetryStrategy>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The name of the training job.</p>
        pub fn training_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_name = Some(input.into());
            self
        }
        /// <p>The name of the training job.</p>
        pub fn set_training_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job.</p>
        pub fn training_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job.</p>
        pub fn set_training_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the associated hyperparameter tuning job if the training job was launched by a hyperparameter tuning job.</p>
        pub fn tuning_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.tuning_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the associated hyperparameter tuning job if the training job was launched by a hyperparameter tuning job.</p>
        pub fn set_tuning_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.tuning_job_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the labeling job.</p>
        pub fn labeling_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.labeling_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the labeling job.</p>
        pub fn set_labeling_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.labeling_job_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the job.</p>
        pub fn auto_ml_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.auto_ml_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the job.</p>
        pub fn set_auto_ml_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.auto_ml_job_arn = input;
            self
        }
        /// <p>Information about the Amazon S3 location that is configured for storing model artifacts.</p>
        pub fn model_artifacts(mut self, input: crate::model::ModelArtifacts) -> Self {
            self.model_artifacts = Some(input);
            self
        }
        /// <p>Information about the Amazon S3 location that is configured for storing model artifacts.</p>
        pub fn set_model_artifacts(
            mut self,
            input: std::option::Option<crate::model::ModelArtifacts>,
        ) -> Self {
            self.model_artifacts = input;
            self
        }
        /// <p>The status of the training job.</p>
        /// <p>Training job statuses are:</p>
        /// <ul>
        /// <li> <p> <code>InProgress</code> - The training is in progress.</p> </li>
        /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
        /// <li> <p> <code>Failed</code> - The training job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTrainingJobResponse</code> call.</p> </li>
        /// <li> <p> <code>Stopping</code> - The training job is stopping.</p> </li>
        /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
        /// </ul>
        /// <p>For more detailed information, see <code>SecondaryStatus</code>. </p>
        pub fn training_job_status(mut self, input: crate::model::TrainingJobStatus) -> Self {
            self.training_job_status = Some(input);
            self
        }
        /// <p>The status of the training job.</p>
        /// <p>Training job statuses are:</p>
        /// <ul>
        /// <li> <p> <code>InProgress</code> - The training is in progress.</p> </li>
        /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
        /// <li> <p> <code>Failed</code> - The training job has failed. To see the reason for the failure, see the <code>FailureReason</code> field in the response to a <code>DescribeTrainingJobResponse</code> call.</p> </li>
        /// <li> <p> <code>Stopping</code> - The training job is stopping.</p> </li>
        /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
        /// </ul>
        /// <p>For more detailed information, see <code>SecondaryStatus</code>. </p>
        pub fn set_training_job_status(
            mut self,
            input: std::option::Option<crate::model::TrainingJobStatus>,
        ) -> Self {
            self.training_job_status = input;
            self
        }
        /// <p> Provides detailed information about the state of the training job. For detailed information about the secondary status of the training job, see <code>StatusMessage</code> under <code>SecondaryStatusTransition</code>.</p>
        /// <p>SageMaker provides primary statuses and secondary statuses that apply to each of them:</p>
        /// <dl>
        /// <dt>
        /// InProgress
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
        /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
        /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
        /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Completed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Failed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopped
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
        /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopping
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
        /// </ul>
        /// </dd>
        /// </dl> <important>
        /// <p>Valid values for <code>SecondaryStatus</code> are subject to change. </p>
        /// </important>
        /// <p>We no longer support the following secondary statuses:</p>
        /// <ul>
        /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
        /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
        /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
        /// </ul>
        pub fn secondary_status(mut self, input: crate::model::SecondaryStatus) -> Self {
            self.secondary_status = Some(input);
            self
        }
        /// <p> Provides detailed information about the state of the training job. For detailed information about the secondary status of the training job, see <code>StatusMessage</code> under <code>SecondaryStatusTransition</code>.</p>
        /// <p>SageMaker provides primary statuses and secondary statuses that apply to each of them:</p>
        /// <dl>
        /// <dt>
        /// InProgress
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
        /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
        /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
        /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Completed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Failed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopped
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
        /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopping
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
        /// </ul>
        /// </dd>
        /// </dl> <important>
        /// <p>Valid values for <code>SecondaryStatus</code> are subject to change. </p>
        /// </important>
        /// <p>We no longer support the following secondary statuses:</p>
        /// <ul>
        /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
        /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
        /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
        /// </ul>
        pub fn set_secondary_status(
            mut self,
            input: std::option::Option<crate::model::SecondaryStatus>,
        ) -> Self {
            self.secondary_status = input;
            self
        }
        /// <p>If the training job failed, the reason it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the training job failed, the reason it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Adds a key-value pair to `hyper_parameters`.
        ///
        /// To override the contents of this collection use [`set_hyper_parameters`](Self::set_hyper_parameters).
        ///
        /// <p>Algorithm-specific parameters.</p>
        pub fn hyper_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.hyper_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.hyper_parameters = Some(hash_map);
            self
        }
        /// <p>Algorithm-specific parameters.</p>
        pub fn set_hyper_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.hyper_parameters = input;
            self
        }
        /// <p>Information about the algorithm used for training, and algorithm metadata.</p>
        pub fn algorithm_specification(
            mut self,
            input: crate::model::AlgorithmSpecification,
        ) -> Self {
            self.algorithm_specification = Some(input);
            self
        }
        /// <p>Information about the algorithm used for training, and algorithm metadata.</p>
        pub fn set_algorithm_specification(
            mut self,
            input: std::option::Option<crate::model::AlgorithmSpecification>,
        ) -> Self {
            self.algorithm_specification = input;
            self
        }
        /// <p>The Amazon Web Services Identity and Access Management (IAM) role configured for the training job.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Identity and Access Management (IAM) role configured for the training job.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// Appends an item to `input_data_config`.
        ///
        /// To override the contents of this collection use [`set_input_data_config`](Self::set_input_data_config).
        ///
        /// <p>An array of <code>Channel</code> objects that describes each data input channel.</p>
        pub fn input_data_config(mut self, input: crate::model::Channel) -> Self {
            let mut v = self.input_data_config.unwrap_or_default();
            v.push(input);
            self.input_data_config = Some(v);
            self
        }
        /// <p>An array of <code>Channel</code> objects that describes each data input channel.</p>
        pub fn set_input_data_config(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Channel>>,
        ) -> Self {
            self.input_data_config = input;
            self
        }
        /// <p>The S3 path where model artifacts that you configured when creating the job are stored. SageMaker creates subfolders for model artifacts.</p>
        pub fn output_data_config(mut self, input: crate::model::OutputDataConfig) -> Self {
            self.output_data_config = Some(input);
            self
        }
        /// <p>The S3 path where model artifacts that you configured when creating the job are stored. SageMaker creates subfolders for model artifacts.</p>
        pub fn set_output_data_config(
            mut self,
            input: std::option::Option<crate::model::OutputDataConfig>,
        ) -> Self {
            self.output_data_config = input;
            self
        }
        /// <p>Resources, including ML compute instances and ML storage volumes, that are configured for model training.</p>
        pub fn resource_config(mut self, input: crate::model::ResourceConfig) -> Self {
            self.resource_config = Some(input);
            self
        }
        /// <p>Resources, including ML compute instances and ML storage volumes, that are configured for model training.</p>
        pub fn set_resource_config(
            mut self,
            input: std::option::Option<crate::model::ResourceConfig>,
        ) -> Self {
            self.resource_config = input;
            self
        }
        /// <p>A <code>VpcConfig</code> object that specifies the VPC that this training job has access to. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>A <code>VpcConfig</code> object that specifies the VPC that this training job has access to. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>.</p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
        /// <p>To stop a job, SageMaker sends the algorithm the <code>SIGTERM</code> signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost. </p>
        pub fn stopping_condition(mut self, input: crate::model::StoppingCondition) -> Self {
            self.stopping_condition = Some(input);
            self
        }
        /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
        /// <p>To stop a job, SageMaker sends the algorithm the <code>SIGTERM</code> signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost. </p>
        pub fn set_stopping_condition(
            mut self,
            input: std::option::Option<crate::model::StoppingCondition>,
        ) -> Self {
            self.stopping_condition = input;
            self
        }
        /// <p>A timestamp that indicates when the training job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the training job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Indicates the time when the training job starts on training instances. You are billed for the time interval between this time and the value of <code>TrainingEndTime</code>. The start time in CloudWatch Logs might be later than this time. The difference is due to the time it takes to download the training data and to the size of the training container.</p>
        pub fn training_start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.training_start_time = Some(input);
            self
        }
        /// <p>Indicates the time when the training job starts on training instances. You are billed for the time interval between this time and the value of <code>TrainingEndTime</code>. The start time in CloudWatch Logs might be later than this time. The difference is due to the time it takes to download the training data and to the size of the training container.</p>
        pub fn set_training_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.training_start_time = input;
            self
        }
        /// <p>Indicates the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
        pub fn training_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.training_end_time = Some(input);
            self
        }
        /// <p>Indicates the time when the training job ends on training instances. You are billed for the time interval between the value of <code>TrainingStartTime</code> and this time. For successful jobs and stopped jobs, this is the time after model artifacts are uploaded. For failed jobs, this is the time when SageMaker detects a job failure.</p>
        pub fn set_training_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.training_end_time = input;
            self
        }
        /// <p>A timestamp that indicates when the status of the training job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the status of the training job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Appends an item to `secondary_status_transitions`.
        ///
        /// To override the contents of this collection use [`set_secondary_status_transitions`](Self::set_secondary_status_transitions).
        ///
        /// <p>A history of all of the secondary statuses that the training job has transitioned through.</p>
        pub fn secondary_status_transitions(
            mut self,
            input: crate::model::SecondaryStatusTransition,
        ) -> Self {
            let mut v = self.secondary_status_transitions.unwrap_or_default();
            v.push(input);
            self.secondary_status_transitions = Some(v);
            self
        }
        /// <p>A history of all of the secondary statuses that the training job has transitioned through.</p>
        pub fn set_secondary_status_transitions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::SecondaryStatusTransition>>,
        ) -> Self {
            self.secondary_status_transitions = input;
            self
        }
        /// Appends an item to `final_metric_data_list`.
        ///
        /// To override the contents of this collection use [`set_final_metric_data_list`](Self::set_final_metric_data_list).
        ///
        /// <p>A list of final metric values that are set when the training job completes. Used only if the training job was configured to use metrics.</p>
        pub fn final_metric_data_list(mut self, input: crate::model::MetricData) -> Self {
            let mut v = self.final_metric_data_list.unwrap_or_default();
            v.push(input);
            self.final_metric_data_list = Some(v);
            self
        }
        /// <p>A list of final metric values that are set when the training job completes. Used only if the training job was configured to use metrics.</p>
        pub fn set_final_metric_data_list(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MetricData>>,
        ) -> Self {
            self.final_metric_data_list = input;
            self
        }
        /// <p>If the <code>TrainingJob</code> was created with network isolation, the value is set to <code>true</code>. If network isolation is enabled, nodes can't communicate beyond the VPC they run in.</p>
        pub fn enable_network_isolation(mut self, input: bool) -> Self {
            self.enable_network_isolation = Some(input);
            self
        }
        /// <p>If the <code>TrainingJob</code> was created with network isolation, the value is set to <code>true</code>. If network isolation is enabled, nodes can't communicate beyond the VPC they run in.</p>
        pub fn set_enable_network_isolation(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_network_isolation = input;
            self
        }
        /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
        pub fn enable_inter_container_traffic_encryption(mut self, input: bool) -> Self {
            self.enable_inter_container_traffic_encryption = Some(input);
            self
        }
        /// <p>To encrypt all communications between ML compute instances in distributed training, choose <code>True</code>. Encryption provides greater security for distributed training, but training might take longer. How long it takes depends on the amount of communication between compute instances, especially if you use a deep learning algorithm in distributed training.</p>
        pub fn set_enable_inter_container_traffic_encryption(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_inter_container_traffic_encryption = input;
            self
        }
        /// <p>When true, enables managed spot training using Amazon EC2 Spot instances to run training jobs instead of on-demand instances. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-managed-spot-training.html">Managed Spot Training</a>.</p>
        pub fn enable_managed_spot_training(mut self, input: bool) -> Self {
            self.enable_managed_spot_training = Some(input);
            self
        }
        /// <p>When true, enables managed spot training using Amazon EC2 Spot instances to run training jobs instead of on-demand instances. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/model-managed-spot-training.html">Managed Spot Training</a>.</p>
        pub fn set_enable_managed_spot_training(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_managed_spot_training = input;
            self
        }
        /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
        pub fn checkpoint_config(mut self, input: crate::model::CheckpointConfig) -> Self {
            self.checkpoint_config = Some(input);
            self
        }
        /// <p>Contains information about the output location for managed spot training checkpoint data. </p>
        pub fn set_checkpoint_config(
            mut self,
            input: std::option::Option<crate::model::CheckpointConfig>,
        ) -> Self {
            self.checkpoint_config = input;
            self
        }
        /// <p>The training time in seconds.</p>
        pub fn training_time_in_seconds(mut self, input: i32) -> Self {
            self.training_time_in_seconds = Some(input);
            self
        }
        /// <p>The training time in seconds.</p>
        pub fn set_training_time_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.training_time_in_seconds = input;
            self
        }
        /// <p>The billable time in seconds.</p>
        pub fn billable_time_in_seconds(mut self, input: i32) -> Self {
            self.billable_time_in_seconds = Some(input);
            self
        }
        /// <p>The billable time in seconds.</p>
        pub fn set_billable_time_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.billable_time_in_seconds = input;
            self
        }
        /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters, metric and tensor collections, and storage paths. To learn more about how to configure the <code>DebugHookConfig</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>.</p>
        pub fn debug_hook_config(mut self, input: crate::model::DebugHookConfig) -> Self {
            self.debug_hook_config = Some(input);
            self
        }
        /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters, metric and tensor collections, and storage paths. To learn more about how to configure the <code>DebugHookConfig</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>.</p>
        pub fn set_debug_hook_config(
            mut self,
            input: std::option::Option<crate::model::DebugHookConfig>,
        ) -> Self {
            self.debug_hook_config = input;
            self
        }
        /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
        /// <ul>
        /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
        /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
        /// <li> <p> <code>CreateTransformJob</code> </p> </li>
        /// </ul>
        pub fn experiment_config(mut self, input: crate::model::ExperimentConfig) -> Self {
            self.experiment_config = Some(input);
            self
        }
        /// <p>Associates a SageMaker job as a trial component with an experiment and trial. Specified when you call the following APIs:</p>
        /// <ul>
        /// <li> <p> <code>CreateProcessingJob</code> </p> </li>
        /// <li> <p> <code>CreateTrainingJob</code> </p> </li>
        /// <li> <p> <code>CreateTransformJob</code> </p> </li>
        /// </ul>
        pub fn set_experiment_config(
            mut self,
            input: std::option::Option<crate::model::ExperimentConfig>,
        ) -> Self {
            self.experiment_config = input;
            self
        }
        /// Appends an item to `debug_rule_configurations`.
        ///
        /// To override the contents of this collection use [`set_debug_rule_configurations`](Self::set_debug_rule_configurations).
        ///
        /// <p>Information about the debug rule configuration.</p>
        pub fn debug_rule_configurations(
            mut self,
            input: crate::model::DebugRuleConfiguration,
        ) -> Self {
            let mut v = self.debug_rule_configurations.unwrap_or_default();
            v.push(input);
            self.debug_rule_configurations = Some(v);
            self
        }
        /// <p>Information about the debug rule configuration.</p>
        pub fn set_debug_rule_configurations(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::DebugRuleConfiguration>>,
        ) -> Self {
            self.debug_rule_configurations = input;
            self
        }
        /// <p>Configuration of storage locations for the Amazon SageMaker Debugger TensorBoard output data.</p>
        pub fn tensor_board_output_config(
            mut self,
            input: crate::model::TensorBoardOutputConfig,
        ) -> Self {
            self.tensor_board_output_config = Some(input);
            self
        }
        /// <p>Configuration of storage locations for the Amazon SageMaker Debugger TensorBoard output data.</p>
        pub fn set_tensor_board_output_config(
            mut self,
            input: std::option::Option<crate::model::TensorBoardOutputConfig>,
        ) -> Self {
            self.tensor_board_output_config = input;
            self
        }
        /// Appends an item to `debug_rule_evaluation_statuses`.
        ///
        /// To override the contents of this collection use [`set_debug_rule_evaluation_statuses`](Self::set_debug_rule_evaluation_statuses).
        ///
        /// <p>Information about the evaluation status of the rules for the training job.</p>
        pub fn debug_rule_evaluation_statuses(
            mut self,
            input: crate::model::DebugRuleEvaluationStatus,
        ) -> Self {
            let mut v = self.debug_rule_evaluation_statuses.unwrap_or_default();
            v.push(input);
            self.debug_rule_evaluation_statuses = Some(v);
            self
        }
        /// <p>Information about the evaluation status of the rules for the training job.</p>
        pub fn set_debug_rule_evaluation_statuses(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::DebugRuleEvaluationStatus>>,
        ) -> Self {
            self.debug_rule_evaluation_statuses = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>The environment variables to set in the Docker container.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>The environment variables to set in the Docker container.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
        pub fn retry_strategy(mut self, input: crate::model::RetryStrategy) -> Self {
            self.retry_strategy = Some(input);
            self
        }
        /// <p>The number of times to retry the job when the job fails due to an <code>InternalServerError</code>.</p>
        pub fn set_retry_strategy(
            mut self,
            input: std::option::Option<crate::model::RetryStrategy>,
        ) -> Self {
            self.retry_strategy = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>An array of key-value pairs. You can use tags to categorize your Amazon Web Services resources in different ways, for example, by purpose, owner, or environment. For more information, see <a href="https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html">Tagging Amazon Web Services Resources</a>.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`TrainingJob`](crate::model::TrainingJob).
        pub fn build(self) -> crate::model::TrainingJob {
            crate::model::TrainingJob {
                training_job_name: self.training_job_name,
                training_job_arn: self.training_job_arn,
                tuning_job_arn: self.tuning_job_arn,
                labeling_job_arn: self.labeling_job_arn,
                auto_ml_job_arn: self.auto_ml_job_arn,
                model_artifacts: self.model_artifacts,
                training_job_status: self.training_job_status,
                secondary_status: self.secondary_status,
                failure_reason: self.failure_reason,
                hyper_parameters: self.hyper_parameters,
                algorithm_specification: self.algorithm_specification,
                role_arn: self.role_arn,
                input_data_config: self.input_data_config,
                output_data_config: self.output_data_config,
                resource_config: self.resource_config,
                vpc_config: self.vpc_config,
                stopping_condition: self.stopping_condition,
                creation_time: self.creation_time,
                training_start_time: self.training_start_time,
                training_end_time: self.training_end_time,
                last_modified_time: self.last_modified_time,
                secondary_status_transitions: self.secondary_status_transitions,
                final_metric_data_list: self.final_metric_data_list,
                enable_network_isolation: self.enable_network_isolation.unwrap_or_default(),
                enable_inter_container_traffic_encryption: self
                    .enable_inter_container_traffic_encryption
                    .unwrap_or_default(),
                enable_managed_spot_training: self.enable_managed_spot_training.unwrap_or_default(),
                checkpoint_config: self.checkpoint_config,
                training_time_in_seconds: self.training_time_in_seconds,
                billable_time_in_seconds: self.billable_time_in_seconds,
                debug_hook_config: self.debug_hook_config,
                experiment_config: self.experiment_config,
                debug_rule_configurations: self.debug_rule_configurations,
                tensor_board_output_config: self.tensor_board_output_config,
                debug_rule_evaluation_statuses: self.debug_rule_evaluation_statuses,
                environment: self.environment,
                retry_strategy: self.retry_strategy,
                tags: self.tags,
            }
        }
    }
}
impl TrainingJob {
    /// Creates a new builder-style object to manufacture [`TrainingJob`](crate::model::TrainingJob).
    pub fn builder() -> crate::model::training_job::Builder {
        crate::model::training_job::Builder::default()
    }
}

/// <p>Information about the status of the rule evaluation.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DebugRuleEvaluationStatus {
    /// <p>The name of the rule configuration.</p>
    #[doc(hidden)]
    pub rule_configuration_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
    #[doc(hidden)]
    pub rule_evaluation_job_arn: std::option::Option<std::string::String>,
    /// <p>Status of the rule evaluation.</p>
    #[doc(hidden)]
    pub rule_evaluation_status: std::option::Option<crate::model::RuleEvaluationStatus>,
    /// <p>Details from the rule evaluation.</p>
    #[doc(hidden)]
    pub status_details: std::option::Option<std::string::String>,
    /// <p>Timestamp when the rule evaluation status was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl DebugRuleEvaluationStatus {
    /// <p>The name of the rule configuration.</p>
    pub fn rule_configuration_name(&self) -> std::option::Option<&str> {
        self.rule_configuration_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
    pub fn rule_evaluation_job_arn(&self) -> std::option::Option<&str> {
        self.rule_evaluation_job_arn.as_deref()
    }
    /// <p>Status of the rule evaluation.</p>
    pub fn rule_evaluation_status(
        &self,
    ) -> std::option::Option<&crate::model::RuleEvaluationStatus> {
        self.rule_evaluation_status.as_ref()
    }
    /// <p>Details from the rule evaluation.</p>
    pub fn status_details(&self) -> std::option::Option<&str> {
        self.status_details.as_deref()
    }
    /// <p>Timestamp when the rule evaluation status was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`DebugRuleEvaluationStatus`](crate::model::DebugRuleEvaluationStatus).
pub mod debug_rule_evaluation_status {

    /// A builder for [`DebugRuleEvaluationStatus`](crate::model::DebugRuleEvaluationStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) rule_configuration_name: std::option::Option<std::string::String>,
        pub(crate) rule_evaluation_job_arn: std::option::Option<std::string::String>,
        pub(crate) rule_evaluation_status: std::option::Option<crate::model::RuleEvaluationStatus>,
        pub(crate) status_details: std::option::Option<std::string::String>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the rule configuration.</p>
        pub fn rule_configuration_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_configuration_name = Some(input.into());
            self
        }
        /// <p>The name of the rule configuration.</p>
        pub fn set_rule_configuration_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_configuration_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
        pub fn rule_evaluation_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_evaluation_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
        pub fn set_rule_evaluation_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_evaluation_job_arn = input;
            self
        }
        /// <p>Status of the rule evaluation.</p>
        pub fn rule_evaluation_status(mut self, input: crate::model::RuleEvaluationStatus) -> Self {
            self.rule_evaluation_status = Some(input);
            self
        }
        /// <p>Status of the rule evaluation.</p>
        pub fn set_rule_evaluation_status(
            mut self,
            input: std::option::Option<crate::model::RuleEvaluationStatus>,
        ) -> Self {
            self.rule_evaluation_status = input;
            self
        }
        /// <p>Details from the rule evaluation.</p>
        pub fn status_details(mut self, input: impl Into<std::string::String>) -> Self {
            self.status_details = Some(input.into());
            self
        }
        /// <p>Details from the rule evaluation.</p>
        pub fn set_status_details(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.status_details = input;
            self
        }
        /// <p>Timestamp when the rule evaluation status was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>Timestamp when the rule evaluation status was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`DebugRuleEvaluationStatus`](crate::model::DebugRuleEvaluationStatus).
        pub fn build(self) -> crate::model::DebugRuleEvaluationStatus {
            crate::model::DebugRuleEvaluationStatus {
                rule_configuration_name: self.rule_configuration_name,
                rule_evaluation_job_arn: self.rule_evaluation_job_arn,
                rule_evaluation_status: self.rule_evaluation_status,
                status_details: self.status_details,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl DebugRuleEvaluationStatus {
    /// Creates a new builder-style object to manufacture [`DebugRuleEvaluationStatus`](crate::model::DebugRuleEvaluationStatus).
    pub fn builder() -> crate::model::debug_rule_evaluation_status::Builder {
        crate::model::debug_rule_evaluation_status::Builder::default()
    }
}

/// When writing a match expression against `RuleEvaluationStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let ruleevaluationstatus = unimplemented!();
/// match ruleevaluationstatus {
///     RuleEvaluationStatus::Error => { /* ... */ },
///     RuleEvaluationStatus::InProgress => { /* ... */ },
///     RuleEvaluationStatus::IssuesFound => { /* ... */ },
///     RuleEvaluationStatus::NoIssuesFound => { /* ... */ },
///     RuleEvaluationStatus::Stopped => { /* ... */ },
///     RuleEvaluationStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `ruleevaluationstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RuleEvaluationStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RuleEvaluationStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RuleEvaluationStatus::NewFeature` is defined.
/// Specifically, when `ruleevaluationstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RuleEvaluationStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RuleEvaluationStatus {
    #[allow(missing_docs)] // documentation missing in model
    Error,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    IssuesFound,
    #[allow(missing_docs)] // documentation missing in model
    NoIssuesFound,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RuleEvaluationStatus {
    fn from(s: &str) -> Self {
        match s {
            "Error" => RuleEvaluationStatus::Error,
            "InProgress" => RuleEvaluationStatus::InProgress,
            "IssuesFound" => RuleEvaluationStatus::IssuesFound,
            "NoIssuesFound" => RuleEvaluationStatus::NoIssuesFound,
            "Stopped" => RuleEvaluationStatus::Stopped,
            "Stopping" => RuleEvaluationStatus::Stopping,
            other => {
                RuleEvaluationStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for RuleEvaluationStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RuleEvaluationStatus::from(s))
    }
}
impl RuleEvaluationStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RuleEvaluationStatus::Error => "Error",
            RuleEvaluationStatus::InProgress => "InProgress",
            RuleEvaluationStatus::IssuesFound => "IssuesFound",
            RuleEvaluationStatus::NoIssuesFound => "NoIssuesFound",
            RuleEvaluationStatus::Stopped => "Stopped",
            RuleEvaluationStatus::Stopping => "Stopping",
            RuleEvaluationStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Error",
            "InProgress",
            "IssuesFound",
            "NoIssuesFound",
            "Stopped",
            "Stopping",
        ]
    }
}
impl AsRef<str> for RuleEvaluationStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration of storage locations for the Amazon SageMaker Debugger TensorBoard output data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TensorBoardOutputConfig {
    /// <p>Path to local storage location for tensorBoard output. Defaults to <code>/opt/ml/output/tensorboard</code>.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Path to Amazon S3 storage location for TensorBoard output.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
}
impl TensorBoardOutputConfig {
    /// <p>Path to local storage location for tensorBoard output. Defaults to <code>/opt/ml/output/tensorboard</code>.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Path to Amazon S3 storage location for TensorBoard output.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
}
/// See [`TensorBoardOutputConfig`](crate::model::TensorBoardOutputConfig).
pub mod tensor_board_output_config {

    /// A builder for [`TensorBoardOutputConfig`](crate::model::TensorBoardOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Path to local storage location for tensorBoard output. Defaults to <code>/opt/ml/output/tensorboard</code>.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>Path to local storage location for tensorBoard output. Defaults to <code>/opt/ml/output/tensorboard</code>.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Path to Amazon S3 storage location for TensorBoard output.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Path to Amazon S3 storage location for TensorBoard output.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// Consumes the builder and constructs a [`TensorBoardOutputConfig`](crate::model::TensorBoardOutputConfig).
        pub fn build(self) -> crate::model::TensorBoardOutputConfig {
            crate::model::TensorBoardOutputConfig {
                local_path: self.local_path,
                s3_output_path: self.s3_output_path,
            }
        }
    }
}
impl TensorBoardOutputConfig {
    /// Creates a new builder-style object to manufacture [`TensorBoardOutputConfig`](crate::model::TensorBoardOutputConfig).
    pub fn builder() -> crate::model::tensor_board_output_config::Builder {
        crate::model::tensor_board_output_config::Builder::default()
    }
}

/// <p>Configuration information for SageMaker Debugger rules for debugging. To learn more about how to configure the <code>DebugRuleConfiguration</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DebugRuleConfiguration {
    /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
    #[doc(hidden)]
    pub rule_configuration_name: std::option::Option<std::string::String>,
    /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Path to Amazon S3 storage location for rules.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>The Amazon Elastic Container (ECR) Image for the managed rule evaluation.</p>
    #[doc(hidden)]
    pub rule_evaluator_image: std::option::Option<std::string::String>,
    /// <p>The instance type to deploy a custom rule for debugging a training job.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
    /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
    #[doc(hidden)]
    pub volume_size_in_gb: i32,
    /// <p>Runtime configuration for rule container.</p>
    #[doc(hidden)]
    pub rule_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl DebugRuleConfiguration {
    /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
    pub fn rule_configuration_name(&self) -> std::option::Option<&str> {
        self.rule_configuration_name.as_deref()
    }
    /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Path to Amazon S3 storage location for rules.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>The Amazon Elastic Container (ECR) Image for the managed rule evaluation.</p>
    pub fn rule_evaluator_image(&self) -> std::option::Option<&str> {
        self.rule_evaluator_image.as_deref()
    }
    /// <p>The instance type to deploy a custom rule for debugging a training job.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::ProcessingInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
    pub fn volume_size_in_gb(&self) -> i32 {
        self.volume_size_in_gb
    }
    /// <p>Runtime configuration for rule container.</p>
    pub fn rule_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.rule_parameters.as_ref()
    }
}
/// See [`DebugRuleConfiguration`](crate::model::DebugRuleConfiguration).
pub mod debug_rule_configuration {

    /// A builder for [`DebugRuleConfiguration`](crate::model::DebugRuleConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) rule_configuration_name: std::option::Option<std::string::String>,
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) rule_evaluator_image: std::option::Option<std::string::String>,
        pub(crate) instance_type: std::option::Option<crate::model::ProcessingInstanceType>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) rule_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
        pub fn rule_configuration_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_configuration_name = Some(input.into());
            self
        }
        /// <p>The name of the rule configuration. It must be unique relative to other rule configuration names.</p>
        pub fn set_rule_configuration_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_configuration_name = input;
            self
        }
        /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>Path to local storage location for output of rules. Defaults to <code>/opt/ml/processing/output/rule/</code>.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Path to Amazon S3 storage location for rules.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Path to Amazon S3 storage location for rules.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>The Amazon Elastic Container (ECR) Image for the managed rule evaluation.</p>
        pub fn rule_evaluator_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_evaluator_image = Some(input.into());
            self
        }
        /// <p>The Amazon Elastic Container (ECR) Image for the managed rule evaluation.</p>
        pub fn set_rule_evaluator_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_evaluator_image = input;
            self
        }
        /// <p>The instance type to deploy a custom rule for debugging a training job.</p>
        pub fn instance_type(mut self, input: crate::model::ProcessingInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type to deploy a custom rule for debugging a training job.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProcessingInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The size, in GB, of the ML storage volume attached to the processing instance.</p>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// Adds a key-value pair to `rule_parameters`.
        ///
        /// To override the contents of this collection use [`set_rule_parameters`](Self::set_rule_parameters).
        ///
        /// <p>Runtime configuration for rule container.</p>
        pub fn rule_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.rule_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.rule_parameters = Some(hash_map);
            self
        }
        /// <p>Runtime configuration for rule container.</p>
        pub fn set_rule_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.rule_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`DebugRuleConfiguration`](crate::model::DebugRuleConfiguration).
        pub fn build(self) -> crate::model::DebugRuleConfiguration {
            crate::model::DebugRuleConfiguration {
                rule_configuration_name: self.rule_configuration_name,
                local_path: self.local_path,
                s3_output_path: self.s3_output_path,
                rule_evaluator_image: self.rule_evaluator_image,
                instance_type: self.instance_type,
                volume_size_in_gb: self.volume_size_in_gb.unwrap_or_default(),
                rule_parameters: self.rule_parameters,
            }
        }
    }
}
impl DebugRuleConfiguration {
    /// Creates a new builder-style object to manufacture [`DebugRuleConfiguration`](crate::model::DebugRuleConfiguration).
    pub fn builder() -> crate::model::debug_rule_configuration::Builder {
        crate::model::debug_rule_configuration::Builder::default()
    }
}

/// <p>Configuration information for the Amazon SageMaker Debugger hook parameters, metric and tensor collections, and storage paths. To learn more about how to configure the <code>DebugHookConfig</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DebugHookConfig {
    /// <p>Path to local storage location for metrics and tensors. Defaults to <code>/opt/ml/output/tensors/</code>.</p>
    #[doc(hidden)]
    pub local_path: std::option::Option<std::string::String>,
    /// <p>Path to Amazon S3 storage location for metrics and tensors.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters.</p>
    #[doc(hidden)]
    pub hook_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Configuration information for Amazon SageMaker Debugger tensor collections. To learn more about how to configure the <code>CollectionConfiguration</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
    #[doc(hidden)]
    pub collection_configurations:
        std::option::Option<std::vec::Vec<crate::model::CollectionConfiguration>>,
}
impl DebugHookConfig {
    /// <p>Path to local storage location for metrics and tensors. Defaults to <code>/opt/ml/output/tensors/</code>.</p>
    pub fn local_path(&self) -> std::option::Option<&str> {
        self.local_path.as_deref()
    }
    /// <p>Path to Amazon S3 storage location for metrics and tensors.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters.</p>
    pub fn hook_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.hook_parameters.as_ref()
    }
    /// <p>Configuration information for Amazon SageMaker Debugger tensor collections. To learn more about how to configure the <code>CollectionConfiguration</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
    pub fn collection_configurations(
        &self,
    ) -> std::option::Option<&[crate::model::CollectionConfiguration]> {
        self.collection_configurations.as_deref()
    }
}
/// See [`DebugHookConfig`](crate::model::DebugHookConfig).
pub mod debug_hook_config {

    /// A builder for [`DebugHookConfig`](crate::model::DebugHookConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) local_path: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) hook_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) collection_configurations:
            std::option::Option<std::vec::Vec<crate::model::CollectionConfiguration>>,
    }
    impl Builder {
        /// <p>Path to local storage location for metrics and tensors. Defaults to <code>/opt/ml/output/tensors/</code>.</p>
        pub fn local_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.local_path = Some(input.into());
            self
        }
        /// <p>Path to local storage location for metrics and tensors. Defaults to <code>/opt/ml/output/tensors/</code>.</p>
        pub fn set_local_path(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.local_path = input;
            self
        }
        /// <p>Path to Amazon S3 storage location for metrics and tensors.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Path to Amazon S3 storage location for metrics and tensors.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// Adds a key-value pair to `hook_parameters`.
        ///
        /// To override the contents of this collection use [`set_hook_parameters`](Self::set_hook_parameters).
        ///
        /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters.</p>
        pub fn hook_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.hook_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.hook_parameters = Some(hash_map);
            self
        }
        /// <p>Configuration information for the Amazon SageMaker Debugger hook parameters.</p>
        pub fn set_hook_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.hook_parameters = input;
            self
        }
        /// Appends an item to `collection_configurations`.
        ///
        /// To override the contents of this collection use [`set_collection_configurations`](Self::set_collection_configurations).
        ///
        /// <p>Configuration information for Amazon SageMaker Debugger tensor collections. To learn more about how to configure the <code>CollectionConfiguration</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
        pub fn collection_configurations(
            mut self,
            input: crate::model::CollectionConfiguration,
        ) -> Self {
            let mut v = self.collection_configurations.unwrap_or_default();
            v.push(input);
            self.collection_configurations = Some(v);
            self
        }
        /// <p>Configuration information for Amazon SageMaker Debugger tensor collections. To learn more about how to configure the <code>CollectionConfiguration</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
        pub fn set_collection_configurations(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CollectionConfiguration>>,
        ) -> Self {
            self.collection_configurations = input;
            self
        }
        /// Consumes the builder and constructs a [`DebugHookConfig`](crate::model::DebugHookConfig).
        pub fn build(self) -> crate::model::DebugHookConfig {
            crate::model::DebugHookConfig {
                local_path: self.local_path,
                s3_output_path: self.s3_output_path,
                hook_parameters: self.hook_parameters,
                collection_configurations: self.collection_configurations,
            }
        }
    }
}
impl DebugHookConfig {
    /// Creates a new builder-style object to manufacture [`DebugHookConfig`](crate::model::DebugHookConfig).
    pub fn builder() -> crate::model::debug_hook_config::Builder {
        crate::model::debug_hook_config::Builder::default()
    }
}

/// <p>Configuration information for the Amazon SageMaker Debugger output tensor collections.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CollectionConfiguration {
    /// <p>The name of the tensor collection. The name must be unique relative to other rule configuration names.</p>
    #[doc(hidden)]
    pub collection_name: std::option::Option<std::string::String>,
    /// <p>Parameter values for the tensor collection. The allowed parameters are <code>"name"</code>, <code>"include_regex"</code>, <code>"reduction_config"</code>, <code>"save_config"</code>, <code>"tensor_names"</code>, and <code>"save_histogram"</code>.</p>
    #[doc(hidden)]
    pub collection_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl CollectionConfiguration {
    /// <p>The name of the tensor collection. The name must be unique relative to other rule configuration names.</p>
    pub fn collection_name(&self) -> std::option::Option<&str> {
        self.collection_name.as_deref()
    }
    /// <p>Parameter values for the tensor collection. The allowed parameters are <code>"name"</code>, <code>"include_regex"</code>, <code>"reduction_config"</code>, <code>"save_config"</code>, <code>"tensor_names"</code>, and <code>"save_histogram"</code>.</p>
    pub fn collection_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.collection_parameters.as_ref()
    }
}
/// See [`CollectionConfiguration`](crate::model::CollectionConfiguration).
pub mod collection_configuration {

    /// A builder for [`CollectionConfiguration`](crate::model::CollectionConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) collection_name: std::option::Option<std::string::String>,
        pub(crate) collection_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The name of the tensor collection. The name must be unique relative to other rule configuration names.</p>
        pub fn collection_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.collection_name = Some(input.into());
            self
        }
        /// <p>The name of the tensor collection. The name must be unique relative to other rule configuration names.</p>
        pub fn set_collection_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.collection_name = input;
            self
        }
        /// Adds a key-value pair to `collection_parameters`.
        ///
        /// To override the contents of this collection use [`set_collection_parameters`](Self::set_collection_parameters).
        ///
        /// <p>Parameter values for the tensor collection. The allowed parameters are <code>"name"</code>, <code>"include_regex"</code>, <code>"reduction_config"</code>, <code>"save_config"</code>, <code>"tensor_names"</code>, and <code>"save_histogram"</code>.</p>
        pub fn collection_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.collection_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.collection_parameters = Some(hash_map);
            self
        }
        /// <p>Parameter values for the tensor collection. The allowed parameters are <code>"name"</code>, <code>"include_regex"</code>, <code>"reduction_config"</code>, <code>"save_config"</code>, <code>"tensor_names"</code>, and <code>"save_histogram"</code>.</p>
        pub fn set_collection_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.collection_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`CollectionConfiguration`](crate::model::CollectionConfiguration).
        pub fn build(self) -> crate::model::CollectionConfiguration {
            crate::model::CollectionConfiguration {
                collection_name: self.collection_name,
                collection_parameters: self.collection_parameters,
            }
        }
    }
}
impl CollectionConfiguration {
    /// Creates a new builder-style object to manufacture [`CollectionConfiguration`](crate::model::CollectionConfiguration).
    pub fn builder() -> crate::model::collection_configuration::Builder {
        crate::model::collection_configuration::Builder::default()
    }
}

/// <p>The name, value, and date and time of a metric that was emitted to Amazon CloudWatch.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MetricData {
    /// <p>The name of the metric.</p>
    #[doc(hidden)]
    pub metric_name: std::option::Option<std::string::String>,
    /// <p>The value of the metric.</p>
    #[doc(hidden)]
    pub value: f32,
    /// <p>The date and time that the algorithm emitted the metric.</p>
    #[doc(hidden)]
    pub timestamp: std::option::Option<aws_smithy_types::DateTime>,
}
impl MetricData {
    /// <p>The name of the metric.</p>
    pub fn metric_name(&self) -> std::option::Option<&str> {
        self.metric_name.as_deref()
    }
    /// <p>The value of the metric.</p>
    pub fn value(&self) -> f32 {
        self.value
    }
    /// <p>The date and time that the algorithm emitted the metric.</p>
    pub fn timestamp(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.timestamp.as_ref()
    }
}
/// See [`MetricData`](crate::model::MetricData).
pub mod metric_data {

    /// A builder for [`MetricData`](crate::model::MetricData).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metric_name: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<f32>,
        pub(crate) timestamp: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the metric.</p>
        pub fn metric_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.metric_name = Some(input.into());
            self
        }
        /// <p>The name of the metric.</p>
        pub fn set_metric_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.metric_name = input;
            self
        }
        /// <p>The value of the metric.</p>
        pub fn value(mut self, input: f32) -> Self {
            self.value = Some(input);
            self
        }
        /// <p>The value of the metric.</p>
        pub fn set_value(mut self, input: std::option::Option<f32>) -> Self {
            self.value = input;
            self
        }
        /// <p>The date and time that the algorithm emitted the metric.</p>
        pub fn timestamp(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.timestamp = Some(input);
            self
        }
        /// <p>The date and time that the algorithm emitted the metric.</p>
        pub fn set_timestamp(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.timestamp = input;
            self
        }
        /// Consumes the builder and constructs a [`MetricData`](crate::model::MetricData).
        pub fn build(self) -> crate::model::MetricData {
            crate::model::MetricData {
                metric_name: self.metric_name,
                value: self.value.unwrap_or_default(),
                timestamp: self.timestamp,
            }
        }
    }
}
impl MetricData {
    /// Creates a new builder-style object to manufacture [`MetricData`](crate::model::MetricData).
    pub fn builder() -> crate::model::metric_data::Builder {
        crate::model::metric_data::Builder::default()
    }
}

/// <p>An array element of <code>DescribeTrainingJobResponse$SecondaryStatusTransitions</code>. It provides additional details about a status that the training job has transitioned through. A training job can be in one of several states, for example, starting, downloading, training, or uploading. Within each state, there are a number of intermediate states. For example, within the starting state, SageMaker could be starting the training job or launching the ML instances. These transitional states are referred to as the job's secondary status. </p>
/// <p></p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SecondaryStatusTransition {
    /// <p>Contains a secondary status information from a training job.</p>
    /// <p>Status might be one of the following secondary statuses:</p>
    /// <dl>
    /// <dt>
    /// InProgress
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
    /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
    /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
    /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Completed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Failed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopped
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
    /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopping
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
    /// </ul>
    /// </dd>
    /// </dl>
    /// <p>We no longer support the following secondary statuses:</p>
    /// <ul>
    /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
    /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
    /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::SecondaryStatus>,
    /// <p>A timestamp that shows when the training job transitioned to the current secondary status state.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that shows when the training job transitioned out of this secondary status state into another secondary status state or when the training job has ended.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A detailed description of the progress within a secondary status. </p>
    /// <p>SageMaker provides secondary statuses and status messages that apply to each of them:</p>
    /// <dl>
    /// <dt>
    /// Starting
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p>Starting the training job.</p> </li>
    /// <li> <p>Launching requested ML instances.</p> </li>
    /// <li> <p>Insufficient capacity error from EC2 while launching instances, retrying!</p> </li>
    /// <li> <p>Launched instance was unhealthy, replacing it!</p> </li>
    /// <li> <p>Preparing the instances for training.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Training
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p>Downloading the training image.</p> </li>
    /// <li> <p>Training image download completed. Training in progress.</p> </li>
    /// </ul>
    /// </dd>
    /// </dl> <important>
    /// <p>Status messages are subject to change. Therefore, we recommend not including them in code that programmatically initiates actions. For examples, don't use status messages in if statements.</p>
    /// </important>
    /// <p>To have an overview of your training job's progress, view <code>TrainingJobStatus</code> and <code>SecondaryStatus</code> in <code>DescribeTrainingJob</code>, and <code>StatusMessage</code> together. For example, at the start of a training job, you might see the following:</p>
    /// <ul>
    /// <li> <p> <code>TrainingJobStatus</code> - InProgress</p> </li>
    /// <li> <p> <code>SecondaryStatus</code> - Training</p> </li>
    /// <li> <p> <code>StatusMessage</code> - Downloading the training image</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub status_message: std::option::Option<std::string::String>,
}
impl SecondaryStatusTransition {
    /// <p>Contains a secondary status information from a training job.</p>
    /// <p>Status might be one of the following secondary statuses:</p>
    /// <dl>
    /// <dt>
    /// InProgress
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
    /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
    /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
    /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Completed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Failed
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopped
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
    /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Stopping
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
    /// </ul>
    /// </dd>
    /// </dl>
    /// <p>We no longer support the following secondary statuses:</p>
    /// <ul>
    /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
    /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
    /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
    /// </ul>
    pub fn status(&self) -> std::option::Option<&crate::model::SecondaryStatus> {
        self.status.as_ref()
    }
    /// <p>A timestamp that shows when the training job transitioned to the current secondary status state.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>A timestamp that shows when the training job transitioned out of this secondary status state into another secondary status state or when the training job has ended.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
    /// <p>A detailed description of the progress within a secondary status. </p>
    /// <p>SageMaker provides secondary statuses and status messages that apply to each of them:</p>
    /// <dl>
    /// <dt>
    /// Starting
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p>Starting the training job.</p> </li>
    /// <li> <p>Launching requested ML instances.</p> </li>
    /// <li> <p>Insufficient capacity error from EC2 while launching instances, retrying!</p> </li>
    /// <li> <p>Launched instance was unhealthy, replacing it!</p> </li>
    /// <li> <p>Preparing the instances for training.</p> </li>
    /// </ul>
    /// </dd>
    /// <dt>
    /// Training
    /// </dt>
    /// <dd>
    /// <ul>
    /// <li> <p>Downloading the training image.</p> </li>
    /// <li> <p>Training image download completed. Training in progress.</p> </li>
    /// </ul>
    /// </dd>
    /// </dl> <important>
    /// <p>Status messages are subject to change. Therefore, we recommend not including them in code that programmatically initiates actions. For examples, don't use status messages in if statements.</p>
    /// </important>
    /// <p>To have an overview of your training job's progress, view <code>TrainingJobStatus</code> and <code>SecondaryStatus</code> in <code>DescribeTrainingJob</code>, and <code>StatusMessage</code> together. For example, at the start of a training job, you might see the following:</p>
    /// <ul>
    /// <li> <p> <code>TrainingJobStatus</code> - InProgress</p> </li>
    /// <li> <p> <code>SecondaryStatus</code> - Training</p> </li>
    /// <li> <p> <code>StatusMessage</code> - Downloading the training image</p> </li>
    /// </ul>
    pub fn status_message(&self) -> std::option::Option<&str> {
        self.status_message.as_deref()
    }
}
/// See [`SecondaryStatusTransition`](crate::model::SecondaryStatusTransition).
pub mod secondary_status_transition {

    /// A builder for [`SecondaryStatusTransition`](crate::model::SecondaryStatusTransition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) status: std::option::Option<crate::model::SecondaryStatus>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) status_message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Contains a secondary status information from a training job.</p>
        /// <p>Status might be one of the following secondary statuses:</p>
        /// <dl>
        /// <dt>
        /// InProgress
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
        /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
        /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
        /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Completed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Failed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopped
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
        /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopping
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
        /// </ul>
        /// </dd>
        /// </dl>
        /// <p>We no longer support the following secondary statuses:</p>
        /// <ul>
        /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
        /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
        /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
        /// </ul>
        pub fn status(mut self, input: crate::model::SecondaryStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>Contains a secondary status information from a training job.</p>
        /// <p>Status might be one of the following secondary statuses:</p>
        /// <dl>
        /// <dt>
        /// InProgress
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Starting</code> - Starting the training job.</p> </li>
        /// <li> <p> <code>Downloading</code> - An optional stage for algorithms that support <code>File</code> training input mode. It indicates that data is being downloaded to the ML storage volumes.</p> </li>
        /// <li> <p> <code>Training</code> - Training is in progress.</p> </li>
        /// <li> <p> <code>Uploading</code> - Training is complete and the model artifacts are being uploaded to the S3 location.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Completed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Completed</code> - The training job has completed.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Failed
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Failed</code> - The training job has failed. The reason for the failure is returned in the <code>FailureReason</code> field of <code>DescribeTrainingJobResponse</code>.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopped
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>MaxRuntimeExceeded</code> - The job stopped because it exceeded the maximum allowed runtime.</p> </li>
        /// <li> <p> <code>Stopped</code> - The training job has stopped.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Stopping
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p> <code>Stopping</code> - Stopping the training job.</p> </li>
        /// </ul>
        /// </dd>
        /// </dl>
        /// <p>We no longer support the following secondary statuses:</p>
        /// <ul>
        /// <li> <p> <code>LaunchingMLInstances</code> </p> </li>
        /// <li> <p> <code>PreparingTrainingStack</code> </p> </li>
        /// <li> <p> <code>DownloadingTrainingImage</code> </p> </li>
        /// </ul>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::SecondaryStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>A timestamp that shows when the training job transitioned to the current secondary status state.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the training job transitioned to the current secondary status state.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// <p>A timestamp that shows when the training job transitioned out of this secondary status state into another secondary status state or when the training job has ended.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the training job transitioned out of this secondary status state into another secondary status state or when the training job has ended.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// <p>A detailed description of the progress within a secondary status. </p>
        /// <p>SageMaker provides secondary statuses and status messages that apply to each of them:</p>
        /// <dl>
        /// <dt>
        /// Starting
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p>Starting the training job.</p> </li>
        /// <li> <p>Launching requested ML instances.</p> </li>
        /// <li> <p>Insufficient capacity error from EC2 while launching instances, retrying!</p> </li>
        /// <li> <p>Launched instance was unhealthy, replacing it!</p> </li>
        /// <li> <p>Preparing the instances for training.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Training
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p>Downloading the training image.</p> </li>
        /// <li> <p>Training image download completed. Training in progress.</p> </li>
        /// </ul>
        /// </dd>
        /// </dl> <important>
        /// <p>Status messages are subject to change. Therefore, we recommend not including them in code that programmatically initiates actions. For examples, don't use status messages in if statements.</p>
        /// </important>
        /// <p>To have an overview of your training job's progress, view <code>TrainingJobStatus</code> and <code>SecondaryStatus</code> in <code>DescribeTrainingJob</code>, and <code>StatusMessage</code> together. For example, at the start of a training job, you might see the following:</p>
        /// <ul>
        /// <li> <p> <code>TrainingJobStatus</code> - InProgress</p> </li>
        /// <li> <p> <code>SecondaryStatus</code> - Training</p> </li>
        /// <li> <p> <code>StatusMessage</code> - Downloading the training image</p> </li>
        /// </ul>
        pub fn status_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.status_message = Some(input.into());
            self
        }
        /// <p>A detailed description of the progress within a secondary status. </p>
        /// <p>SageMaker provides secondary statuses and status messages that apply to each of them:</p>
        /// <dl>
        /// <dt>
        /// Starting
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p>Starting the training job.</p> </li>
        /// <li> <p>Launching requested ML instances.</p> </li>
        /// <li> <p>Insufficient capacity error from EC2 while launching instances, retrying!</p> </li>
        /// <li> <p>Launched instance was unhealthy, replacing it!</p> </li>
        /// <li> <p>Preparing the instances for training.</p> </li>
        /// </ul>
        /// </dd>
        /// <dt>
        /// Training
        /// </dt>
        /// <dd>
        /// <ul>
        /// <li> <p>Downloading the training image.</p> </li>
        /// <li> <p>Training image download completed. Training in progress.</p> </li>
        /// </ul>
        /// </dd>
        /// </dl> <important>
        /// <p>Status messages are subject to change. Therefore, we recommend not including them in code that programmatically initiates actions. For examples, don't use status messages in if statements.</p>
        /// </important>
        /// <p>To have an overview of your training job's progress, view <code>TrainingJobStatus</code> and <code>SecondaryStatus</code> in <code>DescribeTrainingJob</code>, and <code>StatusMessage</code> together. For example, at the start of a training job, you might see the following:</p>
        /// <ul>
        /// <li> <p> <code>TrainingJobStatus</code> - InProgress</p> </li>
        /// <li> <p> <code>SecondaryStatus</code> - Training</p> </li>
        /// <li> <p> <code>StatusMessage</code> - Downloading the training image</p> </li>
        /// </ul>
        pub fn set_status_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.status_message = input;
            self
        }
        /// Consumes the builder and constructs a [`SecondaryStatusTransition`](crate::model::SecondaryStatusTransition).
        pub fn build(self) -> crate::model::SecondaryStatusTransition {
            crate::model::SecondaryStatusTransition {
                status: self.status,
                start_time: self.start_time,
                end_time: self.end_time,
                status_message: self.status_message,
            }
        }
    }
}
impl SecondaryStatusTransition {
    /// Creates a new builder-style object to manufacture [`SecondaryStatusTransition`](crate::model::SecondaryStatusTransition).
    pub fn builder() -> crate::model::secondary_status_transition::Builder {
        crate::model::secondary_status_transition::Builder::default()
    }
}

/// When writing a match expression against `SecondaryStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let secondarystatus = unimplemented!();
/// match secondarystatus {
///     SecondaryStatus::Completed => { /* ... */ },
///     SecondaryStatus::Downloading => { /* ... */ },
///     SecondaryStatus::DownloadingTrainingImage => { /* ... */ },
///     SecondaryStatus::Failed => { /* ... */ },
///     SecondaryStatus::Interrupted => { /* ... */ },
///     SecondaryStatus::LaunchingMlInstances => { /* ... */ },
///     SecondaryStatus::MaxRuntimeExceeded => { /* ... */ },
///     SecondaryStatus::MaxWaitTimeExceeded => { /* ... */ },
///     SecondaryStatus::PreparingTrainingStack => { /* ... */ },
///     SecondaryStatus::Restarting => { /* ... */ },
///     SecondaryStatus::Starting => { /* ... */ },
///     SecondaryStatus::Stopped => { /* ... */ },
///     SecondaryStatus::Stopping => { /* ... */ },
///     SecondaryStatus::Training => { /* ... */ },
///     SecondaryStatus::Updating => { /* ... */ },
///     SecondaryStatus::Uploading => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `secondarystatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SecondaryStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SecondaryStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SecondaryStatus::NewFeature` is defined.
/// Specifically, when `secondarystatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SecondaryStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SecondaryStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Downloading,
    #[allow(missing_docs)] // documentation missing in model
    DownloadingTrainingImage,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Interrupted,
    #[allow(missing_docs)] // documentation missing in model
    LaunchingMlInstances,
    #[allow(missing_docs)] // documentation missing in model
    MaxRuntimeExceeded,
    #[allow(missing_docs)] // documentation missing in model
    MaxWaitTimeExceeded,
    #[allow(missing_docs)] // documentation missing in model
    PreparingTrainingStack,
    #[allow(missing_docs)] // documentation missing in model
    Restarting,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    #[allow(missing_docs)] // documentation missing in model
    Training,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    #[allow(missing_docs)] // documentation missing in model
    Uploading,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SecondaryStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => SecondaryStatus::Completed,
            "Downloading" => SecondaryStatus::Downloading,
            "DownloadingTrainingImage" => SecondaryStatus::DownloadingTrainingImage,
            "Failed" => SecondaryStatus::Failed,
            "Interrupted" => SecondaryStatus::Interrupted,
            "LaunchingMLInstances" => SecondaryStatus::LaunchingMlInstances,
            "MaxRuntimeExceeded" => SecondaryStatus::MaxRuntimeExceeded,
            "MaxWaitTimeExceeded" => SecondaryStatus::MaxWaitTimeExceeded,
            "PreparingTrainingStack" => SecondaryStatus::PreparingTrainingStack,
            "Restarting" => SecondaryStatus::Restarting,
            "Starting" => SecondaryStatus::Starting,
            "Stopped" => SecondaryStatus::Stopped,
            "Stopping" => SecondaryStatus::Stopping,
            "Training" => SecondaryStatus::Training,
            "Updating" => SecondaryStatus::Updating,
            "Uploading" => SecondaryStatus::Uploading,
            other => SecondaryStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SecondaryStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SecondaryStatus::from(s))
    }
}
impl SecondaryStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SecondaryStatus::Completed => "Completed",
            SecondaryStatus::Downloading => "Downloading",
            SecondaryStatus::DownloadingTrainingImage => "DownloadingTrainingImage",
            SecondaryStatus::Failed => "Failed",
            SecondaryStatus::Interrupted => "Interrupted",
            SecondaryStatus::LaunchingMlInstances => "LaunchingMLInstances",
            SecondaryStatus::MaxRuntimeExceeded => "MaxRuntimeExceeded",
            SecondaryStatus::MaxWaitTimeExceeded => "MaxWaitTimeExceeded",
            SecondaryStatus::PreparingTrainingStack => "PreparingTrainingStack",
            SecondaryStatus::Restarting => "Restarting",
            SecondaryStatus::Starting => "Starting",
            SecondaryStatus::Stopped => "Stopped",
            SecondaryStatus::Stopping => "Stopping",
            SecondaryStatus::Training => "Training",
            SecondaryStatus::Updating => "Updating",
            SecondaryStatus::Uploading => "Uploading",
            SecondaryStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Completed",
            "Downloading",
            "DownloadingTrainingImage",
            "Failed",
            "Interrupted",
            "LaunchingMLInstances",
            "MaxRuntimeExceeded",
            "MaxWaitTimeExceeded",
            "PreparingTrainingStack",
            "Restarting",
            "Starting",
            "Stopped",
            "Stopping",
            "Training",
            "Updating",
            "Uploading",
        ]
    }
}
impl AsRef<str> for SecondaryStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies the training algorithm to use in a <code>CreateTrainingJob</code> request.</p>
/// <p>For more information about algorithms provided by SageMaker, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>. For information about using your own algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AlgorithmSpecification {
    /// <p>The registry path of the Docker image that contains the training algorithm. For information about docker registry paths for SageMaker built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Docker Registry Paths and Example Code</a> in the <i>Amazon SageMaker developer guide</i>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information about using your custom training container, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p> <note>
    /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
    /// <p>For more information, see the note in the <code>AlgorithmName</code> parameter description.</p>
    /// </note>
    #[doc(hidden)]
    pub training_image: std::option::Option<std::string::String>,
    /// <p>The name of the algorithm resource to use for the training job. This must be an algorithm resource that you created or subscribe to on Amazon Web Services Marketplace.</p> <note>
    /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
    /// <p>Note that the <code>AlgorithmName</code> parameter is mutually exclusive with the <code>TrainingImage</code> parameter. If you specify a value for the <code>AlgorithmName</code> parameter, you can't specify a value for <code>TrainingImage</code>, and vice versa.</p>
    /// <p>If you specify values for both parameters, the training job might break; if you don't specify any value for both parameters, the training job might raise a <code>null</code> error.</p>
    /// </note>
    #[doc(hidden)]
    pub algorithm_name: std::option::Option<std::string::String>,
    /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
    /// <p> <b>Pipe mode</b> </p>
    /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
    /// <p> <b>File mode</b> </p>
    /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
    /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
    /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
    /// <p> <b>FastFile mode</b> </p>
    /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
    /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
    #[doc(hidden)]
    pub training_input_mode: std::option::Option<crate::model::TrainingInputMode>,
    /// <p>A list of metric definition objects. Each object specifies the metric name and regular expressions used to parse algorithm logs. SageMaker publishes each metric to Amazon CloudWatch.</p>
    #[doc(hidden)]
    pub metric_definitions: std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
    /// <p>To generate and save time-series metrics during training, set to <code>true</code>. The default is <code>false</code> and time-series metrics aren't generated except in the following cases:</p>
    /// <ul>
    /// <li> <p>You use one of the SageMaker built-in algorithms</p> </li>
    /// <li> <p>You use one of the following <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-frameworks-deep-learning.html">Prebuilt SageMaker Docker Images</a>:</p>
    /// <ul>
    /// <li> <p>Tensorflow (version &gt;= 1.15)</p> </li>
    /// <li> <p>MXNet (version &gt;= 1.6)</p> </li>
    /// <li> <p>PyTorch (version &gt;= 1.3)</p> </li>
    /// </ul> </li>
    /// <li> <p>You specify at least one <code>MetricDefinition</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub enable_sage_maker_metrics_time_series: bool,
    /// <p>The <a href="https://docs.docker.com/engine/reference/builder/">entrypoint script for a Docker container</a> used to run a training job. This script takes precedence over the default train processing instructions. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for more information.</p>
    #[doc(hidden)]
    pub container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The arguments for a container used to run a training job. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for additional information.</p>
    #[doc(hidden)]
    pub container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl AlgorithmSpecification {
    /// <p>The registry path of the Docker image that contains the training algorithm. For information about docker registry paths for SageMaker built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Docker Registry Paths and Example Code</a> in the <i>Amazon SageMaker developer guide</i>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information about using your custom training container, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p> <note>
    /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
    /// <p>For more information, see the note in the <code>AlgorithmName</code> parameter description.</p>
    /// </note>
    pub fn training_image(&self) -> std::option::Option<&str> {
        self.training_image.as_deref()
    }
    /// <p>The name of the algorithm resource to use for the training job. This must be an algorithm resource that you created or subscribe to on Amazon Web Services Marketplace.</p> <note>
    /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
    /// <p>Note that the <code>AlgorithmName</code> parameter is mutually exclusive with the <code>TrainingImage</code> parameter. If you specify a value for the <code>AlgorithmName</code> parameter, you can't specify a value for <code>TrainingImage</code>, and vice versa.</p>
    /// <p>If you specify values for both parameters, the training job might break; if you don't specify any value for both parameters, the training job might raise a <code>null</code> error.</p>
    /// </note>
    pub fn algorithm_name(&self) -> std::option::Option<&str> {
        self.algorithm_name.as_deref()
    }
    /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
    /// <p> <b>Pipe mode</b> </p>
    /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
    /// <p> <b>File mode</b> </p>
    /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
    /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
    /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
    /// <p> <b>FastFile mode</b> </p>
    /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
    /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
    pub fn training_input_mode(&self) -> std::option::Option<&crate::model::TrainingInputMode> {
        self.training_input_mode.as_ref()
    }
    /// <p>A list of metric definition objects. Each object specifies the metric name and regular expressions used to parse algorithm logs. SageMaker publishes each metric to Amazon CloudWatch.</p>
    pub fn metric_definitions(&self) -> std::option::Option<&[crate::model::MetricDefinition]> {
        self.metric_definitions.as_deref()
    }
    /// <p>To generate and save time-series metrics during training, set to <code>true</code>. The default is <code>false</code> and time-series metrics aren't generated except in the following cases:</p>
    /// <ul>
    /// <li> <p>You use one of the SageMaker built-in algorithms</p> </li>
    /// <li> <p>You use one of the following <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-frameworks-deep-learning.html">Prebuilt SageMaker Docker Images</a>:</p>
    /// <ul>
    /// <li> <p>Tensorflow (version &gt;= 1.15)</p> </li>
    /// <li> <p>MXNet (version &gt;= 1.6)</p> </li>
    /// <li> <p>PyTorch (version &gt;= 1.3)</p> </li>
    /// </ul> </li>
    /// <li> <p>You specify at least one <code>MetricDefinition</code> </p> </li>
    /// </ul>
    pub fn enable_sage_maker_metrics_time_series(&self) -> bool {
        self.enable_sage_maker_metrics_time_series
    }
    /// <p>The <a href="https://docs.docker.com/engine/reference/builder/">entrypoint script for a Docker container</a> used to run a training job. This script takes precedence over the default train processing instructions. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for more information.</p>
    pub fn container_entrypoint(&self) -> std::option::Option<&[std::string::String]> {
        self.container_entrypoint.as_deref()
    }
    /// <p>The arguments for a container used to run a training job. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for additional information.</p>
    pub fn container_arguments(&self) -> std::option::Option<&[std::string::String]> {
        self.container_arguments.as_deref()
    }
}
/// See [`AlgorithmSpecification`](crate::model::AlgorithmSpecification).
pub mod algorithm_specification {

    /// A builder for [`AlgorithmSpecification`](crate::model::AlgorithmSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_image: std::option::Option<std::string::String>,
        pub(crate) algorithm_name: std::option::Option<std::string::String>,
        pub(crate) training_input_mode: std::option::Option<crate::model::TrainingInputMode>,
        pub(crate) metric_definitions:
            std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
        pub(crate) enable_sage_maker_metrics_time_series: std::option::Option<bool>,
        pub(crate) container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The registry path of the Docker image that contains the training algorithm. For information about docker registry paths for SageMaker built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Docker Registry Paths and Example Code</a> in the <i>Amazon SageMaker developer guide</i>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information about using your custom training container, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p> <note>
        /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
        /// <p>For more information, see the note in the <code>AlgorithmName</code> parameter description.</p>
        /// </note>
        pub fn training_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_image = Some(input.into());
            self
        }
        /// <p>The registry path of the Docker image that contains the training algorithm. For information about docker registry paths for SageMaker built-in algorithms, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html">Docker Registry Paths and Example Code</a> in the <i>Amazon SageMaker developer guide</i>. SageMaker supports both <code>registry/repository[:tag]</code> and <code>registry/repository[@digest]</code> image path formats. For more information about using your custom training container, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html">Using Your Own Algorithms with Amazon SageMaker</a>.</p> <note>
        /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
        /// <p>For more information, see the note in the <code>AlgorithmName</code> parameter description.</p>
        /// </note>
        pub fn set_training_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_image = input;
            self
        }
        /// <p>The name of the algorithm resource to use for the training job. This must be an algorithm resource that you created or subscribe to on Amazon Web Services Marketplace.</p> <note>
        /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
        /// <p>Note that the <code>AlgorithmName</code> parameter is mutually exclusive with the <code>TrainingImage</code> parameter. If you specify a value for the <code>AlgorithmName</code> parameter, you can't specify a value for <code>TrainingImage</code>, and vice versa.</p>
        /// <p>If you specify values for both parameters, the training job might break; if you don't specify any value for both parameters, the training job might raise a <code>null</code> error.</p>
        /// </note>
        pub fn algorithm_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.algorithm_name = Some(input.into());
            self
        }
        /// <p>The name of the algorithm resource to use for the training job. This must be an algorithm resource that you created or subscribe to on Amazon Web Services Marketplace.</p> <note>
        /// <p>You must specify either the algorithm name to the <code>AlgorithmName</code> parameter or the image URI of the algorithm container to the <code>TrainingImage</code> parameter.</p>
        /// <p>Note that the <code>AlgorithmName</code> parameter is mutually exclusive with the <code>TrainingImage</code> parameter. If you specify a value for the <code>AlgorithmName</code> parameter, you can't specify a value for <code>TrainingImage</code>, and vice versa.</p>
        /// <p>If you specify values for both parameters, the training job might break; if you don't specify any value for both parameters, the training job might raise a <code>null</code> error.</p>
        /// </note>
        pub fn set_algorithm_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.algorithm_name = input;
            self
        }
        /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
        /// <p> <b>Pipe mode</b> </p>
        /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
        /// <p> <b>File mode</b> </p>
        /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
        /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
        /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
        /// <p> <b>FastFile mode</b> </p>
        /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
        /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
        pub fn training_input_mode(mut self, input: crate::model::TrainingInputMode) -> Self {
            self.training_input_mode = Some(input);
            self
        }
        /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
        /// <p> <b>Pipe mode</b> </p>
        /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
        /// <p> <b>File mode</b> </p>
        /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
        /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
        /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
        /// <p> <b>FastFile mode</b> </p>
        /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
        /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
        pub fn set_training_input_mode(
            mut self,
            input: std::option::Option<crate::model::TrainingInputMode>,
        ) -> Self {
            self.training_input_mode = input;
            self
        }
        /// Appends an item to `metric_definitions`.
        ///
        /// To override the contents of this collection use [`set_metric_definitions`](Self::set_metric_definitions).
        ///
        /// <p>A list of metric definition objects. Each object specifies the metric name and regular expressions used to parse algorithm logs. SageMaker publishes each metric to Amazon CloudWatch.</p>
        pub fn metric_definitions(mut self, input: crate::model::MetricDefinition) -> Self {
            let mut v = self.metric_definitions.unwrap_or_default();
            v.push(input);
            self.metric_definitions = Some(v);
            self
        }
        /// <p>A list of metric definition objects. Each object specifies the metric name and regular expressions used to parse algorithm logs. SageMaker publishes each metric to Amazon CloudWatch.</p>
        pub fn set_metric_definitions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
        ) -> Self {
            self.metric_definitions = input;
            self
        }
        /// <p>To generate and save time-series metrics during training, set to <code>true</code>. The default is <code>false</code> and time-series metrics aren't generated except in the following cases:</p>
        /// <ul>
        /// <li> <p>You use one of the SageMaker built-in algorithms</p> </li>
        /// <li> <p>You use one of the following <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-frameworks-deep-learning.html">Prebuilt SageMaker Docker Images</a>:</p>
        /// <ul>
        /// <li> <p>Tensorflow (version &gt;= 1.15)</p> </li>
        /// <li> <p>MXNet (version &gt;= 1.6)</p> </li>
        /// <li> <p>PyTorch (version &gt;= 1.3)</p> </li>
        /// </ul> </li>
        /// <li> <p>You specify at least one <code>MetricDefinition</code> </p> </li>
        /// </ul>
        pub fn enable_sage_maker_metrics_time_series(mut self, input: bool) -> Self {
            self.enable_sage_maker_metrics_time_series = Some(input);
            self
        }
        /// <p>To generate and save time-series metrics during training, set to <code>true</code>. The default is <code>false</code> and time-series metrics aren't generated except in the following cases:</p>
        /// <ul>
        /// <li> <p>You use one of the SageMaker built-in algorithms</p> </li>
        /// <li> <p>You use one of the following <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-frameworks-deep-learning.html">Prebuilt SageMaker Docker Images</a>:</p>
        /// <ul>
        /// <li> <p>Tensorflow (version &gt;= 1.15)</p> </li>
        /// <li> <p>MXNet (version &gt;= 1.6)</p> </li>
        /// <li> <p>PyTorch (version &gt;= 1.3)</p> </li>
        /// </ul> </li>
        /// <li> <p>You specify at least one <code>MetricDefinition</code> </p> </li>
        /// </ul>
        pub fn set_enable_sage_maker_metrics_time_series(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_sage_maker_metrics_time_series = input;
            self
        }
        /// Appends an item to `container_entrypoint`.
        ///
        /// To override the contents of this collection use [`set_container_entrypoint`](Self::set_container_entrypoint).
        ///
        /// <p>The <a href="https://docs.docker.com/engine/reference/builder/">entrypoint script for a Docker container</a> used to run a training job. This script takes precedence over the default train processing instructions. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for more information.</p>
        pub fn container_entrypoint(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_entrypoint.unwrap_or_default();
            v.push(input.into());
            self.container_entrypoint = Some(v);
            self
        }
        /// <p>The <a href="https://docs.docker.com/engine/reference/builder/">entrypoint script for a Docker container</a> used to run a training job. This script takes precedence over the default train processing instructions. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for more information.</p>
        pub fn set_container_entrypoint(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_entrypoint = input;
            self
        }
        /// Appends an item to `container_arguments`.
        ///
        /// To override the contents of this collection use [`set_container_arguments`](Self::set_container_arguments).
        ///
        /// <p>The arguments for a container used to run a training job. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for additional information.</p>
        pub fn container_arguments(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_arguments.unwrap_or_default();
            v.push(input.into());
            self.container_arguments = Some(v);
            self
        }
        /// <p>The arguments for a container used to run a training job. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-dockerfile.html">How Amazon SageMaker Runs Your Training Image</a> for additional information.</p>
        pub fn set_container_arguments(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_arguments = input;
            self
        }
        /// Consumes the builder and constructs a [`AlgorithmSpecification`](crate::model::AlgorithmSpecification).
        pub fn build(self) -> crate::model::AlgorithmSpecification {
            crate::model::AlgorithmSpecification {
                training_image: self.training_image,
                algorithm_name: self.algorithm_name,
                training_input_mode: self.training_input_mode,
                metric_definitions: self.metric_definitions,
                enable_sage_maker_metrics_time_series: self
                    .enable_sage_maker_metrics_time_series
                    .unwrap_or_default(),
                container_entrypoint: self.container_entrypoint,
                container_arguments: self.container_arguments,
            }
        }
    }
}
impl AlgorithmSpecification {
    /// Creates a new builder-style object to manufacture [`AlgorithmSpecification`](crate::model::AlgorithmSpecification).
    pub fn builder() -> crate::model::algorithm_specification::Builder {
        crate::model::algorithm_specification::Builder::default()
    }
}

/// <p>Provides information about the location that is configured for storing model artifacts. </p>
/// <p>Model artifacts are the output that results from training a model, and typically consist of trained parameters, a model definition that describes how to compute inferences, and other metadata.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelArtifacts {
    /// <p>The path of the S3 object that contains the model artifacts. For example, <code>s3://bucket-name/keynameprefix/model.tar.gz</code>.</p>
    #[doc(hidden)]
    pub s3_model_artifacts: std::option::Option<std::string::String>,
}
impl ModelArtifacts {
    /// <p>The path of the S3 object that contains the model artifacts. For example, <code>s3://bucket-name/keynameprefix/model.tar.gz</code>.</p>
    pub fn s3_model_artifacts(&self) -> std::option::Option<&str> {
        self.s3_model_artifacts.as_deref()
    }
}
/// See [`ModelArtifacts`](crate::model::ModelArtifacts).
pub mod model_artifacts {

    /// A builder for [`ModelArtifacts`](crate::model::ModelArtifacts).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_model_artifacts: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The path of the S3 object that contains the model artifacts. For example, <code>s3://bucket-name/keynameprefix/model.tar.gz</code>.</p>
        pub fn s3_model_artifacts(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_model_artifacts = Some(input.into());
            self
        }
        /// <p>The path of the S3 object that contains the model artifacts. For example, <code>s3://bucket-name/keynameprefix/model.tar.gz</code>.</p>
        pub fn set_s3_model_artifacts(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_model_artifacts = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelArtifacts`](crate::model::ModelArtifacts).
        pub fn build(self) -> crate::model::ModelArtifacts {
            crate::model::ModelArtifacts {
                s3_model_artifacts: self.s3_model_artifacts,
            }
        }
    }
}
impl ModelArtifacts {
    /// Creates a new builder-style object to manufacture [`ModelArtifacts`](crate::model::ModelArtifacts).
    pub fn builder() -> crate::model::model_artifacts::Builder {
        crate::model::model_artifacts::Builder::default()
    }
}

/// <p>A summary of the metrics of a trial component.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentMetricSummary {
    /// <p>The name of the metric.</p>
    #[doc(hidden)]
    pub metric_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>When the metric was last updated.</p>
    #[doc(hidden)]
    pub time_stamp: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The maximum value of the metric.</p>
    #[doc(hidden)]
    pub max: std::option::Option<f64>,
    /// <p>The minimum value of the metric.</p>
    #[doc(hidden)]
    pub min: std::option::Option<f64>,
    /// <p>The most recent value of the metric.</p>
    #[doc(hidden)]
    pub last: std::option::Option<f64>,
    /// <p>The number of samples used to generate the metric.</p>
    #[doc(hidden)]
    pub count: std::option::Option<i32>,
    /// <p>The average value of the metric.</p>
    #[doc(hidden)]
    pub avg: std::option::Option<f64>,
    /// <p>The standard deviation of the metric.</p>
    #[doc(hidden)]
    pub std_dev: std::option::Option<f64>,
}
impl TrialComponentMetricSummary {
    /// <p>The name of the metric.</p>
    pub fn metric_name(&self) -> std::option::Option<&str> {
        self.metric_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>When the metric was last updated.</p>
    pub fn time_stamp(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.time_stamp.as_ref()
    }
    /// <p>The maximum value of the metric.</p>
    pub fn max(&self) -> std::option::Option<f64> {
        self.max
    }
    /// <p>The minimum value of the metric.</p>
    pub fn min(&self) -> std::option::Option<f64> {
        self.min
    }
    /// <p>The most recent value of the metric.</p>
    pub fn last(&self) -> std::option::Option<f64> {
        self.last
    }
    /// <p>The number of samples used to generate the metric.</p>
    pub fn count(&self) -> std::option::Option<i32> {
        self.count
    }
    /// <p>The average value of the metric.</p>
    pub fn avg(&self) -> std::option::Option<f64> {
        self.avg
    }
    /// <p>The standard deviation of the metric.</p>
    pub fn std_dev(&self) -> std::option::Option<f64> {
        self.std_dev
    }
}
/// See [`TrialComponentMetricSummary`](crate::model::TrialComponentMetricSummary).
pub mod trial_component_metric_summary {

    /// A builder for [`TrialComponentMetricSummary`](crate::model::TrialComponentMetricSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metric_name: std::option::Option<std::string::String>,
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) time_stamp: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) max: std::option::Option<f64>,
        pub(crate) min: std::option::Option<f64>,
        pub(crate) last: std::option::Option<f64>,
        pub(crate) count: std::option::Option<i32>,
        pub(crate) avg: std::option::Option<f64>,
        pub(crate) std_dev: std::option::Option<f64>,
    }
    impl Builder {
        /// <p>The name of the metric.</p>
        pub fn metric_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.metric_name = Some(input.into());
            self
        }
        /// <p>The name of the metric.</p>
        pub fn set_metric_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.metric_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>When the metric was last updated.</p>
        pub fn time_stamp(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.time_stamp = Some(input);
            self
        }
        /// <p>When the metric was last updated.</p>
        pub fn set_time_stamp(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.time_stamp = input;
            self
        }
        /// <p>The maximum value of the metric.</p>
        pub fn max(mut self, input: f64) -> Self {
            self.max = Some(input);
            self
        }
        /// <p>The maximum value of the metric.</p>
        pub fn set_max(mut self, input: std::option::Option<f64>) -> Self {
            self.max = input;
            self
        }
        /// <p>The minimum value of the metric.</p>
        pub fn min(mut self, input: f64) -> Self {
            self.min = Some(input);
            self
        }
        /// <p>The minimum value of the metric.</p>
        pub fn set_min(mut self, input: std::option::Option<f64>) -> Self {
            self.min = input;
            self
        }
        /// <p>The most recent value of the metric.</p>
        pub fn last(mut self, input: f64) -> Self {
            self.last = Some(input);
            self
        }
        /// <p>The most recent value of the metric.</p>
        pub fn set_last(mut self, input: std::option::Option<f64>) -> Self {
            self.last = input;
            self
        }
        /// <p>The number of samples used to generate the metric.</p>
        pub fn count(mut self, input: i32) -> Self {
            self.count = Some(input);
            self
        }
        /// <p>The number of samples used to generate the metric.</p>
        pub fn set_count(mut self, input: std::option::Option<i32>) -> Self {
            self.count = input;
            self
        }
        /// <p>The average value of the metric.</p>
        pub fn avg(mut self, input: f64) -> Self {
            self.avg = Some(input);
            self
        }
        /// <p>The average value of the metric.</p>
        pub fn set_avg(mut self, input: std::option::Option<f64>) -> Self {
            self.avg = input;
            self
        }
        /// <p>The standard deviation of the metric.</p>
        pub fn std_dev(mut self, input: f64) -> Self {
            self.std_dev = Some(input);
            self
        }
        /// <p>The standard deviation of the metric.</p>
        pub fn set_std_dev(mut self, input: std::option::Option<f64>) -> Self {
            self.std_dev = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentMetricSummary`](crate::model::TrialComponentMetricSummary).
        pub fn build(self) -> crate::model::TrialComponentMetricSummary {
            crate::model::TrialComponentMetricSummary {
                metric_name: self.metric_name,
                source_arn: self.source_arn,
                time_stamp: self.time_stamp,
                max: self.max,
                min: self.min,
                last: self.last,
                count: self.count,
                avg: self.avg,
                std_dev: self.std_dev,
            }
        }
    }
}
impl TrialComponentMetricSummary {
    /// Creates a new builder-style object to manufacture [`TrialComponentMetricSummary`](crate::model::TrialComponentMetricSummary).
    pub fn builder() -> crate::model::trial_component_metric_summary::Builder {
        crate::model::trial_component_metric_summary::Builder::default()
    }
}

/// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentSource {
    /// <p>The source Amazon Resource Name (ARN).</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>The source job type.</p>
    #[doc(hidden)]
    pub source_type: std::option::Option<std::string::String>,
}
impl TrialComponentSource {
    /// <p>The source Amazon Resource Name (ARN).</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>The source job type.</p>
    pub fn source_type(&self) -> std::option::Option<&str> {
        self.source_type.as_deref()
    }
}
/// See [`TrialComponentSource`](crate::model::TrialComponentSource).
pub mod trial_component_source {

    /// A builder for [`TrialComponentSource`](crate::model::TrialComponentSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) source_type: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The source Amazon Resource Name (ARN).</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The source Amazon Resource Name (ARN).</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>The source job type.</p>
        pub fn source_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_type = Some(input.into());
            self
        }
        /// <p>The source job type.</p>
        pub fn set_source_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_type = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentSource`](crate::model::TrialComponentSource).
        pub fn build(self) -> crate::model::TrialComponentSource {
            crate::model::TrialComponentSource {
                source_arn: self.source_arn,
                source_type: self.source_type,
            }
        }
    }
}
impl TrialComponentSource {
    /// Creates a new builder-style object to manufacture [`TrialComponentSource`](crate::model::TrialComponentSource).
    pub fn builder() -> crate::model::trial_component_source::Builder {
        crate::model::trial_component_source::Builder::default()
    }
}

/// <p>The properties of a trial as returned by the <code>Search</code> API.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Trial {
    /// <p>The name of the trial.</p>
    #[doc(hidden)]
    pub trial_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the trial.</p>
    #[doc(hidden)]
    pub trial_arn: std::option::Option<std::string::String>,
    /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The name of the experiment the trial is part of.</p>
    #[doc(hidden)]
    pub experiment_name: std::option::Option<std::string::String>,
    /// <p>The source of the trial.</p>
    #[doc(hidden)]
    pub source: std::option::Option<crate::model::TrialSource>,
    /// <p>When the trial was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Who created the trial.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>Who last modified the trial.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
    #[doc(hidden)]
    pub metadata_properties: std::option::Option<crate::model::MetadataProperties>,
    /// <p>The list of tags that are associated with the trial. You can use <code>Search</code> API to search on the tags.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    /// <p>A list of the components associated with the trial. For each component, a summary of the component's properties is included.</p>
    #[doc(hidden)]
    pub trial_component_summaries:
        std::option::Option<std::vec::Vec<crate::model::TrialComponentSimpleSummary>>,
}
impl Trial {
    /// <p>The name of the trial.</p>
    pub fn trial_name(&self) -> std::option::Option<&str> {
        self.trial_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the trial.</p>
    pub fn trial_arn(&self) -> std::option::Option<&str> {
        self.trial_arn.as_deref()
    }
    /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The name of the experiment the trial is part of.</p>
    pub fn experiment_name(&self) -> std::option::Option<&str> {
        self.experiment_name.as_deref()
    }
    /// <p>The source of the trial.</p>
    pub fn source(&self) -> std::option::Option<&crate::model::TrialSource> {
        self.source.as_ref()
    }
    /// <p>When the trial was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Who created the trial.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>Who last modified the trial.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
    pub fn metadata_properties(&self) -> std::option::Option<&crate::model::MetadataProperties> {
        self.metadata_properties.as_ref()
    }
    /// <p>The list of tags that are associated with the trial. You can use <code>Search</code> API to search on the tags.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
    /// <p>A list of the components associated with the trial. For each component, a summary of the component's properties is included.</p>
    pub fn trial_component_summaries(
        &self,
    ) -> std::option::Option<&[crate::model::TrialComponentSimpleSummary]> {
        self.trial_component_summaries.as_deref()
    }
}
/// See [`Trial`](crate::model::Trial).
pub mod trial {

    /// A builder for [`Trial`](crate::model::Trial).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) trial_name: std::option::Option<std::string::String>,
        pub(crate) trial_arn: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) experiment_name: std::option::Option<std::string::String>,
        pub(crate) source: std::option::Option<crate::model::TrialSource>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) metadata_properties: std::option::Option<crate::model::MetadataProperties>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        pub(crate) trial_component_summaries:
            std::option::Option<std::vec::Vec<crate::model::TrialComponentSimpleSummary>>,
    }
    impl Builder {
        /// <p>The name of the trial.</p>
        pub fn trial_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_name = Some(input.into());
            self
        }
        /// <p>The name of the trial.</p>
        pub fn set_trial_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial.</p>
        pub fn trial_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial.</p>
        pub fn set_trial_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_arn = input;
            self
        }
        /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The name of the experiment the trial is part of.</p>
        pub fn experiment_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment the trial is part of.</p>
        pub fn set_experiment_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_name = input;
            self
        }
        /// <p>The source of the trial.</p>
        pub fn source(mut self, input: crate::model::TrialSource) -> Self {
            self.source = Some(input);
            self
        }
        /// <p>The source of the trial.</p>
        pub fn set_source(mut self, input: std::option::Option<crate::model::TrialSource>) -> Self {
            self.source = input;
            self
        }
        /// <p>When the trial was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the trial was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Who created the trial.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Who created the trial.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>Who last modified the trial.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>Who last modified the trial.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
        pub fn metadata_properties(mut self, input: crate::model::MetadataProperties) -> Self {
            self.metadata_properties = Some(input);
            self
        }
        /// <p>Metadata properties of the tracking entity, trial, or trial component.</p>
        pub fn set_metadata_properties(
            mut self,
            input: std::option::Option<crate::model::MetadataProperties>,
        ) -> Self {
            self.metadata_properties = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>The list of tags that are associated with the trial. You can use <code>Search</code> API to search on the tags.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>The list of tags that are associated with the trial. You can use <code>Search</code> API to search on the tags.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Appends an item to `trial_component_summaries`.
        ///
        /// To override the contents of this collection use [`set_trial_component_summaries`](Self::set_trial_component_summaries).
        ///
        /// <p>A list of the components associated with the trial. For each component, a summary of the component's properties is included.</p>
        pub fn trial_component_summaries(
            mut self,
            input: crate::model::TrialComponentSimpleSummary,
        ) -> Self {
            let mut v = self.trial_component_summaries.unwrap_or_default();
            v.push(input);
            self.trial_component_summaries = Some(v);
            self
        }
        /// <p>A list of the components associated with the trial. For each component, a summary of the component's properties is included.</p>
        pub fn set_trial_component_summaries(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::TrialComponentSimpleSummary>>,
        ) -> Self {
            self.trial_component_summaries = input;
            self
        }
        /// Consumes the builder and constructs a [`Trial`](crate::model::Trial).
        pub fn build(self) -> crate::model::Trial {
            crate::model::Trial {
                trial_name: self.trial_name,
                trial_arn: self.trial_arn,
                display_name: self.display_name,
                experiment_name: self.experiment_name,
                source: self.source,
                creation_time: self.creation_time,
                created_by: self.created_by,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
                metadata_properties: self.metadata_properties,
                tags: self.tags,
                trial_component_summaries: self.trial_component_summaries,
            }
        }
    }
}
impl Trial {
    /// Creates a new builder-style object to manufacture [`Trial`](crate::model::Trial).
    pub fn builder() -> crate::model::trial::Builder {
        crate::model::trial::Builder::default()
    }
}

/// <p>A short summary of a trial component.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentSimpleSummary {
    /// <p>The name of the trial component.</p>
    #[doc(hidden)]
    pub trial_component_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
    #[doc(hidden)]
    pub trial_component_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
    #[doc(hidden)]
    pub trial_component_source: std::option::Option<crate::model::TrialComponentSource>,
    /// <p>When the component was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
}
impl TrialComponentSimpleSummary {
    /// <p>The name of the trial component.</p>
    pub fn trial_component_name(&self) -> std::option::Option<&str> {
        self.trial_component_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
    pub fn trial_component_arn(&self) -> std::option::Option<&str> {
        self.trial_component_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
    pub fn trial_component_source(
        &self,
    ) -> std::option::Option<&crate::model::TrialComponentSource> {
        self.trial_component_source.as_ref()
    }
    /// <p>When the component was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
}
/// See [`TrialComponentSimpleSummary`](crate::model::TrialComponentSimpleSummary).
pub mod trial_component_simple_summary {

    /// A builder for [`TrialComponentSimpleSummary`](crate::model::TrialComponentSimpleSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) trial_component_name: std::option::Option<std::string::String>,
        pub(crate) trial_component_arn: std::option::Option<std::string::String>,
        pub(crate) trial_component_source: std::option::Option<crate::model::TrialComponentSource>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
    }
    impl Builder {
        /// <p>The name of the trial component.</p>
        pub fn trial_component_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_component_name = Some(input.into());
            self
        }
        /// <p>The name of the trial component.</p>
        pub fn set_trial_component_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
        pub fn trial_component_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_component_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
        pub fn set_trial_component_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
        pub fn trial_component_source(mut self, input: crate::model::TrialComponentSource) -> Self {
            self.trial_component_source = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
        pub fn set_trial_component_source(
            mut self,
            input: std::option::Option<crate::model::TrialComponentSource>,
        ) -> Self {
            self.trial_component_source = input;
            self
        }
        /// <p>When the component was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the component was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentSimpleSummary`](crate::model::TrialComponentSimpleSummary).
        pub fn build(self) -> crate::model::TrialComponentSimpleSummary {
            crate::model::TrialComponentSimpleSummary {
                trial_component_name: self.trial_component_name,
                trial_component_arn: self.trial_component_arn,
                trial_component_source: self.trial_component_source,
                creation_time: self.creation_time,
                created_by: self.created_by,
            }
        }
    }
}
impl TrialComponentSimpleSummary {
    /// Creates a new builder-style object to manufacture [`TrialComponentSimpleSummary`](crate::model::TrialComponentSimpleSummary).
    pub fn builder() -> crate::model::trial_component_simple_summary::Builder {
        crate::model::trial_component_simple_summary::Builder::default()
    }
}

/// <p>The source of the trial.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialSource {
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>The source job type.</p>
    #[doc(hidden)]
    pub source_type: std::option::Option<std::string::String>,
}
impl TrialSource {
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>The source job type.</p>
    pub fn source_type(&self) -> std::option::Option<&str> {
        self.source_type.as_deref()
    }
}
/// See [`TrialSource`](crate::model::TrialSource).
pub mod trial_source {

    /// A builder for [`TrialSource`](crate::model::TrialSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) source_type: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>The source job type.</p>
        pub fn source_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_type = Some(input.into());
            self
        }
        /// <p>The source job type.</p>
        pub fn set_source_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_type = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialSource`](crate::model::TrialSource).
        pub fn build(self) -> crate::model::TrialSource {
            crate::model::TrialSource {
                source_arn: self.source_arn,
                source_type: self.source_type,
            }
        }
    }
}
impl TrialSource {
    /// Creates a new builder-style object to manufacture [`TrialSource`](crate::model::TrialSource).
    pub fn builder() -> crate::model::trial_source::Builder {
        crate::model::trial_source::Builder::default()
    }
}

/// <p>The properties of an experiment as returned by the <code>Search</code> API.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Experiment {
    /// <p>The name of the experiment.</p>
    #[doc(hidden)]
    pub experiment_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
    #[doc(hidden)]
    pub experiment_arn: std::option::Option<std::string::String>,
    /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The source of the experiment.</p>
    #[doc(hidden)]
    pub source: std::option::Option<crate::model::ExperimentSource>,
    /// <p>The description of the experiment.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>When the experiment was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Who created the experiment.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>When the experiment was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
    /// <p>The list of tags that are associated with the experiment. You can use <code>Search</code> API to search on the tags.</p>
    #[doc(hidden)]
    pub tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
}
impl Experiment {
    /// <p>The name of the experiment.</p>
    pub fn experiment_name(&self) -> std::option::Option<&str> {
        self.experiment_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
    pub fn experiment_arn(&self) -> std::option::Option<&str> {
        self.experiment_arn.as_deref()
    }
    /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The source of the experiment.</p>
    pub fn source(&self) -> std::option::Option<&crate::model::ExperimentSource> {
        self.source.as_ref()
    }
    /// <p>The description of the experiment.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>When the experiment was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Who created the experiment.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>When the experiment was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
    /// <p>The list of tags that are associated with the experiment. You can use <code>Search</code> API to search on the tags.</p>
    pub fn tags(&self) -> std::option::Option<&[crate::model::Tag]> {
        self.tags.as_deref()
    }
}
/// See [`Experiment`](crate::model::Experiment).
pub mod experiment {

    /// A builder for [`Experiment`](crate::model::Experiment).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) experiment_name: std::option::Option<std::string::String>,
        pub(crate) experiment_arn: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) source: std::option::Option<crate::model::ExperimentSource>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
        pub(crate) tags: std::option::Option<std::vec::Vec<crate::model::Tag>>,
    }
    impl Builder {
        /// <p>The name of the experiment.</p>
        pub fn experiment_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment.</p>
        pub fn set_experiment_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
        pub fn experiment_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
        pub fn set_experiment_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_arn = input;
            self
        }
        /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The source of the experiment.</p>
        pub fn source(mut self, input: crate::model::ExperimentSource) -> Self {
            self.source = Some(input);
            self
        }
        /// <p>The source of the experiment.</p>
        pub fn set_source(
            mut self,
            input: std::option::Option<crate::model::ExperimentSource>,
        ) -> Self {
            self.source = input;
            self
        }
        /// <p>The description of the experiment.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>The description of the experiment.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>When the experiment was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the experiment was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Who created the experiment.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Who created the experiment.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>When the experiment was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the experiment was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// Appends an item to `tags`.
        ///
        /// To override the contents of this collection use [`set_tags`](Self::set_tags).
        ///
        /// <p>The list of tags that are associated with the experiment. You can use <code>Search</code> API to search on the tags.</p>
        pub fn tags(mut self, input: crate::model::Tag) -> Self {
            let mut v = self.tags.unwrap_or_default();
            v.push(input);
            self.tags = Some(v);
            self
        }
        /// <p>The list of tags that are associated with the experiment. You can use <code>Search</code> API to search on the tags.</p>
        pub fn set_tags(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Tag>>,
        ) -> Self {
            self.tags = input;
            self
        }
        /// Consumes the builder and constructs a [`Experiment`](crate::model::Experiment).
        pub fn build(self) -> crate::model::Experiment {
            crate::model::Experiment {
                experiment_name: self.experiment_name,
                experiment_arn: self.experiment_arn,
                display_name: self.display_name,
                source: self.source,
                description: self.description,
                creation_time: self.creation_time,
                created_by: self.created_by,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
                tags: self.tags,
            }
        }
    }
}
impl Experiment {
    /// Creates a new builder-style object to manufacture [`Experiment`](crate::model::Experiment).
    pub fn builder() -> crate::model::experiment::Builder {
        crate::model::experiment::Builder::default()
    }
}

/// <p>The source of the experiment.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ExperimentSource {
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>The source type.</p>
    #[doc(hidden)]
    pub source_type: std::option::Option<std::string::String>,
}
impl ExperimentSource {
    /// <p>The Amazon Resource Name (ARN) of the source.</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>The source type.</p>
    pub fn source_type(&self) -> std::option::Option<&str> {
        self.source_type.as_deref()
    }
}
/// See [`ExperimentSource`](crate::model::ExperimentSource).
pub mod experiment_source {

    /// A builder for [`ExperimentSource`](crate::model::ExperimentSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) source_type: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the source.</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>The source type.</p>
        pub fn source_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_type = Some(input.into());
            self
        }
        /// <p>The source type.</p>
        pub fn set_source_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_type = input;
            self
        }
        /// Consumes the builder and constructs a [`ExperimentSource`](crate::model::ExperimentSource).
        pub fn build(self) -> crate::model::ExperimentSource {
            crate::model::ExperimentSource {
                source_arn: self.source_arn,
                source_type: self.source_type,
            }
        }
    }
}
impl ExperimentSource {
    /// Creates a new builder-style object to manufacture [`ExperimentSource`](crate::model::ExperimentSource).
    pub fn builder() -> crate::model::experiment_source::Builder {
        crate::model::experiment_source::Builder::default()
    }
}

/// When writing a match expression against `SearchSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let searchsortorder = unimplemented!();
/// match searchsortorder {
///     SearchSortOrder::Ascending => { /* ... */ },
///     SearchSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `searchsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SearchSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SearchSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SearchSortOrder::NewFeature` is defined.
/// Specifically, when `searchsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SearchSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SearchSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SearchSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => SearchSortOrder::Ascending,
            "Descending" => SearchSortOrder::Descending,
            other => SearchSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SearchSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SearchSortOrder::from(s))
    }
}
impl SearchSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SearchSortOrder::Ascending => "Ascending",
            SearchSortOrder::Descending => "Descending",
            SearchSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for SearchSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A multi-expression that searches for the specified resource or resources in a search. All resource objects that satisfy the expression's condition are included in the search results. You must specify at least one subexpression, filter, or nested filter. A <code>SearchExpression</code> can contain up to twenty elements.</p>
/// <p>A <code>SearchExpression</code> contains the following components:</p>
/// <ul>
/// <li> <p>A list of <code>Filter</code> objects. Each filter defines a simple Boolean expression comprised of a resource property name, Boolean operator, and value.</p> </li>
/// <li> <p>A list of <code>NestedFilter</code> objects. Each nested filter defines a list of Boolean expressions using a list of resource properties. A nested filter is satisfied if a single object in the list satisfies all Boolean expressions.</p> </li>
/// <li> <p>A list of <code>SearchExpression</code> objects. A search expression object can be nested in a list of search expression objects.</p> </li>
/// <li> <p>A Boolean operator: <code>And</code> or <code>Or</code>.</p> </li>
/// </ul>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SearchExpression {
    /// <p>A list of filter objects.</p>
    #[doc(hidden)]
    pub filters: std::option::Option<std::vec::Vec<crate::model::Filter>>,
    /// <p>A list of nested filter objects.</p>
    #[doc(hidden)]
    pub nested_filters: std::option::Option<std::vec::Vec<crate::model::NestedFilters>>,
    /// <p>A list of search expression objects.</p>
    #[doc(hidden)]
    pub sub_expressions: std::option::Option<std::vec::Vec<crate::model::SearchExpression>>,
    /// <p>A Boolean operator used to evaluate the search expression. If you want every conditional statement in all lists to be satisfied for the entire search expression to be true, specify <code>And</code>. If only a single conditional statement needs to be true for the entire search expression to be true, specify <code>Or</code>. The default value is <code>And</code>.</p>
    #[doc(hidden)]
    pub operator: std::option::Option<crate::model::BooleanOperator>,
}
impl SearchExpression {
    /// <p>A list of filter objects.</p>
    pub fn filters(&self) -> std::option::Option<&[crate::model::Filter]> {
        self.filters.as_deref()
    }
    /// <p>A list of nested filter objects.</p>
    pub fn nested_filters(&self) -> std::option::Option<&[crate::model::NestedFilters]> {
        self.nested_filters.as_deref()
    }
    /// <p>A list of search expression objects.</p>
    pub fn sub_expressions(&self) -> std::option::Option<&[crate::model::SearchExpression]> {
        self.sub_expressions.as_deref()
    }
    /// <p>A Boolean operator used to evaluate the search expression. If you want every conditional statement in all lists to be satisfied for the entire search expression to be true, specify <code>And</code>. If only a single conditional statement needs to be true for the entire search expression to be true, specify <code>Or</code>. The default value is <code>And</code>.</p>
    pub fn operator(&self) -> std::option::Option<&crate::model::BooleanOperator> {
        self.operator.as_ref()
    }
}
/// See [`SearchExpression`](crate::model::SearchExpression).
pub mod search_expression {

    /// A builder for [`SearchExpression`](crate::model::SearchExpression).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) filters: std::option::Option<std::vec::Vec<crate::model::Filter>>,
        pub(crate) nested_filters: std::option::Option<std::vec::Vec<crate::model::NestedFilters>>,
        pub(crate) sub_expressions:
            std::option::Option<std::vec::Vec<crate::model::SearchExpression>>,
        pub(crate) operator: std::option::Option<crate::model::BooleanOperator>,
    }
    impl Builder {
        /// Appends an item to `filters`.
        ///
        /// To override the contents of this collection use [`set_filters`](Self::set_filters).
        ///
        /// <p>A list of filter objects.</p>
        pub fn filters(mut self, input: crate::model::Filter) -> Self {
            let mut v = self.filters.unwrap_or_default();
            v.push(input);
            self.filters = Some(v);
            self
        }
        /// <p>A list of filter objects.</p>
        pub fn set_filters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Filter>>,
        ) -> Self {
            self.filters = input;
            self
        }
        /// Appends an item to `nested_filters`.
        ///
        /// To override the contents of this collection use [`set_nested_filters`](Self::set_nested_filters).
        ///
        /// <p>A list of nested filter objects.</p>
        pub fn nested_filters(mut self, input: crate::model::NestedFilters) -> Self {
            let mut v = self.nested_filters.unwrap_or_default();
            v.push(input);
            self.nested_filters = Some(v);
            self
        }
        /// <p>A list of nested filter objects.</p>
        pub fn set_nested_filters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::NestedFilters>>,
        ) -> Self {
            self.nested_filters = input;
            self
        }
        /// Appends an item to `sub_expressions`.
        ///
        /// To override the contents of this collection use [`set_sub_expressions`](Self::set_sub_expressions).
        ///
        /// <p>A list of search expression objects.</p>
        pub fn sub_expressions(mut self, input: crate::model::SearchExpression) -> Self {
            let mut v = self.sub_expressions.unwrap_or_default();
            v.push(input);
            self.sub_expressions = Some(v);
            self
        }
        /// <p>A list of search expression objects.</p>
        pub fn set_sub_expressions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::SearchExpression>>,
        ) -> Self {
            self.sub_expressions = input;
            self
        }
        /// <p>A Boolean operator used to evaluate the search expression. If you want every conditional statement in all lists to be satisfied for the entire search expression to be true, specify <code>And</code>. If only a single conditional statement needs to be true for the entire search expression to be true, specify <code>Or</code>. The default value is <code>And</code>.</p>
        pub fn operator(mut self, input: crate::model::BooleanOperator) -> Self {
            self.operator = Some(input);
            self
        }
        /// <p>A Boolean operator used to evaluate the search expression. If you want every conditional statement in all lists to be satisfied for the entire search expression to be true, specify <code>And</code>. If only a single conditional statement needs to be true for the entire search expression to be true, specify <code>Or</code>. The default value is <code>And</code>.</p>
        pub fn set_operator(
            mut self,
            input: std::option::Option<crate::model::BooleanOperator>,
        ) -> Self {
            self.operator = input;
            self
        }
        /// Consumes the builder and constructs a [`SearchExpression`](crate::model::SearchExpression).
        pub fn build(self) -> crate::model::SearchExpression {
            crate::model::SearchExpression {
                filters: self.filters,
                nested_filters: self.nested_filters,
                sub_expressions: self.sub_expressions,
                operator: self.operator,
            }
        }
    }
}
impl SearchExpression {
    /// Creates a new builder-style object to manufacture [`SearchExpression`](crate::model::SearchExpression).
    pub fn builder() -> crate::model::search_expression::Builder {
        crate::model::search_expression::Builder::default()
    }
}

/// When writing a match expression against `BooleanOperator`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let booleanoperator = unimplemented!();
/// match booleanoperator {
///     BooleanOperator::And => { /* ... */ },
///     BooleanOperator::Or => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `booleanoperator` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `BooleanOperator::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `BooleanOperator::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `BooleanOperator::NewFeature` is defined.
/// Specifically, when `booleanoperator` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `BooleanOperator::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum BooleanOperator {
    #[allow(missing_docs)] // documentation missing in model
    And,
    #[allow(missing_docs)] // documentation missing in model
    Or,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for BooleanOperator {
    fn from(s: &str) -> Self {
        match s {
            "And" => BooleanOperator::And,
            "Or" => BooleanOperator::Or,
            other => BooleanOperator::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for BooleanOperator {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(BooleanOperator::from(s))
    }
}
impl BooleanOperator {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            BooleanOperator::And => "And",
            BooleanOperator::Or => "Or",
            BooleanOperator::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["And", "Or"]
    }
}
impl AsRef<str> for BooleanOperator {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A list of nested <code>Filter</code> objects. A resource must satisfy the conditions of all filters to be included in the results returned from the <code>Search</code> API.</p>
/// <p>For example, to filter on a training job's <code>InputDataConfig</code> property with a specific channel name and <code>S3Uri</code> prefix, define the following filters:</p>
/// <ul>
/// <li> <p> <code>'{Name:"InputDataConfig.ChannelName", "Operator":"Equals", "Value":"train"}',</code> </p> </li>
/// <li> <p> <code>'{Name:"InputDataConfig.DataSource.S3DataSource.S3Uri", "Operator":"Contains", "Value":"mybucket/catdata"}'</code> </p> </li>
/// </ul>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NestedFilters {
    /// <p>The name of the property to use in the nested filters. The value must match a listed property name, such as <code>InputDataConfig</code>.</p>
    #[doc(hidden)]
    pub nested_property_name: std::option::Option<std::string::String>,
    /// <p>A list of filters. Each filter acts on a property. Filters must contain at least one <code>Filters</code> value. For example, a <code>NestedFilters</code> call might include a filter on the <code>PropertyName</code> parameter of the <code>InputDataConfig</code> property: <code>InputDataConfig.DataSource.S3DataSource.S3Uri</code>.</p>
    #[doc(hidden)]
    pub filters: std::option::Option<std::vec::Vec<crate::model::Filter>>,
}
impl NestedFilters {
    /// <p>The name of the property to use in the nested filters. The value must match a listed property name, such as <code>InputDataConfig</code>.</p>
    pub fn nested_property_name(&self) -> std::option::Option<&str> {
        self.nested_property_name.as_deref()
    }
    /// <p>A list of filters. Each filter acts on a property. Filters must contain at least one <code>Filters</code> value. For example, a <code>NestedFilters</code> call might include a filter on the <code>PropertyName</code> parameter of the <code>InputDataConfig</code> property: <code>InputDataConfig.DataSource.S3DataSource.S3Uri</code>.</p>
    pub fn filters(&self) -> std::option::Option<&[crate::model::Filter]> {
        self.filters.as_deref()
    }
}
/// See [`NestedFilters`](crate::model::NestedFilters).
pub mod nested_filters {

    /// A builder for [`NestedFilters`](crate::model::NestedFilters).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) nested_property_name: std::option::Option<std::string::String>,
        pub(crate) filters: std::option::Option<std::vec::Vec<crate::model::Filter>>,
    }
    impl Builder {
        /// <p>The name of the property to use in the nested filters. The value must match a listed property name, such as <code>InputDataConfig</code>.</p>
        pub fn nested_property_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.nested_property_name = Some(input.into());
            self
        }
        /// <p>The name of the property to use in the nested filters. The value must match a listed property name, such as <code>InputDataConfig</code>.</p>
        pub fn set_nested_property_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.nested_property_name = input;
            self
        }
        /// Appends an item to `filters`.
        ///
        /// To override the contents of this collection use [`set_filters`](Self::set_filters).
        ///
        /// <p>A list of filters. Each filter acts on a property. Filters must contain at least one <code>Filters</code> value. For example, a <code>NestedFilters</code> call might include a filter on the <code>PropertyName</code> parameter of the <code>InputDataConfig</code> property: <code>InputDataConfig.DataSource.S3DataSource.S3Uri</code>.</p>
        pub fn filters(mut self, input: crate::model::Filter) -> Self {
            let mut v = self.filters.unwrap_or_default();
            v.push(input);
            self.filters = Some(v);
            self
        }
        /// <p>A list of filters. Each filter acts on a property. Filters must contain at least one <code>Filters</code> value. For example, a <code>NestedFilters</code> call might include a filter on the <code>PropertyName</code> parameter of the <code>InputDataConfig</code> property: <code>InputDataConfig.DataSource.S3DataSource.S3Uri</code>.</p>
        pub fn set_filters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Filter>>,
        ) -> Self {
            self.filters = input;
            self
        }
        /// Consumes the builder and constructs a [`NestedFilters`](crate::model::NestedFilters).
        pub fn build(self) -> crate::model::NestedFilters {
            crate::model::NestedFilters {
                nested_property_name: self.nested_property_name,
                filters: self.filters,
            }
        }
    }
}
impl NestedFilters {
    /// Creates a new builder-style object to manufacture [`NestedFilters`](crate::model::NestedFilters).
    pub fn builder() -> crate::model::nested_filters::Builder {
        crate::model::nested_filters::Builder::default()
    }
}

/// <p>A conditional statement for a search expression that includes a resource property, a Boolean operator, and a value. Resources that match the statement are returned in the results from the <code>Search</code> API.</p>
/// <p>If you specify a <code>Value</code>, but not an <code>Operator</code>, Amazon SageMaker uses the equals operator.</p>
/// <p>In search, there are several property types:</p>
/// <dl>
/// <dt>
/// Metrics
/// </dt>
/// <dd>
/// <p>To define a metric filter, enter a value using the form <code>"Metrics.
/// <name>
/// "
/// </name></code>, where <code>
/// <name></name></code> is a metric name. For example, the following filter searches for training jobs with an <code>"accuracy"</code> metric greater than <code>"0.9"</code>:</p>
/// <p> <code>{</code> </p>
/// <p> <code>"Name": "Metrics.accuracy",</code> </p>
/// <p> <code>"Operator": "GreaterThan",</code> </p>
/// <p> <code>"Value": "0.9"</code> </p>
/// <p> <code>}</code> </p>
/// </dd>
/// <dt>
/// HyperParameters
/// </dt>
/// <dd>
/// <p>To define a hyperparameter filter, enter a value with the form <code>"HyperParameters.
/// <name>
/// "
/// </name></code>. Decimal hyperparameter values are treated as a decimal in a comparison if the specified <code>Value</code> is also a decimal value. If the specified <code>Value</code> is an integer, the decimal hyperparameter values are treated as integers. For example, the following filter is satisfied by training jobs with a <code>"learning_rate"</code> hyperparameter that is less than <code>"0.5"</code>:</p>
/// <p> <code> {</code> </p>
/// <p> <code> "Name": "HyperParameters.learning_rate",</code> </p>
/// <p> <code> "Operator": "LessThan",</code> </p>
/// <p> <code> "Value": "0.5"</code> </p>
/// <p> <code> }</code> </p>
/// </dd>
/// <dt>
/// Tags
/// </dt>
/// <dd>
/// <p>To define a tag filter, enter a value with the form <code>Tags.
/// <key></key></code>.</p>
/// </dd>
/// </dl>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Filter {
    /// <p>A resource property name. For example, <code>TrainingJobName</code>. For valid property names, see <code>SearchRecord</code>. You must specify a valid property for the resource.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>A Boolean binary operator that is used to evaluate the filter. The operator field contains one of the following values:</p>
    /// <dl>
    /// <dt>
    /// Equals
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> equals <code>Value</code>.</p>
    /// </dd>
    /// <dt>
    /// NotEquals
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> doesn't equal <code>Value</code>.</p>
    /// </dd>
    /// <dt>
    /// Exists
    /// </dt>
    /// <dd>
    /// <p>The <code>Name</code> property exists.</p>
    /// </dd>
    /// <dt>
    /// NotExists
    /// </dt>
    /// <dd>
    /// <p>The <code>Name</code> property does not exist.</p>
    /// </dd>
    /// <dt>
    /// GreaterThan
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is greater than <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// GreaterThanOrEqualTo
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is greater than or equal to <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// LessThan
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is less than <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// LessThanOrEqualTo
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is less than or equal to <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// In
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is one of the comma delimited strings in <code>Value</code>. Only supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// Contains
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> contains the string <code>Value</code>. Only supported for text properties.</p>
    /// <p>A <code>SearchExpression</code> can include the <code>Contains</code> operator multiple times when the value of <code>Name</code> is one of the following:</p>
    /// <ul>
    /// <li> <p> <code>Experiment.DisplayName</code> </p> </li>
    /// <li> <p> <code>Experiment.ExperimentName</code> </p> </li>
    /// <li> <p> <code>Experiment.Tags</code> </p> </li>
    /// <li> <p> <code>Trial.DisplayName</code> </p> </li>
    /// <li> <p> <code>Trial.TrialName</code> </p> </li>
    /// <li> <p> <code>Trial.Tags</code> </p> </li>
    /// <li> <p> <code>TrialComponent.DisplayName</code> </p> </li>
    /// <li> <p> <code>TrialComponent.TrialComponentName</code> </p> </li>
    /// <li> <p> <code>TrialComponent.Tags</code> </p> </li>
    /// <li> <p> <code>TrialComponent.InputArtifacts</code> </p> </li>
    /// <li> <p> <code>TrialComponent.OutputArtifacts</code> </p> </li>
    /// </ul>
    /// <p>A <code>SearchExpression</code> can include only one <code>Contains</code> operator for all other values of <code>Name</code>. In these cases, if you include multiple <code>Contains</code> operators in the <code>SearchExpression</code>, the result is the following error message: "<code>'CONTAINS' operator usage limit of 1 exceeded.</code>"</p>
    /// </dd>
    /// </dl>
    #[doc(hidden)]
    pub operator: std::option::Option<crate::model::Operator>,
    /// <p>A value used with <code>Name</code> and <code>Operator</code> to determine which resources satisfy the filter's condition. For numerical properties, <code>Value</code> must be an integer or floating-point decimal. For timestamp properties, <code>Value</code> must be an ISO 8601 date-time string of the following format: <code>YYYY-mm-dd'T'HH:MM:SS</code>.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl Filter {
    /// <p>A resource property name. For example, <code>TrainingJobName</code>. For valid property names, see <code>SearchRecord</code>. You must specify a valid property for the resource.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>A Boolean binary operator that is used to evaluate the filter. The operator field contains one of the following values:</p>
    /// <dl>
    /// <dt>
    /// Equals
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> equals <code>Value</code>.</p>
    /// </dd>
    /// <dt>
    /// NotEquals
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> doesn't equal <code>Value</code>.</p>
    /// </dd>
    /// <dt>
    /// Exists
    /// </dt>
    /// <dd>
    /// <p>The <code>Name</code> property exists.</p>
    /// </dd>
    /// <dt>
    /// NotExists
    /// </dt>
    /// <dd>
    /// <p>The <code>Name</code> property does not exist.</p>
    /// </dd>
    /// <dt>
    /// GreaterThan
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is greater than <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// GreaterThanOrEqualTo
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is greater than or equal to <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// LessThan
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is less than <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// LessThanOrEqualTo
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is less than or equal to <code>Value</code>. Not supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// In
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> is one of the comma delimited strings in <code>Value</code>. Only supported for text properties.</p>
    /// </dd>
    /// <dt>
    /// Contains
    /// </dt>
    /// <dd>
    /// <p>The value of <code>Name</code> contains the string <code>Value</code>. Only supported for text properties.</p>
    /// <p>A <code>SearchExpression</code> can include the <code>Contains</code> operator multiple times when the value of <code>Name</code> is one of the following:</p>
    /// <ul>
    /// <li> <p> <code>Experiment.DisplayName</code> </p> </li>
    /// <li> <p> <code>Experiment.ExperimentName</code> </p> </li>
    /// <li> <p> <code>Experiment.Tags</code> </p> </li>
    /// <li> <p> <code>Trial.DisplayName</code> </p> </li>
    /// <li> <p> <code>Trial.TrialName</code> </p> </li>
    /// <li> <p> <code>Trial.Tags</code> </p> </li>
    /// <li> <p> <code>TrialComponent.DisplayName</code> </p> </li>
    /// <li> <p> <code>TrialComponent.TrialComponentName</code> </p> </li>
    /// <li> <p> <code>TrialComponent.Tags</code> </p> </li>
    /// <li> <p> <code>TrialComponent.InputArtifacts</code> </p> </li>
    /// <li> <p> <code>TrialComponent.OutputArtifacts</code> </p> </li>
    /// </ul>
    /// <p>A <code>SearchExpression</code> can include only one <code>Contains</code> operator for all other values of <code>Name</code>. In these cases, if you include multiple <code>Contains</code> operators in the <code>SearchExpression</code>, the result is the following error message: "<code>'CONTAINS' operator usage limit of 1 exceeded.</code>"</p>
    /// </dd>
    /// </dl>
    pub fn operator(&self) -> std::option::Option<&crate::model::Operator> {
        self.operator.as_ref()
    }
    /// <p>A value used with <code>Name</code> and <code>Operator</code> to determine which resources satisfy the filter's condition. For numerical properties, <code>Value</code> must be an integer or floating-point decimal. For timestamp properties, <code>Value</code> must be an ISO 8601 date-time string of the following format: <code>YYYY-mm-dd'T'HH:MM:SS</code>.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`Filter`](crate::model::Filter).
pub mod filter {

    /// A builder for [`Filter`](crate::model::Filter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) operator: std::option::Option<crate::model::Operator>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A resource property name. For example, <code>TrainingJobName</code>. For valid property names, see <code>SearchRecord</code>. You must specify a valid property for the resource.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>A resource property name. For example, <code>TrainingJobName</code>. For valid property names, see <code>SearchRecord</code>. You must specify a valid property for the resource.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>A Boolean binary operator that is used to evaluate the filter. The operator field contains one of the following values:</p>
        /// <dl>
        /// <dt>
        /// Equals
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> equals <code>Value</code>.</p>
        /// </dd>
        /// <dt>
        /// NotEquals
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> doesn't equal <code>Value</code>.</p>
        /// </dd>
        /// <dt>
        /// Exists
        /// </dt>
        /// <dd>
        /// <p>The <code>Name</code> property exists.</p>
        /// </dd>
        /// <dt>
        /// NotExists
        /// </dt>
        /// <dd>
        /// <p>The <code>Name</code> property does not exist.</p>
        /// </dd>
        /// <dt>
        /// GreaterThan
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is greater than <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// GreaterThanOrEqualTo
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is greater than or equal to <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// LessThan
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is less than <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// LessThanOrEqualTo
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is less than or equal to <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// In
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is one of the comma delimited strings in <code>Value</code>. Only supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// Contains
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> contains the string <code>Value</code>. Only supported for text properties.</p>
        /// <p>A <code>SearchExpression</code> can include the <code>Contains</code> operator multiple times when the value of <code>Name</code> is one of the following:</p>
        /// <ul>
        /// <li> <p> <code>Experiment.DisplayName</code> </p> </li>
        /// <li> <p> <code>Experiment.ExperimentName</code> </p> </li>
        /// <li> <p> <code>Experiment.Tags</code> </p> </li>
        /// <li> <p> <code>Trial.DisplayName</code> </p> </li>
        /// <li> <p> <code>Trial.TrialName</code> </p> </li>
        /// <li> <p> <code>Trial.Tags</code> </p> </li>
        /// <li> <p> <code>TrialComponent.DisplayName</code> </p> </li>
        /// <li> <p> <code>TrialComponent.TrialComponentName</code> </p> </li>
        /// <li> <p> <code>TrialComponent.Tags</code> </p> </li>
        /// <li> <p> <code>TrialComponent.InputArtifacts</code> </p> </li>
        /// <li> <p> <code>TrialComponent.OutputArtifacts</code> </p> </li>
        /// </ul>
        /// <p>A <code>SearchExpression</code> can include only one <code>Contains</code> operator for all other values of <code>Name</code>. In these cases, if you include multiple <code>Contains</code> operators in the <code>SearchExpression</code>, the result is the following error message: "<code>'CONTAINS' operator usage limit of 1 exceeded.</code>"</p>
        /// </dd>
        /// </dl>
        pub fn operator(mut self, input: crate::model::Operator) -> Self {
            self.operator = Some(input);
            self
        }
        /// <p>A Boolean binary operator that is used to evaluate the filter. The operator field contains one of the following values:</p>
        /// <dl>
        /// <dt>
        /// Equals
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> equals <code>Value</code>.</p>
        /// </dd>
        /// <dt>
        /// NotEquals
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> doesn't equal <code>Value</code>.</p>
        /// </dd>
        /// <dt>
        /// Exists
        /// </dt>
        /// <dd>
        /// <p>The <code>Name</code> property exists.</p>
        /// </dd>
        /// <dt>
        /// NotExists
        /// </dt>
        /// <dd>
        /// <p>The <code>Name</code> property does not exist.</p>
        /// </dd>
        /// <dt>
        /// GreaterThan
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is greater than <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// GreaterThanOrEqualTo
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is greater than or equal to <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// LessThan
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is less than <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// LessThanOrEqualTo
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is less than or equal to <code>Value</code>. Not supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// In
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> is one of the comma delimited strings in <code>Value</code>. Only supported for text properties.</p>
        /// </dd>
        /// <dt>
        /// Contains
        /// </dt>
        /// <dd>
        /// <p>The value of <code>Name</code> contains the string <code>Value</code>. Only supported for text properties.</p>
        /// <p>A <code>SearchExpression</code> can include the <code>Contains</code> operator multiple times when the value of <code>Name</code> is one of the following:</p>
        /// <ul>
        /// <li> <p> <code>Experiment.DisplayName</code> </p> </li>
        /// <li> <p> <code>Experiment.ExperimentName</code> </p> </li>
        /// <li> <p> <code>Experiment.Tags</code> </p> </li>
        /// <li> <p> <code>Trial.DisplayName</code> </p> </li>
        /// <li> <p> <code>Trial.TrialName</code> </p> </li>
        /// <li> <p> <code>Trial.Tags</code> </p> </li>
        /// <li> <p> <code>TrialComponent.DisplayName</code> </p> </li>
        /// <li> <p> <code>TrialComponent.TrialComponentName</code> </p> </li>
        /// <li> <p> <code>TrialComponent.Tags</code> </p> </li>
        /// <li> <p> <code>TrialComponent.InputArtifacts</code> </p> </li>
        /// <li> <p> <code>TrialComponent.OutputArtifacts</code> </p> </li>
        /// </ul>
        /// <p>A <code>SearchExpression</code> can include only one <code>Contains</code> operator for all other values of <code>Name</code>. In these cases, if you include multiple <code>Contains</code> operators in the <code>SearchExpression</code>, the result is the following error message: "<code>'CONTAINS' operator usage limit of 1 exceeded.</code>"</p>
        /// </dd>
        /// </dl>
        pub fn set_operator(mut self, input: std::option::Option<crate::model::Operator>) -> Self {
            self.operator = input;
            self
        }
        /// <p>A value used with <code>Name</code> and <code>Operator</code> to determine which resources satisfy the filter's condition. For numerical properties, <code>Value</code> must be an integer or floating-point decimal. For timestamp properties, <code>Value</code> must be an ISO 8601 date-time string of the following format: <code>YYYY-mm-dd'T'HH:MM:SS</code>.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>A value used with <code>Name</code> and <code>Operator</code> to determine which resources satisfy the filter's condition. For numerical properties, <code>Value</code> must be an integer or floating-point decimal. For timestamp properties, <code>Value</code> must be an ISO 8601 date-time string of the following format: <code>YYYY-mm-dd'T'HH:MM:SS</code>.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`Filter`](crate::model::Filter).
        pub fn build(self) -> crate::model::Filter {
            crate::model::Filter {
                name: self.name,
                operator: self.operator,
                value: self.value,
            }
        }
    }
}
impl Filter {
    /// Creates a new builder-style object to manufacture [`Filter`](crate::model::Filter).
    pub fn builder() -> crate::model::filter::Builder {
        crate::model::filter::Builder::default()
    }
}

/// When writing a match expression against `Operator`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let operator = unimplemented!();
/// match operator {
///     Operator::Contains => { /* ... */ },
///     Operator::Equals => { /* ... */ },
///     Operator::Exists => { /* ... */ },
///     Operator::GreaterThan => { /* ... */ },
///     Operator::GreaterThanOrEqualTo => { /* ... */ },
///     Operator::In => { /* ... */ },
///     Operator::LessThan => { /* ... */ },
///     Operator::LessThanOrEqualTo => { /* ... */ },
///     Operator::NotEquals => { /* ... */ },
///     Operator::NotExists => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `operator` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `Operator::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `Operator::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `Operator::NewFeature` is defined.
/// Specifically, when `operator` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `Operator::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum Operator {
    #[allow(missing_docs)] // documentation missing in model
    Contains,
    #[allow(missing_docs)] // documentation missing in model
    Equals,
    #[allow(missing_docs)] // documentation missing in model
    Exists,
    #[allow(missing_docs)] // documentation missing in model
    GreaterThan,
    #[allow(missing_docs)] // documentation missing in model
    GreaterThanOrEqualTo,
    #[allow(missing_docs)] // documentation missing in model
    In,
    #[allow(missing_docs)] // documentation missing in model
    LessThan,
    #[allow(missing_docs)] // documentation missing in model
    LessThanOrEqualTo,
    #[allow(missing_docs)] // documentation missing in model
    NotEquals,
    #[allow(missing_docs)] // documentation missing in model
    NotExists,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for Operator {
    fn from(s: &str) -> Self {
        match s {
            "Contains" => Operator::Contains,
            "Equals" => Operator::Equals,
            "Exists" => Operator::Exists,
            "GreaterThan" => Operator::GreaterThan,
            "GreaterThanOrEqualTo" => Operator::GreaterThanOrEqualTo,
            "In" => Operator::In,
            "LessThan" => Operator::LessThan,
            "LessThanOrEqualTo" => Operator::LessThanOrEqualTo,
            "NotEquals" => Operator::NotEquals,
            "NotExists" => Operator::NotExists,
            other => Operator::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for Operator {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(Operator::from(s))
    }
}
impl Operator {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            Operator::Contains => "Contains",
            Operator::Equals => "Equals",
            Operator::Exists => "Exists",
            Operator::GreaterThan => "GreaterThan",
            Operator::GreaterThanOrEqualTo => "GreaterThanOrEqualTo",
            Operator::In => "In",
            Operator::LessThan => "LessThan",
            Operator::LessThanOrEqualTo => "LessThanOrEqualTo",
            Operator::NotEquals => "NotEquals",
            Operator::NotExists => "NotExists",
            Operator::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Contains",
            "Equals",
            "Exists",
            "GreaterThan",
            "GreaterThanOrEqualTo",
            "In",
            "LessThan",
            "LessThanOrEqualTo",
            "NotEquals",
            "NotExists",
        ]
    }
}
impl AsRef<str> for Operator {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ResourceType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let resourcetype = unimplemented!();
/// match resourcetype {
///     ResourceType::Endpoint => { /* ... */ },
///     ResourceType::Experiment => { /* ... */ },
///     ResourceType::ExperimentTrial => { /* ... */ },
///     ResourceType::ExperimentTrialComponent => { /* ... */ },
///     ResourceType::FeatureGroup => { /* ... */ },
///     ResourceType::FeatureMetadata => { /* ... */ },
///     ResourceType::HyperParameterTuningJob => { /* ... */ },
///     ResourceType::Model => { /* ... */ },
///     ResourceType::ModelCard => { /* ... */ },
///     ResourceType::ModelPackage => { /* ... */ },
///     ResourceType::ModelPackageGroup => { /* ... */ },
///     ResourceType::Pipeline => { /* ... */ },
///     ResourceType::PipelineExecution => { /* ... */ },
///     ResourceType::Project => { /* ... */ },
///     ResourceType::TrainingJob => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `resourcetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ResourceType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ResourceType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ResourceType::NewFeature` is defined.
/// Specifically, when `resourcetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ResourceType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ResourceType {
    #[allow(missing_docs)] // documentation missing in model
    Endpoint,
    #[allow(missing_docs)] // documentation missing in model
    Experiment,
    #[allow(missing_docs)] // documentation missing in model
    ExperimentTrial,
    #[allow(missing_docs)] // documentation missing in model
    ExperimentTrialComponent,
    #[allow(missing_docs)] // documentation missing in model
    FeatureGroup,
    #[allow(missing_docs)] // documentation missing in model
    FeatureMetadata,
    #[allow(missing_docs)] // documentation missing in model
    HyperParameterTuningJob,
    #[allow(missing_docs)] // documentation missing in model
    Model,
    #[allow(missing_docs)] // documentation missing in model
    ModelCard,
    #[allow(missing_docs)] // documentation missing in model
    ModelPackage,
    #[allow(missing_docs)] // documentation missing in model
    ModelPackageGroup,
    #[allow(missing_docs)] // documentation missing in model
    Pipeline,
    #[allow(missing_docs)] // documentation missing in model
    PipelineExecution,
    #[allow(missing_docs)] // documentation missing in model
    Project,
    #[allow(missing_docs)] // documentation missing in model
    TrainingJob,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ResourceType {
    fn from(s: &str) -> Self {
        match s {
            "Endpoint" => ResourceType::Endpoint,
            "Experiment" => ResourceType::Experiment,
            "ExperimentTrial" => ResourceType::ExperimentTrial,
            "ExperimentTrialComponent" => ResourceType::ExperimentTrialComponent,
            "FeatureGroup" => ResourceType::FeatureGroup,
            "FeatureMetadata" => ResourceType::FeatureMetadata,
            "HyperParameterTuningJob" => ResourceType::HyperParameterTuningJob,
            "Model" => ResourceType::Model,
            "ModelCard" => ResourceType::ModelCard,
            "ModelPackage" => ResourceType::ModelPackage,
            "ModelPackageGroup" => ResourceType::ModelPackageGroup,
            "Pipeline" => ResourceType::Pipeline,
            "PipelineExecution" => ResourceType::PipelineExecution,
            "Project" => ResourceType::Project,
            "TrainingJob" => ResourceType::TrainingJob,
            other => ResourceType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ResourceType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ResourceType::from(s))
    }
}
impl ResourceType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ResourceType::Endpoint => "Endpoint",
            ResourceType::Experiment => "Experiment",
            ResourceType::ExperimentTrial => "ExperimentTrial",
            ResourceType::ExperimentTrialComponent => "ExperimentTrialComponent",
            ResourceType::FeatureGroup => "FeatureGroup",
            ResourceType::FeatureMetadata => "FeatureMetadata",
            ResourceType::HyperParameterTuningJob => "HyperParameterTuningJob",
            ResourceType::Model => "Model",
            ResourceType::ModelCard => "ModelCard",
            ResourceType::ModelPackage => "ModelPackage",
            ResourceType::ModelPackageGroup => "ModelPackageGroup",
            ResourceType::Pipeline => "Pipeline",
            ResourceType::PipelineExecution => "PipelineExecution",
            ResourceType::Project => "Project",
            ResourceType::TrainingJob => "TrainingJob",
            ResourceType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Endpoint",
            "Experiment",
            "ExperimentTrial",
            "ExperimentTrialComponent",
            "FeatureGroup",
            "FeatureMetadata",
            "HyperParameterTuningJob",
            "Model",
            "ModelCard",
            "ModelPackage",
            "ModelPackageGroup",
            "Pipeline",
            "PipelineExecution",
            "Project",
            "TrainingJob",
        ]
    }
}
impl AsRef<str> for ResourceType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A description of an error that occurred while rendering the template.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RenderingError {
    /// <p>A unique identifier for a specific class of errors.</p>
    #[doc(hidden)]
    pub code: std::option::Option<std::string::String>,
    /// <p>A human-readable message describing the error.</p>
    #[doc(hidden)]
    pub message: std::option::Option<std::string::String>,
}
impl RenderingError {
    /// <p>A unique identifier for a specific class of errors.</p>
    pub fn code(&self) -> std::option::Option<&str> {
        self.code.as_deref()
    }
    /// <p>A human-readable message describing the error.</p>
    pub fn message(&self) -> std::option::Option<&str> {
        self.message.as_deref()
    }
}
/// See [`RenderingError`](crate::model::RenderingError).
pub mod rendering_error {

    /// A builder for [`RenderingError`](crate::model::RenderingError).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) code: std::option::Option<std::string::String>,
        pub(crate) message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A unique identifier for a specific class of errors.</p>
        pub fn code(mut self, input: impl Into<std::string::String>) -> Self {
            self.code = Some(input.into());
            self
        }
        /// <p>A unique identifier for a specific class of errors.</p>
        pub fn set_code(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.code = input;
            self
        }
        /// <p>A human-readable message describing the error.</p>
        pub fn message(mut self, input: impl Into<std::string::String>) -> Self {
            self.message = Some(input.into());
            self
        }
        /// <p>A human-readable message describing the error.</p>
        pub fn set_message(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.message = input;
            self
        }
        /// Consumes the builder and constructs a [`RenderingError`](crate::model::RenderingError).
        pub fn build(self) -> crate::model::RenderingError {
            crate::model::RenderingError {
                code: self.code,
                message: self.message,
            }
        }
    }
}
impl RenderingError {
    /// Creates a new builder-style object to manufacture [`RenderingError`](crate::model::RenderingError).
    pub fn builder() -> crate::model::rendering_error::Builder {
        crate::model::rendering_error::Builder::default()
    }
}

/// <p>Contains input values for a task.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RenderableTask {
    /// <p>A JSON object that contains values for the variables defined in the template. It is made available to the template under the substitution variable <code>task.input</code>. For example, if you define a variable <code>task.input.text</code> in your template, you can supply the variable in the JSON object as <code>"text": "sample text"</code>.</p>
    #[doc(hidden)]
    pub input: std::option::Option<std::string::String>,
}
impl RenderableTask {
    /// <p>A JSON object that contains values for the variables defined in the template. It is made available to the template under the substitution variable <code>task.input</code>. For example, if you define a variable <code>task.input.text</code> in your template, you can supply the variable in the JSON object as <code>"text": "sample text"</code>.</p>
    pub fn input(&self) -> std::option::Option<&str> {
        self.input.as_deref()
    }
}
/// See [`RenderableTask`](crate::model::RenderableTask).
pub mod renderable_task {

    /// A builder for [`RenderableTask`](crate::model::RenderableTask).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) input: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A JSON object that contains values for the variables defined in the template. It is made available to the template under the substitution variable <code>task.input</code>. For example, if you define a variable <code>task.input.text</code> in your template, you can supply the variable in the JSON object as <code>"text": "sample text"</code>.</p>
        pub fn input(mut self, input: impl Into<std::string::String>) -> Self {
            self.input = Some(input.into());
            self
        }
        /// <p>A JSON object that contains values for the variables defined in the template. It is made available to the template under the substitution variable <code>task.input</code>. For example, if you define a variable <code>task.input.text</code> in your template, you can supply the variable in the JSON object as <code>"text": "sample text"</code>.</p>
        pub fn set_input(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.input = input;
            self
        }
        /// Consumes the builder and constructs a [`RenderableTask`](crate::model::RenderableTask).
        pub fn build(self) -> crate::model::RenderableTask {
            crate::model::RenderableTask { input: self.input }
        }
    }
}
impl RenderableTask {
    /// Creates a new builder-style object to manufacture [`RenderableTask`](crate::model::RenderableTask).
    pub fn builder() -> crate::model::renderable_task::Builder {
        crate::model::renderable_task::Builder::default()
    }
}

/// <p>The Liquid template for the worker user interface.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct UiTemplate {
    /// <p>The content of the Liquid template for the worker user interface.</p>
    #[doc(hidden)]
    pub content: std::option::Option<std::string::String>,
}
impl UiTemplate {
    /// <p>The content of the Liquid template for the worker user interface.</p>
    pub fn content(&self) -> std::option::Option<&str> {
        self.content.as_deref()
    }
}
/// See [`UiTemplate`](crate::model::UiTemplate).
pub mod ui_template {

    /// A builder for [`UiTemplate`](crate::model::UiTemplate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) content: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The content of the Liquid template for the worker user interface.</p>
        pub fn content(mut self, input: impl Into<std::string::String>) -> Self {
            self.content = Some(input.into());
            self
        }
        /// <p>The content of the Liquid template for the worker user interface.</p>
        pub fn set_content(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content = input;
            self
        }
        /// Consumes the builder and constructs a [`UiTemplate`](crate::model::UiTemplate).
        pub fn build(self) -> crate::model::UiTemplate {
            crate::model::UiTemplate {
                content: self.content,
            }
        }
    }
}
impl UiTemplate {
    /// Creates a new builder-style object to manufacture [`UiTemplate`](crate::model::UiTemplate).
    pub fn builder() -> crate::model::ui_template::Builder {
        crate::model::ui_template::Builder::default()
    }
}

/// <p>A directed edge connecting two lineage entities.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Edge {
    /// <p>The Amazon Resource Name (ARN) of the source lineage entity of the directed edge.</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the destination lineage entity of the directed edge.</p>
    #[doc(hidden)]
    pub destination_arn: std::option::Option<std::string::String>,
    /// <p>The type of the Association(Edge) between the source and destination. For example <code>ContributedTo</code>, <code>Produced</code>, or <code>DerivedFrom</code>.</p>
    #[doc(hidden)]
    pub association_type: std::option::Option<crate::model::AssociationEdgeType>,
}
impl Edge {
    /// <p>The Amazon Resource Name (ARN) of the source lineage entity of the directed edge.</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the destination lineage entity of the directed edge.</p>
    pub fn destination_arn(&self) -> std::option::Option<&str> {
        self.destination_arn.as_deref()
    }
    /// <p>The type of the Association(Edge) between the source and destination. For example <code>ContributedTo</code>, <code>Produced</code>, or <code>DerivedFrom</code>.</p>
    pub fn association_type(&self) -> std::option::Option<&crate::model::AssociationEdgeType> {
        self.association_type.as_ref()
    }
}
/// See [`Edge`](crate::model::Edge).
pub mod edge {

    /// A builder for [`Edge`](crate::model::Edge).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) destination_arn: std::option::Option<std::string::String>,
        pub(crate) association_type: std::option::Option<crate::model::AssociationEdgeType>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the source lineage entity of the directed edge.</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the source lineage entity of the directed edge.</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the destination lineage entity of the directed edge.</p>
        pub fn destination_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the destination lineage entity of the directed edge.</p>
        pub fn set_destination_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_arn = input;
            self
        }
        /// <p>The type of the Association(Edge) between the source and destination. For example <code>ContributedTo</code>, <code>Produced</code>, or <code>DerivedFrom</code>.</p>
        pub fn association_type(mut self, input: crate::model::AssociationEdgeType) -> Self {
            self.association_type = Some(input);
            self
        }
        /// <p>The type of the Association(Edge) between the source and destination. For example <code>ContributedTo</code>, <code>Produced</code>, or <code>DerivedFrom</code>.</p>
        pub fn set_association_type(
            mut self,
            input: std::option::Option<crate::model::AssociationEdgeType>,
        ) -> Self {
            self.association_type = input;
            self
        }
        /// Consumes the builder and constructs a [`Edge`](crate::model::Edge).
        pub fn build(self) -> crate::model::Edge {
            crate::model::Edge {
                source_arn: self.source_arn,
                destination_arn: self.destination_arn,
                association_type: self.association_type,
            }
        }
    }
}
impl Edge {
    /// Creates a new builder-style object to manufacture [`Edge`](crate::model::Edge).
    pub fn builder() -> crate::model::edge::Builder {
        crate::model::edge::Builder::default()
    }
}

/// When writing a match expression against `AssociationEdgeType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let associationedgetype = unimplemented!();
/// match associationedgetype {
///     AssociationEdgeType::AssociatedWith => { /* ... */ },
///     AssociationEdgeType::ContributedTo => { /* ... */ },
///     AssociationEdgeType::DerivedFrom => { /* ... */ },
///     AssociationEdgeType::Produced => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `associationedgetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AssociationEdgeType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AssociationEdgeType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AssociationEdgeType::NewFeature` is defined.
/// Specifically, when `associationedgetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AssociationEdgeType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AssociationEdgeType {
    #[allow(missing_docs)] // documentation missing in model
    AssociatedWith,
    #[allow(missing_docs)] // documentation missing in model
    ContributedTo,
    #[allow(missing_docs)] // documentation missing in model
    DerivedFrom,
    #[allow(missing_docs)] // documentation missing in model
    Produced,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AssociationEdgeType {
    fn from(s: &str) -> Self {
        match s {
            "AssociatedWith" => AssociationEdgeType::AssociatedWith,
            "ContributedTo" => AssociationEdgeType::ContributedTo,
            "DerivedFrom" => AssociationEdgeType::DerivedFrom,
            "Produced" => AssociationEdgeType::Produced,
            other => {
                AssociationEdgeType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for AssociationEdgeType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AssociationEdgeType::from(s))
    }
}
impl AssociationEdgeType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AssociationEdgeType::AssociatedWith => "AssociatedWith",
            AssociationEdgeType::ContributedTo => "ContributedTo",
            AssociationEdgeType::DerivedFrom => "DerivedFrom",
            AssociationEdgeType::Produced => "Produced",
            AssociationEdgeType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["AssociatedWith", "ContributedTo", "DerivedFrom", "Produced"]
    }
}
impl AsRef<str> for AssociationEdgeType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A lineage entity connected to the starting entity(ies).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Vertex {
    /// <p>The Amazon Resource Name (ARN) of the lineage entity resource.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
    /// <p>The type of the lineage entity resource. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, etc...</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<std::string::String>,
    /// <p>The type of resource of the lineage entity.</p>
    #[doc(hidden)]
    pub lineage_type: std::option::Option<crate::model::LineageType>,
}
impl Vertex {
    /// <p>The Amazon Resource Name (ARN) of the lineage entity resource.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
    /// <p>The type of the lineage entity resource. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, etc...</p>
    pub fn r#type(&self) -> std::option::Option<&str> {
        self.r#type.as_deref()
    }
    /// <p>The type of resource of the lineage entity.</p>
    pub fn lineage_type(&self) -> std::option::Option<&crate::model::LineageType> {
        self.lineage_type.as_ref()
    }
}
/// See [`Vertex`](crate::model::Vertex).
pub mod vertex {

    /// A builder for [`Vertex`](crate::model::Vertex).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
        pub(crate) r#type: std::option::Option<std::string::String>,
        pub(crate) lineage_type: std::option::Option<crate::model::LineageType>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the lineage entity resource.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the lineage entity resource.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// <p>The type of the lineage entity resource. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, etc...</p>
        pub fn r#type(mut self, input: impl Into<std::string::String>) -> Self {
            self.r#type = Some(input.into());
            self
        }
        /// <p>The type of the lineage entity resource. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, etc...</p>
        pub fn set_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The type of resource of the lineage entity.</p>
        pub fn lineage_type(mut self, input: crate::model::LineageType) -> Self {
            self.lineage_type = Some(input);
            self
        }
        /// <p>The type of resource of the lineage entity.</p>
        pub fn set_lineage_type(
            mut self,
            input: std::option::Option<crate::model::LineageType>,
        ) -> Self {
            self.lineage_type = input;
            self
        }
        /// Consumes the builder and constructs a [`Vertex`](crate::model::Vertex).
        pub fn build(self) -> crate::model::Vertex {
            crate::model::Vertex {
                arn: self.arn,
                r#type: self.r#type,
                lineage_type: self.lineage_type,
            }
        }
    }
}
impl Vertex {
    /// Creates a new builder-style object to manufacture [`Vertex`](crate::model::Vertex).
    pub fn builder() -> crate::model::vertex::Builder {
        crate::model::vertex::Builder::default()
    }
}

/// When writing a match expression against `LineageType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let lineagetype = unimplemented!();
/// match lineagetype {
///     LineageType::Action => { /* ... */ },
///     LineageType::Artifact => { /* ... */ },
///     LineageType::Context => { /* ... */ },
///     LineageType::TrialComponent => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `lineagetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `LineageType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `LineageType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `LineageType::NewFeature` is defined.
/// Specifically, when `lineagetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `LineageType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum LineageType {
    #[allow(missing_docs)] // documentation missing in model
    Action,
    #[allow(missing_docs)] // documentation missing in model
    Artifact,
    #[allow(missing_docs)] // documentation missing in model
    Context,
    #[allow(missing_docs)] // documentation missing in model
    TrialComponent,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for LineageType {
    fn from(s: &str) -> Self {
        match s {
            "Action" => LineageType::Action,
            "Artifact" => LineageType::Artifact,
            "Context" => LineageType::Context,
            "TrialComponent" => LineageType::TrialComponent,
            other => LineageType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for LineageType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(LineageType::from(s))
    }
}
impl LineageType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            LineageType::Action => "Action",
            LineageType::Artifact => "Artifact",
            LineageType::Context => "Context",
            LineageType::TrialComponent => "TrialComponent",
            LineageType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Action", "Artifact", "Context", "TrialComponent"]
    }
}
impl AsRef<str> for LineageType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A set of filters to narrow the set of lineage entities connected to the <code>StartArn</code>(s) returned by the <code>QueryLineage</code> API action.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct QueryFilters {
    /// <p>Filter the lineage entities connected to the <code>StartArn</code> by type. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, or <code>ModelDeployment</code>.</p>
    #[doc(hidden)]
    pub types: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by the type of the lineage entity.</p>
    #[doc(hidden)]
    pub lineage_types: std::option::Option<std::vec::Vec<crate::model::LineageType>>,
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by created date.</p>
    #[doc(hidden)]
    pub created_before: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the create date.</p>
    #[doc(hidden)]
    pub created_after: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) before the last modified date.</p>
    #[doc(hidden)]
    pub modified_before: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the last modified date.</p>
    #[doc(hidden)]
    pub modified_after: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by a set if property key value pairs. If multiple pairs are provided, an entity is included in the results if it matches any of the provided pairs.</p>
    #[doc(hidden)]
    pub properties:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl QueryFilters {
    /// <p>Filter the lineage entities connected to the <code>StartArn</code> by type. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, or <code>ModelDeployment</code>.</p>
    pub fn types(&self) -> std::option::Option<&[std::string::String]> {
        self.types.as_deref()
    }
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by the type of the lineage entity.</p>
    pub fn lineage_types(&self) -> std::option::Option<&[crate::model::LineageType]> {
        self.lineage_types.as_deref()
    }
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by created date.</p>
    pub fn created_before(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.created_before.as_ref()
    }
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the create date.</p>
    pub fn created_after(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.created_after.as_ref()
    }
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) before the last modified date.</p>
    pub fn modified_before(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.modified_before.as_ref()
    }
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the last modified date.</p>
    pub fn modified_after(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.modified_after.as_ref()
    }
    /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by a set if property key value pairs. If multiple pairs are provided, an entity is included in the results if it matches any of the provided pairs.</p>
    pub fn properties(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.properties.as_ref()
    }
}
/// See [`QueryFilters`](crate::model::QueryFilters).
pub mod query_filters {

    /// A builder for [`QueryFilters`](crate::model::QueryFilters).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) types: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) lineage_types: std::option::Option<std::vec::Vec<crate::model::LineageType>>,
        pub(crate) created_before: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_after: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) modified_before: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) modified_after: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) properties: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// Appends an item to `types`.
        ///
        /// To override the contents of this collection use [`set_types`](Self::set_types).
        ///
        /// <p>Filter the lineage entities connected to the <code>StartArn</code> by type. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, or <code>ModelDeployment</code>.</p>
        pub fn types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.types.unwrap_or_default();
            v.push(input.into());
            self.types = Some(v);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code> by type. For example: <code>DataSet</code>, <code>Model</code>, <code>Endpoint</code>, or <code>ModelDeployment</code>.</p>
        pub fn set_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.types = input;
            self
        }
        /// Appends an item to `lineage_types`.
        ///
        /// To override the contents of this collection use [`set_lineage_types`](Self::set_lineage_types).
        ///
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by the type of the lineage entity.</p>
        pub fn lineage_types(mut self, input: crate::model::LineageType) -> Self {
            let mut v = self.lineage_types.unwrap_or_default();
            v.push(input);
            self.lineage_types = Some(v);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by the type of the lineage entity.</p>
        pub fn set_lineage_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::LineageType>>,
        ) -> Self {
            self.lineage_types = input;
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by created date.</p>
        pub fn created_before(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.created_before = Some(input);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by created date.</p>
        pub fn set_created_before(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.created_before = input;
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the create date.</p>
        pub fn created_after(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.created_after = Some(input);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the create date.</p>
        pub fn set_created_after(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.created_after = input;
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) before the last modified date.</p>
        pub fn modified_before(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.modified_before = Some(input);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) before the last modified date.</p>
        pub fn set_modified_before(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.modified_before = input;
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the last modified date.</p>
        pub fn modified_after(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.modified_after = Some(input);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) after the last modified date.</p>
        pub fn set_modified_after(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.modified_after = input;
            self
        }
        /// Adds a key-value pair to `properties`.
        ///
        /// To override the contents of this collection use [`set_properties`](Self::set_properties).
        ///
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by a set if property key value pairs. If multiple pairs are provided, an entity is included in the results if it matches any of the provided pairs.</p>
        pub fn properties(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.properties.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.properties = Some(hash_map);
            self
        }
        /// <p>Filter the lineage entities connected to the <code>StartArn</code>(s) by a set if property key value pairs. If multiple pairs are provided, an entity is included in the results if it matches any of the provided pairs.</p>
        pub fn set_properties(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.properties = input;
            self
        }
        /// Consumes the builder and constructs a [`QueryFilters`](crate::model::QueryFilters).
        pub fn build(self) -> crate::model::QueryFilters {
            crate::model::QueryFilters {
                types: self.types,
                lineage_types: self.lineage_types,
                created_before: self.created_before,
                created_after: self.created_after,
                modified_before: self.modified_before,
                modified_after: self.modified_after,
                properties: self.properties,
            }
        }
    }
}
impl QueryFilters {
    /// Creates a new builder-style object to manufacture [`QueryFilters`](crate::model::QueryFilters).
    pub fn builder() -> crate::model::query_filters::Builder {
        crate::model::query_filters::Builder::default()
    }
}

/// When writing a match expression against `Direction`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let direction = unimplemented!();
/// match direction {
///     Direction::Ascendants => { /* ... */ },
///     Direction::Both => { /* ... */ },
///     Direction::Descendants => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `direction` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `Direction::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `Direction::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `Direction::NewFeature` is defined.
/// Specifically, when `direction` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `Direction::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum Direction {
    #[allow(missing_docs)] // documentation missing in model
    Ascendants,
    #[allow(missing_docs)] // documentation missing in model
    Both,
    #[allow(missing_docs)] // documentation missing in model
    Descendants,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for Direction {
    fn from(s: &str) -> Self {
        match s {
            "Ascendants" => Direction::Ascendants,
            "Both" => Direction::Both,
            "Descendants" => Direction::Descendants,
            other => Direction::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for Direction {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(Direction::from(s))
    }
}
impl Direction {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            Direction::Ascendants => "Ascendants",
            Direction::Both => "Both",
            Direction::Descendants => "Descendants",
            Direction::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascendants", "Both", "Descendants"]
    }
}
impl AsRef<str> for Direction {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `SortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortorder = unimplemented!();
/// match sortorder {
///     SortOrder::Ascending => { /* ... */ },
///     SortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortOrder::NewFeature` is defined.
/// Specifically, when `sortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => SortOrder::Ascending,
            "Descending" => SortOrder::Descending,
            other => SortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortOrder::from(s))
    }
}
impl SortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortOrder::Ascending => "Ascending",
            SortOrder::Descending => "Descending",
            SortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for SortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ListWorkteamsSortByOptions`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listworkteamssortbyoptions = unimplemented!();
/// match listworkteamssortbyoptions {
///     ListWorkteamsSortByOptions::CreateDate => { /* ... */ },
///     ListWorkteamsSortByOptions::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listworkteamssortbyoptions` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListWorkteamsSortByOptions::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListWorkteamsSortByOptions::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListWorkteamsSortByOptions::NewFeature` is defined.
/// Specifically, when `listworkteamssortbyoptions` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListWorkteamsSortByOptions::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListWorkteamsSortByOptions {
    #[allow(missing_docs)] // documentation missing in model
    CreateDate,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListWorkteamsSortByOptions {
    fn from(s: &str) -> Self {
        match s {
            "CreateDate" => ListWorkteamsSortByOptions::CreateDate,
            "Name" => ListWorkteamsSortByOptions::Name,
            other => ListWorkteamsSortByOptions::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ListWorkteamsSortByOptions {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListWorkteamsSortByOptions::from(s))
    }
}
impl ListWorkteamsSortByOptions {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListWorkteamsSortByOptions::CreateDate => "CreateDate",
            ListWorkteamsSortByOptions::Name => "Name",
            ListWorkteamsSortByOptions::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreateDate", "Name"]
    }
}
impl AsRef<str> for ListWorkteamsSortByOptions {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ListWorkforcesSortByOptions`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listworkforcessortbyoptions = unimplemented!();
/// match listworkforcessortbyoptions {
///     ListWorkforcesSortByOptions::CreateDate => { /* ... */ },
///     ListWorkforcesSortByOptions::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listworkforcessortbyoptions` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListWorkforcesSortByOptions::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListWorkforcesSortByOptions::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListWorkforcesSortByOptions::NewFeature` is defined.
/// Specifically, when `listworkforcessortbyoptions` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListWorkforcesSortByOptions::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListWorkforcesSortByOptions {
    #[allow(missing_docs)] // documentation missing in model
    CreateDate,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListWorkforcesSortByOptions {
    fn from(s: &str) -> Self {
        match s {
            "CreateDate" => ListWorkforcesSortByOptions::CreateDate,
            "Name" => ListWorkforcesSortByOptions::Name,
            other => ListWorkforcesSortByOptions::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ListWorkforcesSortByOptions {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListWorkforcesSortByOptions::from(s))
    }
}
impl ListWorkforcesSortByOptions {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListWorkforcesSortByOptions::CreateDate => "CreateDate",
            ListWorkforcesSortByOptions::Name => "Name",
            ListWorkforcesSortByOptions::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreateDate", "Name"]
    }
}
impl AsRef<str> for ListWorkforcesSortByOptions {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The user profile details.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct UserProfileDetails {
    /// <p>The domain ID.</p>
    #[doc(hidden)]
    pub domain_id: std::option::Option<std::string::String>,
    /// <p>The user profile name.</p>
    #[doc(hidden)]
    pub user_profile_name: std::option::Option<std::string::String>,
    /// <p>The status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::UserProfileStatus>,
    /// <p>The creation time.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last modified time.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl UserProfileDetails {
    /// <p>The domain ID.</p>
    pub fn domain_id(&self) -> std::option::Option<&str> {
        self.domain_id.as_deref()
    }
    /// <p>The user profile name.</p>
    pub fn user_profile_name(&self) -> std::option::Option<&str> {
        self.user_profile_name.as_deref()
    }
    /// <p>The status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::UserProfileStatus> {
        self.status.as_ref()
    }
    /// <p>The creation time.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last modified time.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`UserProfileDetails`](crate::model::UserProfileDetails).
pub mod user_profile_details {

    /// A builder for [`UserProfileDetails`](crate::model::UserProfileDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain_id: std::option::Option<std::string::String>,
        pub(crate) user_profile_name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::UserProfileStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The domain ID.</p>
        pub fn domain_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_id = Some(input.into());
            self
        }
        /// <p>The domain ID.</p>
        pub fn set_domain_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_id = input;
            self
        }
        /// <p>The user profile name.</p>
        pub fn user_profile_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_profile_name = Some(input.into());
            self
        }
        /// <p>The user profile name.</p>
        pub fn set_user_profile_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.user_profile_name = input;
            self
        }
        /// <p>The status.</p>
        pub fn status(mut self, input: crate::model::UserProfileStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::UserProfileStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The creation time.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last modified time.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last modified time.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`UserProfileDetails`](crate::model::UserProfileDetails).
        pub fn build(self) -> crate::model::UserProfileDetails {
            crate::model::UserProfileDetails {
                domain_id: self.domain_id,
                user_profile_name: self.user_profile_name,
                status: self.status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl UserProfileDetails {
    /// Creates a new builder-style object to manufacture [`UserProfileDetails`](crate::model::UserProfileDetails).
    pub fn builder() -> crate::model::user_profile_details::Builder {
        crate::model::user_profile_details::Builder::default()
    }
}

/// When writing a match expression against `UserProfileStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let userprofilestatus = unimplemented!();
/// match userprofilestatus {
///     UserProfileStatus::DeleteFailed => { /* ... */ },
///     UserProfileStatus::Deleting => { /* ... */ },
///     UserProfileStatus::Failed => { /* ... */ },
///     UserProfileStatus::InService => { /* ... */ },
///     UserProfileStatus::Pending => { /* ... */ },
///     UserProfileStatus::UpdateFailed => { /* ... */ },
///     UserProfileStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `userprofilestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `UserProfileStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `UserProfileStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `UserProfileStatus::NewFeature` is defined.
/// Specifically, when `userprofilestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `UserProfileStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum UserProfileStatus {
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    UpdateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for UserProfileStatus {
    fn from(s: &str) -> Self {
        match s {
            "Delete_Failed" => UserProfileStatus::DeleteFailed,
            "Deleting" => UserProfileStatus::Deleting,
            "Failed" => UserProfileStatus::Failed,
            "InService" => UserProfileStatus::InService,
            "Pending" => UserProfileStatus::Pending,
            "Update_Failed" => UserProfileStatus::UpdateFailed,
            "Updating" => UserProfileStatus::Updating,
            other => {
                UserProfileStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for UserProfileStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(UserProfileStatus::from(s))
    }
}
impl UserProfileStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            UserProfileStatus::DeleteFailed => "Delete_Failed",
            UserProfileStatus::Deleting => "Deleting",
            UserProfileStatus::Failed => "Failed",
            UserProfileStatus::InService => "InService",
            UserProfileStatus::Pending => "Pending",
            UserProfileStatus::UpdateFailed => "Update_Failed",
            UserProfileStatus::Updating => "Updating",
            UserProfileStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Delete_Failed",
            "Deleting",
            "Failed",
            "InService",
            "Pending",
            "Update_Failed",
            "Updating",
        ]
    }
}
impl AsRef<str> for UserProfileStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `UserProfileSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let userprofilesortkey = unimplemented!();
/// match userprofilesortkey {
///     UserProfileSortKey::CreationTime => { /* ... */ },
///     UserProfileSortKey::LastModifiedTime => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `userprofilesortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `UserProfileSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `UserProfileSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `UserProfileSortKey::NewFeature` is defined.
/// Specifically, when `userprofilesortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `UserProfileSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum UserProfileSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for UserProfileSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => UserProfileSortKey::CreationTime,
            "LastModifiedTime" => UserProfileSortKey::LastModifiedTime,
            other => {
                UserProfileSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for UserProfileSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(UserProfileSortKey::from(s))
    }
}
impl UserProfileSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            UserProfileSortKey::CreationTime => "CreationTime",
            UserProfileSortKey::LastModifiedTime => "LastModifiedTime",
            UserProfileSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "LastModifiedTime"]
    }
}
impl AsRef<str> for UserProfileSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of the properties of a trial. To get the complete set of properties, call the <code>DescribeTrial</code> API and provide the <code>TrialName</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialSummary {
    /// <p>The Amazon Resource Name (ARN) of the trial.</p>
    #[doc(hidden)]
    pub trial_arn: std::option::Option<std::string::String>,
    /// <p>The name of the trial.</p>
    #[doc(hidden)]
    pub trial_name: std::option::Option<std::string::String>,
    /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The source of the trial.</p>
    #[doc(hidden)]
    pub trial_source: std::option::Option<crate::model::TrialSource>,
    /// <p>When the trial was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the trial was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl TrialSummary {
    /// <p>The Amazon Resource Name (ARN) of the trial.</p>
    pub fn trial_arn(&self) -> std::option::Option<&str> {
        self.trial_arn.as_deref()
    }
    /// <p>The name of the trial.</p>
    pub fn trial_name(&self) -> std::option::Option<&str> {
        self.trial_name.as_deref()
    }
    /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The source of the trial.</p>
    pub fn trial_source(&self) -> std::option::Option<&crate::model::TrialSource> {
        self.trial_source.as_ref()
    }
    /// <p>When the trial was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When the trial was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`TrialSummary`](crate::model::TrialSummary).
pub mod trial_summary {

    /// A builder for [`TrialSummary`](crate::model::TrialSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) trial_arn: std::option::Option<std::string::String>,
        pub(crate) trial_name: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) trial_source: std::option::Option<crate::model::TrialSource>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the trial.</p>
        pub fn trial_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial.</p>
        pub fn set_trial_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_arn = input;
            self
        }
        /// <p>The name of the trial.</p>
        pub fn trial_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_name = Some(input.into());
            self
        }
        /// <p>The name of the trial.</p>
        pub fn set_trial_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.trial_name = input;
            self
        }
        /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the trial as displayed. If <code>DisplayName</code> isn't specified, <code>TrialName</code> is displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The source of the trial.</p>
        pub fn trial_source(mut self, input: crate::model::TrialSource) -> Self {
            self.trial_source = Some(input);
            self
        }
        /// <p>The source of the trial.</p>
        pub fn set_trial_source(
            mut self,
            input: std::option::Option<crate::model::TrialSource>,
        ) -> Self {
            self.trial_source = input;
            self
        }
        /// <p>When the trial was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the trial was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When the trial was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the trial was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialSummary`](crate::model::TrialSummary).
        pub fn build(self) -> crate::model::TrialSummary {
            crate::model::TrialSummary {
                trial_arn: self.trial_arn,
                trial_name: self.trial_name,
                display_name: self.display_name,
                trial_source: self.trial_source,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl TrialSummary {
    /// Creates a new builder-style object to manufacture [`TrialSummary`](crate::model::TrialSummary).
    pub fn builder() -> crate::model::trial_summary::Builder {
        crate::model::trial_summary::Builder::default()
    }
}

/// When writing a match expression against `SortTrialsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sorttrialsby = unimplemented!();
/// match sorttrialsby {
///     SortTrialsBy::CreationTime => { /* ... */ },
///     SortTrialsBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sorttrialsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortTrialsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortTrialsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortTrialsBy::NewFeature` is defined.
/// Specifically, when `sorttrialsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortTrialsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortTrialsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortTrialsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortTrialsBy::CreationTime,
            "Name" => SortTrialsBy::Name,
            other => SortTrialsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortTrialsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortTrialsBy::from(s))
    }
}
impl SortTrialsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortTrialsBy::CreationTime => "CreationTime",
            SortTrialsBy::Name => "Name",
            SortTrialsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortTrialsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of the properties of a trial component. To get all the properties, call the <code>DescribeTrialComponent</code> API and provide the <code>TrialComponentName</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrialComponentSummary {
    /// <p>The name of the trial component.</p>
    #[doc(hidden)]
    pub trial_component_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
    #[doc(hidden)]
    pub trial_component_arn: std::option::Option<std::string::String>,
    /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
    #[doc(hidden)]
    pub trial_component_source: std::option::Option<crate::model::TrialComponentSource>,
    /// <p>The status of the component. States include:</p>
    /// <ul>
    /// <li> <p>InProgress</p> </li>
    /// <li> <p>Completed</p> </li>
    /// <li> <p>Failed</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::TrialComponentStatus>,
    /// <p>When the component started.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the component ended.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the component was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Who created the trial component.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
    /// <p>When the component was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Who last modified the component.</p>
    #[doc(hidden)]
    pub last_modified_by: std::option::Option<crate::model::UserContext>,
}
impl TrialComponentSummary {
    /// <p>The name of the trial component.</p>
    pub fn trial_component_name(&self) -> std::option::Option<&str> {
        self.trial_component_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
    pub fn trial_component_arn(&self) -> std::option::Option<&str> {
        self.trial_component_arn.as_deref()
    }
    /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
    pub fn trial_component_source(
        &self,
    ) -> std::option::Option<&crate::model::TrialComponentSource> {
        self.trial_component_source.as_ref()
    }
    /// <p>The status of the component. States include:</p>
    /// <ul>
    /// <li> <p>InProgress</p> </li>
    /// <li> <p>Completed</p> </li>
    /// <li> <p>Failed</p> </li>
    /// </ul>
    pub fn status(&self) -> std::option::Option<&crate::model::TrialComponentStatus> {
        self.status.as_ref()
    }
    /// <p>When the component started.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>When the component ended.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
    /// <p>When the component was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Who created the trial component.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
    /// <p>When the component was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Who last modified the component.</p>
    pub fn last_modified_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.last_modified_by.as_ref()
    }
}
/// See [`TrialComponentSummary`](crate::model::TrialComponentSummary).
pub mod trial_component_summary {

    /// A builder for [`TrialComponentSummary`](crate::model::TrialComponentSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) trial_component_name: std::option::Option<std::string::String>,
        pub(crate) trial_component_arn: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) trial_component_source: std::option::Option<crate::model::TrialComponentSource>,
        pub(crate) status: std::option::Option<crate::model::TrialComponentStatus>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_by: std::option::Option<crate::model::UserContext>,
    }
    impl Builder {
        /// <p>The name of the trial component.</p>
        pub fn trial_component_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_component_name = Some(input.into());
            self
        }
        /// <p>The name of the trial component.</p>
        pub fn set_trial_component_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
        pub fn trial_component_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.trial_component_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the trial component.</p>
        pub fn set_trial_component_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.trial_component_arn = input;
            self
        }
        /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the component as displayed. If <code>DisplayName</code> isn't specified, <code>TrialComponentName</code> is displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
        pub fn trial_component_source(mut self, input: crate::model::TrialComponentSource) -> Self {
            self.trial_component_source = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) and job type of the source of a trial component.</p>
        pub fn set_trial_component_source(
            mut self,
            input: std::option::Option<crate::model::TrialComponentSource>,
        ) -> Self {
            self.trial_component_source = input;
            self
        }
        /// <p>The status of the component. States include:</p>
        /// <ul>
        /// <li> <p>InProgress</p> </li>
        /// <li> <p>Completed</p> </li>
        /// <li> <p>Failed</p> </li>
        /// </ul>
        pub fn status(mut self, input: crate::model::TrialComponentStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the component. States include:</p>
        /// <ul>
        /// <li> <p>InProgress</p> </li>
        /// <li> <p>Completed</p> </li>
        /// <li> <p>Failed</p> </li>
        /// </ul>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::TrialComponentStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>When the component started.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>When the component started.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// <p>When the component ended.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>When the component ended.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// <p>When the component was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the component was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Who created the trial component.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Who created the trial component.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// <p>When the component was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the component was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Who last modified the component.</p>
        pub fn last_modified_by(mut self, input: crate::model::UserContext) -> Self {
            self.last_modified_by = Some(input);
            self
        }
        /// <p>Who last modified the component.</p>
        pub fn set_last_modified_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.last_modified_by = input;
            self
        }
        /// Consumes the builder and constructs a [`TrialComponentSummary`](crate::model::TrialComponentSummary).
        pub fn build(self) -> crate::model::TrialComponentSummary {
            crate::model::TrialComponentSummary {
                trial_component_name: self.trial_component_name,
                trial_component_arn: self.trial_component_arn,
                display_name: self.display_name,
                trial_component_source: self.trial_component_source,
                status: self.status,
                start_time: self.start_time,
                end_time: self.end_time,
                creation_time: self.creation_time,
                created_by: self.created_by,
                last_modified_time: self.last_modified_time,
                last_modified_by: self.last_modified_by,
            }
        }
    }
}
impl TrialComponentSummary {
    /// Creates a new builder-style object to manufacture [`TrialComponentSummary`](crate::model::TrialComponentSummary).
    pub fn builder() -> crate::model::trial_component_summary::Builder {
        crate::model::trial_component_summary::Builder::default()
    }
}

/// When writing a match expression against `SortTrialComponentsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sorttrialcomponentsby = unimplemented!();
/// match sorttrialcomponentsby {
///     SortTrialComponentsBy::CreationTime => { /* ... */ },
///     SortTrialComponentsBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sorttrialcomponentsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortTrialComponentsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortTrialComponentsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortTrialComponentsBy::NewFeature` is defined.
/// Specifically, when `sorttrialcomponentsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortTrialComponentsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortTrialComponentsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortTrialComponentsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortTrialComponentsBy::CreationTime,
            "Name" => SortTrialComponentsBy::Name,
            other => {
                SortTrialComponentsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for SortTrialComponentsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortTrialComponentsBy::from(s))
    }
}
impl SortTrialComponentsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortTrialComponentsBy::CreationTime => "CreationTime",
            SortTrialComponentsBy::Name => "Name",
            SortTrialComponentsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortTrialComponentsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides a summary of a transform job. Multiple <code>TransformJobSummary</code> objects are returned as a list after in response to a <code>ListTransformJobs</code> call.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformJobSummary {
    /// <p>The name of the transform job.</p>
    #[doc(hidden)]
    pub transform_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
    #[doc(hidden)]
    pub transform_job_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the transform Job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Indicates when the transform job ends on compute instances. For successful jobs and stopped jobs, this is the exact time recorded after the results are uploaded. For failed jobs, this is when Amazon SageMaker detected that the job failed.</p>
    #[doc(hidden)]
    pub transform_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Indicates when the transform job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the transform job.</p>
    #[doc(hidden)]
    pub transform_job_status: std::option::Option<crate::model::TransformJobStatus>,
    /// <p>If the transform job failed, the reason it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl TransformJobSummary {
    /// <p>The name of the transform job.</p>
    pub fn transform_job_name(&self) -> std::option::Option<&str> {
        self.transform_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
    pub fn transform_job_arn(&self) -> std::option::Option<&str> {
        self.transform_job_arn.as_deref()
    }
    /// <p>A timestamp that shows when the transform Job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Indicates when the transform job ends on compute instances. For successful jobs and stopped jobs, this is the exact time recorded after the results are uploaded. For failed jobs, this is when Amazon SageMaker detected that the job failed.</p>
    pub fn transform_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.transform_end_time.as_ref()
    }
    /// <p>Indicates when the transform job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the transform job.</p>
    pub fn transform_job_status(&self) -> std::option::Option<&crate::model::TransformJobStatus> {
        self.transform_job_status.as_ref()
    }
    /// <p>If the transform job failed, the reason it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`TransformJobSummary`](crate::model::TransformJobSummary).
pub mod transform_job_summary {

    /// A builder for [`TransformJobSummary`](crate::model::TransformJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) transform_job_name: std::option::Option<std::string::String>,
        pub(crate) transform_job_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) transform_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) transform_job_status: std::option::Option<crate::model::TransformJobStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the transform job.</p>
        pub fn transform_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.transform_job_name = Some(input.into());
            self
        }
        /// <p>The name of the transform job.</p>
        pub fn set_transform_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.transform_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
        pub fn transform_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.transform_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job.</p>
        pub fn set_transform_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.transform_job_arn = input;
            self
        }
        /// <p>A timestamp that shows when the transform Job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the transform Job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Indicates when the transform job ends on compute instances. For successful jobs and stopped jobs, this is the exact time recorded after the results are uploaded. For failed jobs, this is when Amazon SageMaker detected that the job failed.</p>
        pub fn transform_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.transform_end_time = Some(input);
            self
        }
        /// <p>Indicates when the transform job ends on compute instances. For successful jobs and stopped jobs, this is the exact time recorded after the results are uploaded. For failed jobs, this is when Amazon SageMaker detected that the job failed.</p>
        pub fn set_transform_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.transform_end_time = input;
            self
        }
        /// <p>Indicates when the transform job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>Indicates when the transform job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the transform job.</p>
        pub fn transform_job_status(mut self, input: crate::model::TransformJobStatus) -> Self {
            self.transform_job_status = Some(input);
            self
        }
        /// <p>The status of the transform job.</p>
        pub fn set_transform_job_status(
            mut self,
            input: std::option::Option<crate::model::TransformJobStatus>,
        ) -> Self {
            self.transform_job_status = input;
            self
        }
        /// <p>If the transform job failed, the reason it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the transform job failed, the reason it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformJobSummary`](crate::model::TransformJobSummary).
        pub fn build(self) -> crate::model::TransformJobSummary {
            crate::model::TransformJobSummary {
                transform_job_name: self.transform_job_name,
                transform_job_arn: self.transform_job_arn,
                creation_time: self.creation_time,
                transform_end_time: self.transform_end_time,
                last_modified_time: self.last_modified_time,
                transform_job_status: self.transform_job_status,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl TransformJobSummary {
    /// Creates a new builder-style object to manufacture [`TransformJobSummary`](crate::model::TransformJobSummary).
    pub fn builder() -> crate::model::transform_job_summary::Builder {
        crate::model::transform_job_summary::Builder::default()
    }
}

/// When writing a match expression against `SortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortby = unimplemented!();
/// match sortby {
///     SortBy::CreationTime => { /* ... */ },
///     SortBy::Name => { /* ... */ },
///     SortBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortBy::NewFeature` is defined.
/// Specifically, when `sortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortBy::CreationTime,
            "Name" => SortBy::Name,
            "Status" => SortBy::Status,
            other => SortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortBy::from(s))
    }
}
impl SortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortBy::CreationTime => "CreationTime",
            SortBy::Name => "Name",
            SortBy::Status => "Status",
            SortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for SortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TrainingJobSortByOptions`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let trainingjobsortbyoptions = unimplemented!();
/// match trainingjobsortbyoptions {
///     TrainingJobSortByOptions::CreationTime => { /* ... */ },
///     TrainingJobSortByOptions::FinalObjectiveMetricValue => { /* ... */ },
///     TrainingJobSortByOptions::Name => { /* ... */ },
///     TrainingJobSortByOptions::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `trainingjobsortbyoptions` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrainingJobSortByOptions::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrainingJobSortByOptions::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrainingJobSortByOptions::NewFeature` is defined.
/// Specifically, when `trainingjobsortbyoptions` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrainingJobSortByOptions::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrainingJobSortByOptions {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    FinalObjectiveMetricValue,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrainingJobSortByOptions {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => TrainingJobSortByOptions::CreationTime,
            "FinalObjectiveMetricValue" => TrainingJobSortByOptions::FinalObjectiveMetricValue,
            "Name" => TrainingJobSortByOptions::Name,
            "Status" => TrainingJobSortByOptions::Status,
            other => TrainingJobSortByOptions::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for TrainingJobSortByOptions {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrainingJobSortByOptions::from(s))
    }
}
impl TrainingJobSortByOptions {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrainingJobSortByOptions::CreationTime => "CreationTime",
            TrainingJobSortByOptions::FinalObjectiveMetricValue => "FinalObjectiveMetricValue",
            TrainingJobSortByOptions::Name => "Name",
            TrainingJobSortByOptions::Status => "Status",
            TrainingJobSortByOptions::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CreationTime",
            "FinalObjectiveMetricValue",
            "Name",
            "Status",
        ]
    }
}
impl AsRef<str> for TrainingJobSortByOptions {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about a training job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrainingJobSummary {
    /// <p>The name of the training job that you want a summary for.</p>
    #[doc(hidden)]
    pub training_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the training job.</p>
    #[doc(hidden)]
    pub training_job_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the training job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that shows when the training job ended. This field is set only if the training job has one of the terminal statuses (<code>Completed</code>, <code>Failed</code>, or <code>Stopped</code>). </p>
    #[doc(hidden)]
    pub training_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p> Timestamp when the training job was last modified. </p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the training job.</p>
    #[doc(hidden)]
    pub training_job_status: std::option::Option<crate::model::TrainingJobStatus>,
    /// <p>The status of the warm pool associated with the training job.</p>
    #[doc(hidden)]
    pub warm_pool_status: std::option::Option<crate::model::WarmPoolStatus>,
}
impl TrainingJobSummary {
    /// <p>The name of the training job that you want a summary for.</p>
    pub fn training_job_name(&self) -> std::option::Option<&str> {
        self.training_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the training job.</p>
    pub fn training_job_arn(&self) -> std::option::Option<&str> {
        self.training_job_arn.as_deref()
    }
    /// <p>A timestamp that shows when the training job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that shows when the training job ended. This field is set only if the training job has one of the terminal statuses (<code>Completed</code>, <code>Failed</code>, or <code>Stopped</code>). </p>
    pub fn training_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.training_end_time.as_ref()
    }
    /// <p> Timestamp when the training job was last modified. </p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the training job.</p>
    pub fn training_job_status(&self) -> std::option::Option<&crate::model::TrainingJobStatus> {
        self.training_job_status.as_ref()
    }
    /// <p>The status of the warm pool associated with the training job.</p>
    pub fn warm_pool_status(&self) -> std::option::Option<&crate::model::WarmPoolStatus> {
        self.warm_pool_status.as_ref()
    }
}
/// See [`TrainingJobSummary`](crate::model::TrainingJobSummary).
pub mod training_job_summary {

    /// A builder for [`TrainingJobSummary`](crate::model::TrainingJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_job_name: std::option::Option<std::string::String>,
        pub(crate) training_job_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_job_status: std::option::Option<crate::model::TrainingJobStatus>,
        pub(crate) warm_pool_status: std::option::Option<crate::model::WarmPoolStatus>,
    }
    impl Builder {
        /// <p>The name of the training job that you want a summary for.</p>
        pub fn training_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_name = Some(input.into());
            self
        }
        /// <p>The name of the training job that you want a summary for.</p>
        pub fn set_training_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job.</p>
        pub fn training_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job.</p>
        pub fn set_training_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_job_arn = input;
            self
        }
        /// <p>A timestamp that shows when the training job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the training job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that shows when the training job ended. This field is set only if the training job has one of the terminal statuses (<code>Completed</code>, <code>Failed</code>, or <code>Stopped</code>). </p>
        pub fn training_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.training_end_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the training job ended. This field is set only if the training job has one of the terminal statuses (<code>Completed</code>, <code>Failed</code>, or <code>Stopped</code>). </p>
        pub fn set_training_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.training_end_time = input;
            self
        }
        /// <p> Timestamp when the training job was last modified. </p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p> Timestamp when the training job was last modified. </p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the training job.</p>
        pub fn training_job_status(mut self, input: crate::model::TrainingJobStatus) -> Self {
            self.training_job_status = Some(input);
            self
        }
        /// <p>The status of the training job.</p>
        pub fn set_training_job_status(
            mut self,
            input: std::option::Option<crate::model::TrainingJobStatus>,
        ) -> Self {
            self.training_job_status = input;
            self
        }
        /// <p>The status of the warm pool associated with the training job.</p>
        pub fn warm_pool_status(mut self, input: crate::model::WarmPoolStatus) -> Self {
            self.warm_pool_status = Some(input);
            self
        }
        /// <p>The status of the warm pool associated with the training job.</p>
        pub fn set_warm_pool_status(
            mut self,
            input: std::option::Option<crate::model::WarmPoolStatus>,
        ) -> Self {
            self.warm_pool_status = input;
            self
        }
        /// Consumes the builder and constructs a [`TrainingJobSummary`](crate::model::TrainingJobSummary).
        pub fn build(self) -> crate::model::TrainingJobSummary {
            crate::model::TrainingJobSummary {
                training_job_name: self.training_job_name,
                training_job_arn: self.training_job_arn,
                creation_time: self.creation_time,
                training_end_time: self.training_end_time,
                last_modified_time: self.last_modified_time,
                training_job_status: self.training_job_status,
                warm_pool_status: self.warm_pool_status,
            }
        }
    }
}
impl TrainingJobSummary {
    /// Creates a new builder-style object to manufacture [`TrainingJobSummary`](crate::model::TrainingJobSummary).
    pub fn builder() -> crate::model::training_job_summary::Builder {
        crate::model::training_job_summary::Builder::default()
    }
}

/// <p>Status and billing information about the warm pool.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct WarmPoolStatus {
    /// <p>The status of the warm pool.</p>
    /// <ul>
    /// <li> <p> <code>InUse</code>: The warm pool is in use for the training job.</p> </li>
    /// <li> <p> <code>Available</code>: The warm pool is available to reuse for a matching training job.</p> </li>
    /// <li> <p> <code>Reused</code>: The warm pool moved to a matching training job for reuse.</p> </li>
    /// <li> <p> <code>Terminated</code>: The warm pool is no longer available. Warm pools are unavailable if they are terminated by a user, terminated for a patch update, or terminated for exceeding the specified <code>KeepAlivePeriodInSeconds</code>.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::WarmPoolResourceStatus>,
    /// <p>The billable time in seconds used by the warm pool. Billable time refers to the absolute wall-clock time.</p>
    /// <p>Multiply <code>ResourceRetainedBillableTimeInSeconds</code> by the number of instances (<code>InstanceCount</code>) in your training cluster to get the total compute time SageMaker bills you if you run warm pool training. The formula is as follows: <code>ResourceRetainedBillableTimeInSeconds * InstanceCount</code>.</p>
    #[doc(hidden)]
    pub resource_retained_billable_time_in_seconds: std::option::Option<i32>,
    /// <p>The name of the matching training job that reused the warm pool.</p>
    #[doc(hidden)]
    pub reused_by_job: std::option::Option<std::string::String>,
}
impl WarmPoolStatus {
    /// <p>The status of the warm pool.</p>
    /// <ul>
    /// <li> <p> <code>InUse</code>: The warm pool is in use for the training job.</p> </li>
    /// <li> <p> <code>Available</code>: The warm pool is available to reuse for a matching training job.</p> </li>
    /// <li> <p> <code>Reused</code>: The warm pool moved to a matching training job for reuse.</p> </li>
    /// <li> <p> <code>Terminated</code>: The warm pool is no longer available. Warm pools are unavailable if they are terminated by a user, terminated for a patch update, or terminated for exceeding the specified <code>KeepAlivePeriodInSeconds</code>.</p> </li>
    /// </ul>
    pub fn status(&self) -> std::option::Option<&crate::model::WarmPoolResourceStatus> {
        self.status.as_ref()
    }
    /// <p>The billable time in seconds used by the warm pool. Billable time refers to the absolute wall-clock time.</p>
    /// <p>Multiply <code>ResourceRetainedBillableTimeInSeconds</code> by the number of instances (<code>InstanceCount</code>) in your training cluster to get the total compute time SageMaker bills you if you run warm pool training. The formula is as follows: <code>ResourceRetainedBillableTimeInSeconds * InstanceCount</code>.</p>
    pub fn resource_retained_billable_time_in_seconds(&self) -> std::option::Option<i32> {
        self.resource_retained_billable_time_in_seconds
    }
    /// <p>The name of the matching training job that reused the warm pool.</p>
    pub fn reused_by_job(&self) -> std::option::Option<&str> {
        self.reused_by_job.as_deref()
    }
}
/// See [`WarmPoolStatus`](crate::model::WarmPoolStatus).
pub mod warm_pool_status {

    /// A builder for [`WarmPoolStatus`](crate::model::WarmPoolStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) status: std::option::Option<crate::model::WarmPoolResourceStatus>,
        pub(crate) resource_retained_billable_time_in_seconds: std::option::Option<i32>,
        pub(crate) reused_by_job: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The status of the warm pool.</p>
        /// <ul>
        /// <li> <p> <code>InUse</code>: The warm pool is in use for the training job.</p> </li>
        /// <li> <p> <code>Available</code>: The warm pool is available to reuse for a matching training job.</p> </li>
        /// <li> <p> <code>Reused</code>: The warm pool moved to a matching training job for reuse.</p> </li>
        /// <li> <p> <code>Terminated</code>: The warm pool is no longer available. Warm pools are unavailable if they are terminated by a user, terminated for a patch update, or terminated for exceeding the specified <code>KeepAlivePeriodInSeconds</code>.</p> </li>
        /// </ul>
        pub fn status(mut self, input: crate::model::WarmPoolResourceStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the warm pool.</p>
        /// <ul>
        /// <li> <p> <code>InUse</code>: The warm pool is in use for the training job.</p> </li>
        /// <li> <p> <code>Available</code>: The warm pool is available to reuse for a matching training job.</p> </li>
        /// <li> <p> <code>Reused</code>: The warm pool moved to a matching training job for reuse.</p> </li>
        /// <li> <p> <code>Terminated</code>: The warm pool is no longer available. Warm pools are unavailable if they are terminated by a user, terminated for a patch update, or terminated for exceeding the specified <code>KeepAlivePeriodInSeconds</code>.</p> </li>
        /// </ul>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::WarmPoolResourceStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The billable time in seconds used by the warm pool. Billable time refers to the absolute wall-clock time.</p>
        /// <p>Multiply <code>ResourceRetainedBillableTimeInSeconds</code> by the number of instances (<code>InstanceCount</code>) in your training cluster to get the total compute time SageMaker bills you if you run warm pool training. The formula is as follows: <code>ResourceRetainedBillableTimeInSeconds * InstanceCount</code>.</p>
        pub fn resource_retained_billable_time_in_seconds(mut self, input: i32) -> Self {
            self.resource_retained_billable_time_in_seconds = Some(input);
            self
        }
        /// <p>The billable time in seconds used by the warm pool. Billable time refers to the absolute wall-clock time.</p>
        /// <p>Multiply <code>ResourceRetainedBillableTimeInSeconds</code> by the number of instances (<code>InstanceCount</code>) in your training cluster to get the total compute time SageMaker bills you if you run warm pool training. The formula is as follows: <code>ResourceRetainedBillableTimeInSeconds * InstanceCount</code>.</p>
        pub fn set_resource_retained_billable_time_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.resource_retained_billable_time_in_seconds = input;
            self
        }
        /// <p>The name of the matching training job that reused the warm pool.</p>
        pub fn reused_by_job(mut self, input: impl Into<std::string::String>) -> Self {
            self.reused_by_job = Some(input.into());
            self
        }
        /// <p>The name of the matching training job that reused the warm pool.</p>
        pub fn set_reused_by_job(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.reused_by_job = input;
            self
        }
        /// Consumes the builder and constructs a [`WarmPoolStatus`](crate::model::WarmPoolStatus).
        pub fn build(self) -> crate::model::WarmPoolStatus {
            crate::model::WarmPoolStatus {
                status: self.status,
                resource_retained_billable_time_in_seconds: self
                    .resource_retained_billable_time_in_seconds,
                reused_by_job: self.reused_by_job,
            }
        }
    }
}
impl WarmPoolStatus {
    /// Creates a new builder-style object to manufacture [`WarmPoolStatus`](crate::model::WarmPoolStatus).
    pub fn builder() -> crate::model::warm_pool_status::Builder {
        crate::model::warm_pool_status::Builder::default()
    }
}

/// When writing a match expression against `WarmPoolResourceStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let warmpoolresourcestatus = unimplemented!();
/// match warmpoolresourcestatus {
///     WarmPoolResourceStatus::Available => { /* ... */ },
///     WarmPoolResourceStatus::Inuse => { /* ... */ },
///     WarmPoolResourceStatus::Reused => { /* ... */ },
///     WarmPoolResourceStatus::Terminated => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `warmpoolresourcestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `WarmPoolResourceStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `WarmPoolResourceStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `WarmPoolResourceStatus::NewFeature` is defined.
/// Specifically, when `warmpoolresourcestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `WarmPoolResourceStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum WarmPoolResourceStatus {
    #[allow(missing_docs)] // documentation missing in model
    Available,
    #[allow(missing_docs)] // documentation missing in model
    Inuse,
    #[allow(missing_docs)] // documentation missing in model
    Reused,
    #[allow(missing_docs)] // documentation missing in model
    Terminated,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for WarmPoolResourceStatus {
    fn from(s: &str) -> Self {
        match s {
            "Available" => WarmPoolResourceStatus::Available,
            "InUse" => WarmPoolResourceStatus::Inuse,
            "Reused" => WarmPoolResourceStatus::Reused,
            "Terminated" => WarmPoolResourceStatus::Terminated,
            other => {
                WarmPoolResourceStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for WarmPoolResourceStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(WarmPoolResourceStatus::from(s))
    }
}
impl WarmPoolResourceStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            WarmPoolResourceStatus::Available => "Available",
            WarmPoolResourceStatus::Inuse => "InUse",
            WarmPoolResourceStatus::Reused => "Reused",
            WarmPoolResourceStatus::Terminated => "Terminated",
            WarmPoolResourceStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Available", "InUse", "Reused", "Terminated"]
    }
}
impl AsRef<str> for WarmPoolResourceStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Describes a work team of a vendor that does the a labelling job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SubscribedWorkteam {
    /// <p>The Amazon Resource Name (ARN) of the vendor that you have subscribed.</p>
    #[doc(hidden)]
    pub workteam_arn: std::option::Option<std::string::String>,
    /// <p>The title of the service provided by the vendor in the Amazon Marketplace.</p>
    #[doc(hidden)]
    pub marketplace_title: std::option::Option<std::string::String>,
    /// <p>The name of the vendor in the Amazon Marketplace.</p>
    #[doc(hidden)]
    pub seller_name: std::option::Option<std::string::String>,
    /// <p>The description of the vendor from the Amazon Marketplace.</p>
    #[doc(hidden)]
    pub marketplace_description: std::option::Option<std::string::String>,
    /// <p>Marketplace product listing ID.</p>
    #[doc(hidden)]
    pub listing_id: std::option::Option<std::string::String>,
}
impl SubscribedWorkteam {
    /// <p>The Amazon Resource Name (ARN) of the vendor that you have subscribed.</p>
    pub fn workteam_arn(&self) -> std::option::Option<&str> {
        self.workteam_arn.as_deref()
    }
    /// <p>The title of the service provided by the vendor in the Amazon Marketplace.</p>
    pub fn marketplace_title(&self) -> std::option::Option<&str> {
        self.marketplace_title.as_deref()
    }
    /// <p>The name of the vendor in the Amazon Marketplace.</p>
    pub fn seller_name(&self) -> std::option::Option<&str> {
        self.seller_name.as_deref()
    }
    /// <p>The description of the vendor from the Amazon Marketplace.</p>
    pub fn marketplace_description(&self) -> std::option::Option<&str> {
        self.marketplace_description.as_deref()
    }
    /// <p>Marketplace product listing ID.</p>
    pub fn listing_id(&self) -> std::option::Option<&str> {
        self.listing_id.as_deref()
    }
}
/// See [`SubscribedWorkteam`](crate::model::SubscribedWorkteam).
pub mod subscribed_workteam {

    /// A builder for [`SubscribedWorkteam`](crate::model::SubscribedWorkteam).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) workteam_arn: std::option::Option<std::string::String>,
        pub(crate) marketplace_title: std::option::Option<std::string::String>,
        pub(crate) seller_name: std::option::Option<std::string::String>,
        pub(crate) marketplace_description: std::option::Option<std::string::String>,
        pub(crate) listing_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the vendor that you have subscribed.</p>
        pub fn workteam_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workteam_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the vendor that you have subscribed.</p>
        pub fn set_workteam_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.workteam_arn = input;
            self
        }
        /// <p>The title of the service provided by the vendor in the Amazon Marketplace.</p>
        pub fn marketplace_title(mut self, input: impl Into<std::string::String>) -> Self {
            self.marketplace_title = Some(input.into());
            self
        }
        /// <p>The title of the service provided by the vendor in the Amazon Marketplace.</p>
        pub fn set_marketplace_title(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.marketplace_title = input;
            self
        }
        /// <p>The name of the vendor in the Amazon Marketplace.</p>
        pub fn seller_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.seller_name = Some(input.into());
            self
        }
        /// <p>The name of the vendor in the Amazon Marketplace.</p>
        pub fn set_seller_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.seller_name = input;
            self
        }
        /// <p>The description of the vendor from the Amazon Marketplace.</p>
        pub fn marketplace_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.marketplace_description = Some(input.into());
            self
        }
        /// <p>The description of the vendor from the Amazon Marketplace.</p>
        pub fn set_marketplace_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.marketplace_description = input;
            self
        }
        /// <p>Marketplace product listing ID.</p>
        pub fn listing_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.listing_id = Some(input.into());
            self
        }
        /// <p>Marketplace product listing ID.</p>
        pub fn set_listing_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.listing_id = input;
            self
        }
        /// Consumes the builder and constructs a [`SubscribedWorkteam`](crate::model::SubscribedWorkteam).
        pub fn build(self) -> crate::model::SubscribedWorkteam {
            crate::model::SubscribedWorkteam {
                workteam_arn: self.workteam_arn,
                marketplace_title: self.marketplace_title,
                seller_name: self.seller_name,
                marketplace_description: self.marketplace_description,
                listing_id: self.listing_id,
            }
        }
    }
}
impl SubscribedWorkteam {
    /// Creates a new builder-style object to manufacture [`SubscribedWorkteam`](crate::model::SubscribedWorkteam).
    pub fn builder() -> crate::model::subscribed_workteam::Builder {
        crate::model::subscribed_workteam::Builder::default()
    }
}

/// <p>Details of the Studio Lifecycle Configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct StudioLifecycleConfigDetails {
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration.</p>
    #[doc(hidden)]
    pub studio_lifecycle_config_arn: std::option::Option<std::string::String>,
    /// <p>The name of the Studio Lifecycle Configuration.</p>
    #[doc(hidden)]
    pub studio_lifecycle_config_name: std::option::Option<std::string::String>,
    /// <p>The creation time of the Studio Lifecycle Configuration.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>This value is equivalent to CreationTime because Studio Lifecycle Configurations are immutable.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The App type to which the Lifecycle Configuration is attached.</p>
    #[doc(hidden)]
    pub studio_lifecycle_config_app_type:
        std::option::Option<crate::model::StudioLifecycleConfigAppType>,
}
impl StudioLifecycleConfigDetails {
    /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration.</p>
    pub fn studio_lifecycle_config_arn(&self) -> std::option::Option<&str> {
        self.studio_lifecycle_config_arn.as_deref()
    }
    /// <p>The name of the Studio Lifecycle Configuration.</p>
    pub fn studio_lifecycle_config_name(&self) -> std::option::Option<&str> {
        self.studio_lifecycle_config_name.as_deref()
    }
    /// <p>The creation time of the Studio Lifecycle Configuration.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>This value is equivalent to CreationTime because Studio Lifecycle Configurations are immutable.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The App type to which the Lifecycle Configuration is attached.</p>
    pub fn studio_lifecycle_config_app_type(
        &self,
    ) -> std::option::Option<&crate::model::StudioLifecycleConfigAppType> {
        self.studio_lifecycle_config_app_type.as_ref()
    }
}
/// See [`StudioLifecycleConfigDetails`](crate::model::StudioLifecycleConfigDetails).
pub mod studio_lifecycle_config_details {

    /// A builder for [`StudioLifecycleConfigDetails`](crate::model::StudioLifecycleConfigDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) studio_lifecycle_config_arn: std::option::Option<std::string::String>,
        pub(crate) studio_lifecycle_config_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) studio_lifecycle_config_app_type:
            std::option::Option<crate::model::StudioLifecycleConfigAppType>,
    }
    impl Builder {
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration.</p>
        pub fn studio_lifecycle_config_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.studio_lifecycle_config_arn = Some(input.into());
            self
        }
        /// <p> The Amazon Resource Name (ARN) of the Lifecycle Configuration.</p>
        pub fn set_studio_lifecycle_config_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.studio_lifecycle_config_arn = input;
            self
        }
        /// <p>The name of the Studio Lifecycle Configuration.</p>
        pub fn studio_lifecycle_config_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.studio_lifecycle_config_name = Some(input.into());
            self
        }
        /// <p>The name of the Studio Lifecycle Configuration.</p>
        pub fn set_studio_lifecycle_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.studio_lifecycle_config_name = input;
            self
        }
        /// <p>The creation time of the Studio Lifecycle Configuration.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the Studio Lifecycle Configuration.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>This value is equivalent to CreationTime because Studio Lifecycle Configurations are immutable.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>This value is equivalent to CreationTime because Studio Lifecycle Configurations are immutable.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The App type to which the Lifecycle Configuration is attached.</p>
        pub fn studio_lifecycle_config_app_type(
            mut self,
            input: crate::model::StudioLifecycleConfigAppType,
        ) -> Self {
            self.studio_lifecycle_config_app_type = Some(input);
            self
        }
        /// <p>The App type to which the Lifecycle Configuration is attached.</p>
        pub fn set_studio_lifecycle_config_app_type(
            mut self,
            input: std::option::Option<crate::model::StudioLifecycleConfigAppType>,
        ) -> Self {
            self.studio_lifecycle_config_app_type = input;
            self
        }
        /// Consumes the builder and constructs a [`StudioLifecycleConfigDetails`](crate::model::StudioLifecycleConfigDetails).
        pub fn build(self) -> crate::model::StudioLifecycleConfigDetails {
            crate::model::StudioLifecycleConfigDetails {
                studio_lifecycle_config_arn: self.studio_lifecycle_config_arn,
                studio_lifecycle_config_name: self.studio_lifecycle_config_name,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                studio_lifecycle_config_app_type: self.studio_lifecycle_config_app_type,
            }
        }
    }
}
impl StudioLifecycleConfigDetails {
    /// Creates a new builder-style object to manufacture [`StudioLifecycleConfigDetails`](crate::model::StudioLifecycleConfigDetails).
    pub fn builder() -> crate::model::studio_lifecycle_config_details::Builder {
        crate::model::studio_lifecycle_config_details::Builder::default()
    }
}

/// When writing a match expression against `StudioLifecycleConfigAppType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let studiolifecycleconfigapptype = unimplemented!();
/// match studiolifecycleconfigapptype {
///     StudioLifecycleConfigAppType::JupyterServer => { /* ... */ },
///     StudioLifecycleConfigAppType::KernelGateway => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `studiolifecycleconfigapptype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `StudioLifecycleConfigAppType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `StudioLifecycleConfigAppType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `StudioLifecycleConfigAppType::NewFeature` is defined.
/// Specifically, when `studiolifecycleconfigapptype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `StudioLifecycleConfigAppType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum StudioLifecycleConfigAppType {
    #[allow(missing_docs)] // documentation missing in model
    JupyterServer,
    #[allow(missing_docs)] // documentation missing in model
    KernelGateway,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for StudioLifecycleConfigAppType {
    fn from(s: &str) -> Self {
        match s {
            "JupyterServer" => StudioLifecycleConfigAppType::JupyterServer,
            "KernelGateway" => StudioLifecycleConfigAppType::KernelGateway,
            other => StudioLifecycleConfigAppType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for StudioLifecycleConfigAppType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(StudioLifecycleConfigAppType::from(s))
    }
}
impl StudioLifecycleConfigAppType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            StudioLifecycleConfigAppType::JupyterServer => "JupyterServer",
            StudioLifecycleConfigAppType::KernelGateway => "KernelGateway",
            StudioLifecycleConfigAppType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["JupyterServer", "KernelGateway"]
    }
}
impl AsRef<str> for StudioLifecycleConfigAppType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `StudioLifecycleConfigSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let studiolifecycleconfigsortkey = unimplemented!();
/// match studiolifecycleconfigsortkey {
///     StudioLifecycleConfigSortKey::CreationTime => { /* ... */ },
///     StudioLifecycleConfigSortKey::LastModifiedTime => { /* ... */ },
///     StudioLifecycleConfigSortKey::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `studiolifecycleconfigsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `StudioLifecycleConfigSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `StudioLifecycleConfigSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `StudioLifecycleConfigSortKey::NewFeature` is defined.
/// Specifically, when `studiolifecycleconfigsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `StudioLifecycleConfigSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum StudioLifecycleConfigSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for StudioLifecycleConfigSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => StudioLifecycleConfigSortKey::CreationTime,
            "LastModifiedTime" => StudioLifecycleConfigSortKey::LastModifiedTime,
            "Name" => StudioLifecycleConfigSortKey::Name,
            other => StudioLifecycleConfigSortKey::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for StudioLifecycleConfigSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(StudioLifecycleConfigSortKey::from(s))
    }
}
impl StudioLifecycleConfigSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            StudioLifecycleConfigSortKey::CreationTime => "CreationTime",
            StudioLifecycleConfigSortKey::LastModifiedTime => "LastModifiedTime",
            StudioLifecycleConfigSortKey::Name => "Name",
            StudioLifecycleConfigSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "LastModifiedTime", "Name"]
    }
}
impl AsRef<str> for StudioLifecycleConfigSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information summarizing device details and deployment status.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeviceDeploymentSummary {
    /// <p>The ARN of the edge deployment plan.</p>
    #[doc(hidden)]
    pub edge_deployment_plan_arn: std::option::Option<std::string::String>,
    /// <p>The name of the edge deployment plan.</p>
    #[doc(hidden)]
    pub edge_deployment_plan_name: std::option::Option<std::string::String>,
    /// <p>The name of the stage in the edge deployment plan.</p>
    #[doc(hidden)]
    pub stage_name: std::option::Option<std::string::String>,
    /// <p>The name of the deployed stage.</p>
    #[doc(hidden)]
    pub deployed_stage_name: std::option::Option<std::string::String>,
    /// <p>The name of the fleet to which the device belongs to.</p>
    #[doc(hidden)]
    pub device_fleet_name: std::option::Option<std::string::String>,
    /// <p>The name of the device.</p>
    #[doc(hidden)]
    pub device_name: std::option::Option<std::string::String>,
    /// <p>The ARN of the device.</p>
    #[doc(hidden)]
    pub device_arn: std::option::Option<std::string::String>,
    /// <p>The deployment status of the device.</p>
    #[doc(hidden)]
    pub device_deployment_status: std::option::Option<crate::model::DeviceDeploymentStatus>,
    /// <p>The detailed error message for the deployoment status result.</p>
    #[doc(hidden)]
    pub device_deployment_status_message: std::option::Option<std::string::String>,
    /// <p>The description of the device.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The time when the deployment on the device started.</p>
    #[doc(hidden)]
    pub deployment_start_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl DeviceDeploymentSummary {
    /// <p>The ARN of the edge deployment plan.</p>
    pub fn edge_deployment_plan_arn(&self) -> std::option::Option<&str> {
        self.edge_deployment_plan_arn.as_deref()
    }
    /// <p>The name of the edge deployment plan.</p>
    pub fn edge_deployment_plan_name(&self) -> std::option::Option<&str> {
        self.edge_deployment_plan_name.as_deref()
    }
    /// <p>The name of the stage in the edge deployment plan.</p>
    pub fn stage_name(&self) -> std::option::Option<&str> {
        self.stage_name.as_deref()
    }
    /// <p>The name of the deployed stage.</p>
    pub fn deployed_stage_name(&self) -> std::option::Option<&str> {
        self.deployed_stage_name.as_deref()
    }
    /// <p>The name of the fleet to which the device belongs to.</p>
    pub fn device_fleet_name(&self) -> std::option::Option<&str> {
        self.device_fleet_name.as_deref()
    }
    /// <p>The name of the device.</p>
    pub fn device_name(&self) -> std::option::Option<&str> {
        self.device_name.as_deref()
    }
    /// <p>The ARN of the device.</p>
    pub fn device_arn(&self) -> std::option::Option<&str> {
        self.device_arn.as_deref()
    }
    /// <p>The deployment status of the device.</p>
    pub fn device_deployment_status(
        &self,
    ) -> std::option::Option<&crate::model::DeviceDeploymentStatus> {
        self.device_deployment_status.as_ref()
    }
    /// <p>The detailed error message for the deployoment status result.</p>
    pub fn device_deployment_status_message(&self) -> std::option::Option<&str> {
        self.device_deployment_status_message.as_deref()
    }
    /// <p>The description of the device.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The time when the deployment on the device started.</p>
    pub fn deployment_start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.deployment_start_time.as_ref()
    }
}
/// See [`DeviceDeploymentSummary`](crate::model::DeviceDeploymentSummary).
pub mod device_deployment_summary {

    /// A builder for [`DeviceDeploymentSummary`](crate::model::DeviceDeploymentSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) edge_deployment_plan_arn: std::option::Option<std::string::String>,
        pub(crate) edge_deployment_plan_name: std::option::Option<std::string::String>,
        pub(crate) stage_name: std::option::Option<std::string::String>,
        pub(crate) deployed_stage_name: std::option::Option<std::string::String>,
        pub(crate) device_fleet_name: std::option::Option<std::string::String>,
        pub(crate) device_name: std::option::Option<std::string::String>,
        pub(crate) device_arn: std::option::Option<std::string::String>,
        pub(crate) device_deployment_status:
            std::option::Option<crate::model::DeviceDeploymentStatus>,
        pub(crate) device_deployment_status_message: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) deployment_start_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The ARN of the edge deployment plan.</p>
        pub fn edge_deployment_plan_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_deployment_plan_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the edge deployment plan.</p>
        pub fn set_edge_deployment_plan_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_deployment_plan_arn = input;
            self
        }
        /// <p>The name of the edge deployment plan.</p>
        pub fn edge_deployment_plan_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_deployment_plan_name = Some(input.into());
            self
        }
        /// <p>The name of the edge deployment plan.</p>
        pub fn set_edge_deployment_plan_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_deployment_plan_name = input;
            self
        }
        /// <p>The name of the stage in the edge deployment plan.</p>
        pub fn stage_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.stage_name = Some(input.into());
            self
        }
        /// <p>The name of the stage in the edge deployment plan.</p>
        pub fn set_stage_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.stage_name = input;
            self
        }
        /// <p>The name of the deployed stage.</p>
        pub fn deployed_stage_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.deployed_stage_name = Some(input.into());
            self
        }
        /// <p>The name of the deployed stage.</p>
        pub fn set_deployed_stage_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.deployed_stage_name = input;
            self
        }
        /// <p>The name of the fleet to which the device belongs to.</p>
        pub fn device_fleet_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_fleet_name = Some(input.into());
            self
        }
        /// <p>The name of the fleet to which the device belongs to.</p>
        pub fn set_device_fleet_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_fleet_name = input;
            self
        }
        /// <p>The name of the device.</p>
        pub fn device_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_name = Some(input.into());
            self
        }
        /// <p>The name of the device.</p>
        pub fn set_device_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.device_name = input;
            self
        }
        /// <p>The ARN of the device.</p>
        pub fn device_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the device.</p>
        pub fn set_device_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.device_arn = input;
            self
        }
        /// <p>The deployment status of the device.</p>
        pub fn device_deployment_status(
            mut self,
            input: crate::model::DeviceDeploymentStatus,
        ) -> Self {
            self.device_deployment_status = Some(input);
            self
        }
        /// <p>The deployment status of the device.</p>
        pub fn set_device_deployment_status(
            mut self,
            input: std::option::Option<crate::model::DeviceDeploymentStatus>,
        ) -> Self {
            self.device_deployment_status = input;
            self
        }
        /// <p>The detailed error message for the deployoment status result.</p>
        pub fn device_deployment_status_message(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.device_deployment_status_message = Some(input.into());
            self
        }
        /// <p>The detailed error message for the deployoment status result.</p>
        pub fn set_device_deployment_status_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_deployment_status_message = input;
            self
        }
        /// <p>The description of the device.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>The description of the device.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>The time when the deployment on the device started.</p>
        pub fn deployment_start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.deployment_start_time = Some(input);
            self
        }
        /// <p>The time when the deployment on the device started.</p>
        pub fn set_deployment_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.deployment_start_time = input;
            self
        }
        /// Consumes the builder and constructs a [`DeviceDeploymentSummary`](crate::model::DeviceDeploymentSummary).
        pub fn build(self) -> crate::model::DeviceDeploymentSummary {
            crate::model::DeviceDeploymentSummary {
                edge_deployment_plan_arn: self.edge_deployment_plan_arn,
                edge_deployment_plan_name: self.edge_deployment_plan_name,
                stage_name: self.stage_name,
                deployed_stage_name: self.deployed_stage_name,
                device_fleet_name: self.device_fleet_name,
                device_name: self.device_name,
                device_arn: self.device_arn,
                device_deployment_status: self.device_deployment_status,
                device_deployment_status_message: self.device_deployment_status_message,
                description: self.description,
                deployment_start_time: self.deployment_start_time,
            }
        }
    }
}
impl DeviceDeploymentSummary {
    /// Creates a new builder-style object to manufacture [`DeviceDeploymentSummary`](crate::model::DeviceDeploymentSummary).
    pub fn builder() -> crate::model::device_deployment_summary::Builder {
        crate::model::device_deployment_summary::Builder::default()
    }
}

/// When writing a match expression against `DeviceDeploymentStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let devicedeploymentstatus = unimplemented!();
/// match devicedeploymentstatus {
///     DeviceDeploymentStatus::Deployed => { /* ... */ },
///     DeviceDeploymentStatus::Failed => { /* ... */ },
///     DeviceDeploymentStatus::InProgress => { /* ... */ },
///     DeviceDeploymentStatus::ReadyToDeploy => { /* ... */ },
///     DeviceDeploymentStatus::Stopped => { /* ... */ },
///     DeviceDeploymentStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `devicedeploymentstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DeviceDeploymentStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DeviceDeploymentStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DeviceDeploymentStatus::NewFeature` is defined.
/// Specifically, when `devicedeploymentstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DeviceDeploymentStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DeviceDeploymentStatus {
    #[allow(missing_docs)] // documentation missing in model
    Deployed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    ReadyToDeploy,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DeviceDeploymentStatus {
    fn from(s: &str) -> Self {
        match s {
            "DEPLOYED" => DeviceDeploymentStatus::Deployed,
            "FAILED" => DeviceDeploymentStatus::Failed,
            "INPROGRESS" => DeviceDeploymentStatus::InProgress,
            "READYTODEPLOY" => DeviceDeploymentStatus::ReadyToDeploy,
            "STOPPED" => DeviceDeploymentStatus::Stopped,
            "STOPPING" => DeviceDeploymentStatus::Stopping,
            other => {
                DeviceDeploymentStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for DeviceDeploymentStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DeviceDeploymentStatus::from(s))
    }
}
impl DeviceDeploymentStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DeviceDeploymentStatus::Deployed => "DEPLOYED",
            DeviceDeploymentStatus::Failed => "FAILED",
            DeviceDeploymentStatus::InProgress => "INPROGRESS",
            DeviceDeploymentStatus::ReadyToDeploy => "READYTODEPLOY",
            DeviceDeploymentStatus::Stopped => "STOPPED",
            DeviceDeploymentStatus::Stopping => "STOPPING",
            DeviceDeploymentStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "DEPLOYED",
            "FAILED",
            "INPROGRESS",
            "READYTODEPLOY",
            "STOPPED",
            "STOPPING",
        ]
    }
}
impl AsRef<str> for DeviceDeploymentStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The space's details.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SpaceDetails {
    /// <p>The ID of the associated Domain.</p>
    #[doc(hidden)]
    pub domain_id: std::option::Option<std::string::String>,
    /// <p>The name of the space.</p>
    #[doc(hidden)]
    pub space_name: std::option::Option<std::string::String>,
    /// <p>The status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::SpaceStatus>,
    /// <p>The creation time.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last modified time.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl SpaceDetails {
    /// <p>The ID of the associated Domain.</p>
    pub fn domain_id(&self) -> std::option::Option<&str> {
        self.domain_id.as_deref()
    }
    /// <p>The name of the space.</p>
    pub fn space_name(&self) -> std::option::Option<&str> {
        self.space_name.as_deref()
    }
    /// <p>The status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::SpaceStatus> {
        self.status.as_ref()
    }
    /// <p>The creation time.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last modified time.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`SpaceDetails`](crate::model::SpaceDetails).
pub mod space_details {

    /// A builder for [`SpaceDetails`](crate::model::SpaceDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain_id: std::option::Option<std::string::String>,
        pub(crate) space_name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::SpaceStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The ID of the associated Domain.</p>
        pub fn domain_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_id = Some(input.into());
            self
        }
        /// <p>The ID of the associated Domain.</p>
        pub fn set_domain_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_id = input;
            self
        }
        /// <p>The name of the space.</p>
        pub fn space_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.space_name = Some(input.into());
            self
        }
        /// <p>The name of the space.</p>
        pub fn set_space_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.space_name = input;
            self
        }
        /// <p>The status.</p>
        pub fn status(mut self, input: crate::model::SpaceStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status.</p>
        pub fn set_status(mut self, input: std::option::Option<crate::model::SpaceStatus>) -> Self {
            self.status = input;
            self
        }
        /// <p>The creation time.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last modified time.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last modified time.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`SpaceDetails`](crate::model::SpaceDetails).
        pub fn build(self) -> crate::model::SpaceDetails {
            crate::model::SpaceDetails {
                domain_id: self.domain_id,
                space_name: self.space_name,
                status: self.status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl SpaceDetails {
    /// Creates a new builder-style object to manufacture [`SpaceDetails`](crate::model::SpaceDetails).
    pub fn builder() -> crate::model::space_details::Builder {
        crate::model::space_details::Builder::default()
    }
}

/// When writing a match expression against `SpaceStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let spacestatus = unimplemented!();
/// match spacestatus {
///     SpaceStatus::DeleteFailed => { /* ... */ },
///     SpaceStatus::Deleting => { /* ... */ },
///     SpaceStatus::Failed => { /* ... */ },
///     SpaceStatus::InService => { /* ... */ },
///     SpaceStatus::Pending => { /* ... */ },
///     SpaceStatus::UpdateFailed => { /* ... */ },
///     SpaceStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `spacestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SpaceStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SpaceStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SpaceStatus::NewFeature` is defined.
/// Specifically, when `spacestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SpaceStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SpaceStatus {
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    UpdateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SpaceStatus {
    fn from(s: &str) -> Self {
        match s {
            "Delete_Failed" => SpaceStatus::DeleteFailed,
            "Deleting" => SpaceStatus::Deleting,
            "Failed" => SpaceStatus::Failed,
            "InService" => SpaceStatus::InService,
            "Pending" => SpaceStatus::Pending,
            "Update_Failed" => SpaceStatus::UpdateFailed,
            "Updating" => SpaceStatus::Updating,
            other => SpaceStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SpaceStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SpaceStatus::from(s))
    }
}
impl SpaceStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SpaceStatus::DeleteFailed => "Delete_Failed",
            SpaceStatus::Deleting => "Deleting",
            SpaceStatus::Failed => "Failed",
            SpaceStatus::InService => "InService",
            SpaceStatus::Pending => "Pending",
            SpaceStatus::UpdateFailed => "Update_Failed",
            SpaceStatus::Updating => "Updating",
            SpaceStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Delete_Failed",
            "Deleting",
            "Failed",
            "InService",
            "Pending",
            "Update_Failed",
            "Updating",
        ]
    }
}
impl AsRef<str> for SpaceStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `SpaceSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let spacesortkey = unimplemented!();
/// match spacesortkey {
///     SpaceSortKey::CreationTime => { /* ... */ },
///     SpaceSortKey::LastModifiedTime => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `spacesortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SpaceSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SpaceSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SpaceSortKey::NewFeature` is defined.
/// Specifically, when `spacesortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SpaceSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SpaceSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SpaceSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SpaceSortKey::CreationTime,
            "LastModifiedTime" => SpaceSortKey::LastModifiedTime,
            other => SpaceSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SpaceSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SpaceSortKey::from(s))
    }
}
impl SpaceSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SpaceSortKey::CreationTime => "CreationTime",
            SpaceSortKey::LastModifiedTime => "LastModifiedTime",
            SpaceSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "LastModifiedTime"]
    }
}
impl AsRef<str> for SpaceSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Information about a project.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProjectSummary {
    /// <p>The name of the project.</p>
    #[doc(hidden)]
    pub project_name: std::option::Option<std::string::String>,
    /// <p>The description of the project.</p>
    #[doc(hidden)]
    pub project_description: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the project.</p>
    #[doc(hidden)]
    pub project_arn: std::option::Option<std::string::String>,
    /// <p>The ID of the project.</p>
    #[doc(hidden)]
    pub project_id: std::option::Option<std::string::String>,
    /// <p>The time that the project was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the project.</p>
    #[doc(hidden)]
    pub project_status: std::option::Option<crate::model::ProjectStatus>,
}
impl ProjectSummary {
    /// <p>The name of the project.</p>
    pub fn project_name(&self) -> std::option::Option<&str> {
        self.project_name.as_deref()
    }
    /// <p>The description of the project.</p>
    pub fn project_description(&self) -> std::option::Option<&str> {
        self.project_description.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the project.</p>
    pub fn project_arn(&self) -> std::option::Option<&str> {
        self.project_arn.as_deref()
    }
    /// <p>The ID of the project.</p>
    pub fn project_id(&self) -> std::option::Option<&str> {
        self.project_id.as_deref()
    }
    /// <p>The time that the project was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The status of the project.</p>
    pub fn project_status(&self) -> std::option::Option<&crate::model::ProjectStatus> {
        self.project_status.as_ref()
    }
}
/// See [`ProjectSummary`](crate::model::ProjectSummary).
pub mod project_summary {

    /// A builder for [`ProjectSummary`](crate::model::ProjectSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) project_name: std::option::Option<std::string::String>,
        pub(crate) project_description: std::option::Option<std::string::String>,
        pub(crate) project_arn: std::option::Option<std::string::String>,
        pub(crate) project_id: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) project_status: std::option::Option<crate::model::ProjectStatus>,
    }
    impl Builder {
        /// <p>The name of the project.</p>
        pub fn project_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_name = Some(input.into());
            self
        }
        /// <p>The name of the project.</p>
        pub fn set_project_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_name = input;
            self
        }
        /// <p>The description of the project.</p>
        pub fn project_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_description = Some(input.into());
            self
        }
        /// <p>The description of the project.</p>
        pub fn set_project_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.project_description = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the project.</p>
        pub fn project_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the project.</p>
        pub fn set_project_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_arn = input;
            self
        }
        /// <p>The ID of the project.</p>
        pub fn project_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.project_id = Some(input.into());
            self
        }
        /// <p>The ID of the project.</p>
        pub fn set_project_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.project_id = input;
            self
        }
        /// <p>The time that the project was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the project was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The status of the project.</p>
        pub fn project_status(mut self, input: crate::model::ProjectStatus) -> Self {
            self.project_status = Some(input);
            self
        }
        /// <p>The status of the project.</p>
        pub fn set_project_status(
            mut self,
            input: std::option::Option<crate::model::ProjectStatus>,
        ) -> Self {
            self.project_status = input;
            self
        }
        /// Consumes the builder and constructs a [`ProjectSummary`](crate::model::ProjectSummary).
        pub fn build(self) -> crate::model::ProjectSummary {
            crate::model::ProjectSummary {
                project_name: self.project_name,
                project_description: self.project_description,
                project_arn: self.project_arn,
                project_id: self.project_id,
                creation_time: self.creation_time,
                project_status: self.project_status,
            }
        }
    }
}
impl ProjectSummary {
    /// Creates a new builder-style object to manufacture [`ProjectSummary`](crate::model::ProjectSummary).
    pub fn builder() -> crate::model::project_summary::Builder {
        crate::model::project_summary::Builder::default()
    }
}

/// When writing a match expression against `ProjectSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let projectsortorder = unimplemented!();
/// match projectsortorder {
///     ProjectSortOrder::Ascending => { /* ... */ },
///     ProjectSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `projectsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProjectSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProjectSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProjectSortOrder::NewFeature` is defined.
/// Specifically, when `projectsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProjectSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProjectSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProjectSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => ProjectSortOrder::Ascending,
            "Descending" => ProjectSortOrder::Descending,
            other => ProjectSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ProjectSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProjectSortOrder::from(s))
    }
}
impl ProjectSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProjectSortOrder::Ascending => "Ascending",
            ProjectSortOrder::Descending => "Descending",
            ProjectSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for ProjectSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ProjectSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let projectsortby = unimplemented!();
/// match projectsortby {
///     ProjectSortBy::CreationTime => { /* ... */ },
///     ProjectSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `projectsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProjectSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProjectSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProjectSortBy::NewFeature` is defined.
/// Specifically, when `projectsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProjectSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProjectSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProjectSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ProjectSortBy::CreationTime,
            "Name" => ProjectSortBy::Name,
            other => ProjectSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ProjectSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProjectSortBy::from(s))
    }
}
impl ProjectSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProjectSortBy::CreationTime => "CreationTime",
            ProjectSortBy::Name => "Name",
            ProjectSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for ProjectSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summary of information about a processing job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingJobSummary {
    /// <p>The name of the processing job.</p>
    #[doc(hidden)]
    pub processing_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the processing job..</p>
    #[doc(hidden)]
    pub processing_job_arn: std::option::Option<std::string::String>,
    /// <p>The time at which the processing job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time at which the processing job completed.</p>
    #[doc(hidden)]
    pub processing_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that indicates the last time the processing job was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the processing job.</p>
    #[doc(hidden)]
    pub processing_job_status: std::option::Option<crate::model::ProcessingJobStatus>,
    /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>An optional string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
    #[doc(hidden)]
    pub exit_message: std::option::Option<std::string::String>,
}
impl ProcessingJobSummary {
    /// <p>The name of the processing job.</p>
    pub fn processing_job_name(&self) -> std::option::Option<&str> {
        self.processing_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the processing job..</p>
    pub fn processing_job_arn(&self) -> std::option::Option<&str> {
        self.processing_job_arn.as_deref()
    }
    /// <p>The time at which the processing job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time at which the processing job completed.</p>
    pub fn processing_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.processing_end_time.as_ref()
    }
    /// <p>A timestamp that indicates the last time the processing job was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the processing job.</p>
    pub fn processing_job_status(&self) -> std::option::Option<&crate::model::ProcessingJobStatus> {
        self.processing_job_status.as_ref()
    }
    /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>An optional string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
    pub fn exit_message(&self) -> std::option::Option<&str> {
        self.exit_message.as_deref()
    }
}
/// See [`ProcessingJobSummary`](crate::model::ProcessingJobSummary).
pub mod processing_job_summary {

    /// A builder for [`ProcessingJobSummary`](crate::model::ProcessingJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) processing_job_name: std::option::Option<std::string::String>,
        pub(crate) processing_job_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) processing_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) processing_job_status: std::option::Option<crate::model::ProcessingJobStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) exit_message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the processing job.</p>
        pub fn processing_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.processing_job_name = Some(input.into());
            self
        }
        /// <p>The name of the processing job.</p>
        pub fn set_processing_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.processing_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the processing job..</p>
        pub fn processing_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.processing_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the processing job..</p>
        pub fn set_processing_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.processing_job_arn = input;
            self
        }
        /// <p>The time at which the processing job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time at which the processing job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time at which the processing job completed.</p>
        pub fn processing_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.processing_end_time = Some(input);
            self
        }
        /// <p>The time at which the processing job completed.</p>
        pub fn set_processing_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.processing_end_time = input;
            self
        }
        /// <p>A timestamp that indicates the last time the processing job was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates the last time the processing job was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the processing job.</p>
        pub fn processing_job_status(mut self, input: crate::model::ProcessingJobStatus) -> Self {
            self.processing_job_status = Some(input);
            self
        }
        /// <p>The status of the processing job.</p>
        pub fn set_processing_job_status(
            mut self,
            input: std::option::Option<crate::model::ProcessingJobStatus>,
        ) -> Self {
            self.processing_job_status = input;
            self
        }
        /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>A string, up to one KB in size, that contains the reason a processing job failed, if it failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>An optional string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
        pub fn exit_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.exit_message = Some(input.into());
            self
        }
        /// <p>An optional string, up to one KB in size, that contains metadata from the processing container when the processing job exits.</p>
        pub fn set_exit_message(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.exit_message = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingJobSummary`](crate::model::ProcessingJobSummary).
        pub fn build(self) -> crate::model::ProcessingJobSummary {
            crate::model::ProcessingJobSummary {
                processing_job_name: self.processing_job_name,
                processing_job_arn: self.processing_job_arn,
                creation_time: self.creation_time,
                processing_end_time: self.processing_end_time,
                last_modified_time: self.last_modified_time,
                processing_job_status: self.processing_job_status,
                failure_reason: self.failure_reason,
                exit_message: self.exit_message,
            }
        }
    }
}
impl ProcessingJobSummary {
    /// Creates a new builder-style object to manufacture [`ProcessingJobSummary`](crate::model::ProcessingJobSummary).
    pub fn builder() -> crate::model::processing_job_summary::Builder {
        crate::model::processing_job_summary::Builder::default()
    }
}

/// <p>A summary of a pipeline.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineSummary {
    /// <p> The Amazon Resource Name (ARN) of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_arn: std::option::Option<std::string::String>,
    /// <p>The name of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_name: std::option::Option<std::string::String>,
    /// <p>The display name of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_display_name: std::option::Option<std::string::String>,
    /// <p>The description of the pipeline.</p>
    #[doc(hidden)]
    pub pipeline_description: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) that the pipeline used to execute.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>The creation time of the pipeline.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that the pipeline was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last time that a pipeline execution began.</p>
    #[doc(hidden)]
    pub last_execution_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl PipelineSummary {
    /// <p> The Amazon Resource Name (ARN) of the pipeline.</p>
    pub fn pipeline_arn(&self) -> std::option::Option<&str> {
        self.pipeline_arn.as_deref()
    }
    /// <p>The name of the pipeline.</p>
    pub fn pipeline_name(&self) -> std::option::Option<&str> {
        self.pipeline_name.as_deref()
    }
    /// <p>The display name of the pipeline.</p>
    pub fn pipeline_display_name(&self) -> std::option::Option<&str> {
        self.pipeline_display_name.as_deref()
    }
    /// <p>The description of the pipeline.</p>
    pub fn pipeline_description(&self) -> std::option::Option<&str> {
        self.pipeline_description.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) that the pipeline used to execute.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>The creation time of the pipeline.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time that the pipeline was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The last time that a pipeline execution began.</p>
    pub fn last_execution_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_execution_time.as_ref()
    }
}
/// See [`PipelineSummary`](crate::model::PipelineSummary).
pub mod pipeline_summary {

    /// A builder for [`PipelineSummary`](crate::model::PipelineSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) pipeline_arn: std::option::Option<std::string::String>,
        pub(crate) pipeline_name: std::option::Option<std::string::String>,
        pub(crate) pipeline_display_name: std::option::Option<std::string::String>,
        pub(crate) pipeline_description: std::option::Option<std::string::String>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_execution_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p> The Amazon Resource Name (ARN) of the pipeline.</p>
        pub fn pipeline_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_arn = Some(input.into());
            self
        }
        /// <p> The Amazon Resource Name (ARN) of the pipeline.</p>
        pub fn set_pipeline_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.pipeline_arn = input;
            self
        }
        /// <p>The name of the pipeline.</p>
        pub fn pipeline_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_name = Some(input.into());
            self
        }
        /// <p>The name of the pipeline.</p>
        pub fn set_pipeline_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_name = input;
            self
        }
        /// <p>The display name of the pipeline.</p>
        pub fn pipeline_display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the pipeline.</p>
        pub fn set_pipeline_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_display_name = input;
            self
        }
        /// <p>The description of the pipeline.</p>
        pub fn pipeline_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_description = Some(input.into());
            self
        }
        /// <p>The description of the pipeline.</p>
        pub fn set_pipeline_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_description = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) that the pipeline used to execute.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) that the pipeline used to execute.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// <p>The creation time of the pipeline.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the pipeline.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time that the pipeline was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time that the pipeline was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The last time that a pipeline execution began.</p>
        pub fn last_execution_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_execution_time = Some(input);
            self
        }
        /// <p>The last time that a pipeline execution began.</p>
        pub fn set_last_execution_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_execution_time = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineSummary`](crate::model::PipelineSummary).
        pub fn build(self) -> crate::model::PipelineSummary {
            crate::model::PipelineSummary {
                pipeline_arn: self.pipeline_arn,
                pipeline_name: self.pipeline_name,
                pipeline_display_name: self.pipeline_display_name,
                pipeline_description: self.pipeline_description,
                role_arn: self.role_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                last_execution_time: self.last_execution_time,
            }
        }
    }
}
impl PipelineSummary {
    /// Creates a new builder-style object to manufacture [`PipelineSummary`](crate::model::PipelineSummary).
    pub fn builder() -> crate::model::pipeline_summary::Builder {
        crate::model::pipeline_summary::Builder::default()
    }
}

/// When writing a match expression against `SortPipelinesBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortpipelinesby = unimplemented!();
/// match sortpipelinesby {
///     SortPipelinesBy::CreationTime => { /* ... */ },
///     SortPipelinesBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortpipelinesby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortPipelinesBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortPipelinesBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortPipelinesBy::NewFeature` is defined.
/// Specifically, when `sortpipelinesby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortPipelinesBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortPipelinesBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortPipelinesBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortPipelinesBy::CreationTime,
            "Name" => SortPipelinesBy::Name,
            other => SortPipelinesBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortPipelinesBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortPipelinesBy::from(s))
    }
}
impl SortPipelinesBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortPipelinesBy::CreationTime => "CreationTime",
            SortPipelinesBy::Name => "Name",
            SortPipelinesBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortPipelinesBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>An execution of a step in a pipeline.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineExecutionStep {
    /// <p>The name of the step that is executed.</p>
    #[doc(hidden)]
    pub step_name: std::option::Option<std::string::String>,
    /// <p>The display name of the step.</p>
    #[doc(hidden)]
    pub step_display_name: std::option::Option<std::string::String>,
    /// <p>The description of the step.</p>
    #[doc(hidden)]
    pub step_description: std::option::Option<std::string::String>,
    /// <p>The time that the step started executing.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time that the step stopped executing.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the step execution.</p>
    #[doc(hidden)]
    pub step_status: std::option::Option<crate::model::StepStatus>,
    /// <p>If this pipeline execution step was cached, details on the cache hit.</p>
    #[doc(hidden)]
    pub cache_hit_result: std::option::Option<crate::model::CacheHitResult>,
    /// <p>The current attempt of the execution step. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-retry-policy.html">Retry Policy for SageMaker Pipelines steps</a>.</p>
    #[doc(hidden)]
    pub attempt_count: i32,
    /// <p>The reason why the step failed execution. This is only returned if the step failed its execution.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>Metadata to run the pipeline step.</p>
    #[doc(hidden)]
    pub metadata: std::option::Option<crate::model::PipelineExecutionStepMetadata>,
}
impl PipelineExecutionStep {
    /// <p>The name of the step that is executed.</p>
    pub fn step_name(&self) -> std::option::Option<&str> {
        self.step_name.as_deref()
    }
    /// <p>The display name of the step.</p>
    pub fn step_display_name(&self) -> std::option::Option<&str> {
        self.step_display_name.as_deref()
    }
    /// <p>The description of the step.</p>
    pub fn step_description(&self) -> std::option::Option<&str> {
        self.step_description.as_deref()
    }
    /// <p>The time that the step started executing.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>The time that the step stopped executing.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
    /// <p>The status of the step execution.</p>
    pub fn step_status(&self) -> std::option::Option<&crate::model::StepStatus> {
        self.step_status.as_ref()
    }
    /// <p>If this pipeline execution step was cached, details on the cache hit.</p>
    pub fn cache_hit_result(&self) -> std::option::Option<&crate::model::CacheHitResult> {
        self.cache_hit_result.as_ref()
    }
    /// <p>The current attempt of the execution step. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-retry-policy.html">Retry Policy for SageMaker Pipelines steps</a>.</p>
    pub fn attempt_count(&self) -> i32 {
        self.attempt_count
    }
    /// <p>The reason why the step failed execution. This is only returned if the step failed its execution.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>Metadata to run the pipeline step.</p>
    pub fn metadata(&self) -> std::option::Option<&crate::model::PipelineExecutionStepMetadata> {
        self.metadata.as_ref()
    }
}
/// See [`PipelineExecutionStep`](crate::model::PipelineExecutionStep).
pub mod pipeline_execution_step {

    /// A builder for [`PipelineExecutionStep`](crate::model::PipelineExecutionStep).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) step_name: std::option::Option<std::string::String>,
        pub(crate) step_display_name: std::option::Option<std::string::String>,
        pub(crate) step_description: std::option::Option<std::string::String>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) step_status: std::option::Option<crate::model::StepStatus>,
        pub(crate) cache_hit_result: std::option::Option<crate::model::CacheHitResult>,
        pub(crate) attempt_count: std::option::Option<i32>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) metadata: std::option::Option<crate::model::PipelineExecutionStepMetadata>,
    }
    impl Builder {
        /// <p>The name of the step that is executed.</p>
        pub fn step_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.step_name = Some(input.into());
            self
        }
        /// <p>The name of the step that is executed.</p>
        pub fn set_step_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.step_name = input;
            self
        }
        /// <p>The display name of the step.</p>
        pub fn step_display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.step_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the step.</p>
        pub fn set_step_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.step_display_name = input;
            self
        }
        /// <p>The description of the step.</p>
        pub fn step_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.step_description = Some(input.into());
            self
        }
        /// <p>The description of the step.</p>
        pub fn set_step_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.step_description = input;
            self
        }
        /// <p>The time that the step started executing.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>The time that the step started executing.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// <p>The time that the step stopped executing.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>The time that the step stopped executing.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// <p>The status of the step execution.</p>
        pub fn step_status(mut self, input: crate::model::StepStatus) -> Self {
            self.step_status = Some(input);
            self
        }
        /// <p>The status of the step execution.</p>
        pub fn set_step_status(
            mut self,
            input: std::option::Option<crate::model::StepStatus>,
        ) -> Self {
            self.step_status = input;
            self
        }
        /// <p>If this pipeline execution step was cached, details on the cache hit.</p>
        pub fn cache_hit_result(mut self, input: crate::model::CacheHitResult) -> Self {
            self.cache_hit_result = Some(input);
            self
        }
        /// <p>If this pipeline execution step was cached, details on the cache hit.</p>
        pub fn set_cache_hit_result(
            mut self,
            input: std::option::Option<crate::model::CacheHitResult>,
        ) -> Self {
            self.cache_hit_result = input;
            self
        }
        /// <p>The current attempt of the execution step. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-retry-policy.html">Retry Policy for SageMaker Pipelines steps</a>.</p>
        pub fn attempt_count(mut self, input: i32) -> Self {
            self.attempt_count = Some(input);
            self
        }
        /// <p>The current attempt of the execution step. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines-retry-policy.html">Retry Policy for SageMaker Pipelines steps</a>.</p>
        pub fn set_attempt_count(mut self, input: std::option::Option<i32>) -> Self {
            self.attempt_count = input;
            self
        }
        /// <p>The reason why the step failed execution. This is only returned if the step failed its execution.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The reason why the step failed execution. This is only returned if the step failed its execution.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>Metadata to run the pipeline step.</p>
        pub fn metadata(mut self, input: crate::model::PipelineExecutionStepMetadata) -> Self {
            self.metadata = Some(input);
            self
        }
        /// <p>Metadata to run the pipeline step.</p>
        pub fn set_metadata(
            mut self,
            input: std::option::Option<crate::model::PipelineExecutionStepMetadata>,
        ) -> Self {
            self.metadata = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineExecutionStep`](crate::model::PipelineExecutionStep).
        pub fn build(self) -> crate::model::PipelineExecutionStep {
            crate::model::PipelineExecutionStep {
                step_name: self.step_name,
                step_display_name: self.step_display_name,
                step_description: self.step_description,
                start_time: self.start_time,
                end_time: self.end_time,
                step_status: self.step_status,
                cache_hit_result: self.cache_hit_result,
                attempt_count: self.attempt_count.unwrap_or_default(),
                failure_reason: self.failure_reason,
                metadata: self.metadata,
            }
        }
    }
}
impl PipelineExecutionStep {
    /// Creates a new builder-style object to manufacture [`PipelineExecutionStep`](crate::model::PipelineExecutionStep).
    pub fn builder() -> crate::model::pipeline_execution_step::Builder {
        crate::model::pipeline_execution_step::Builder::default()
    }
}

/// <p>Metadata for a step execution.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineExecutionStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
    #[doc(hidden)]
    pub training_job: std::option::Option<crate::model::TrainingJobStepMetadata>,
    /// <p>The Amazon Resource Name (ARN) of the processing job that was run by this step execution.</p>
    #[doc(hidden)]
    pub processing_job: std::option::Option<crate::model::ProcessingJobStepMetadata>,
    /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
    #[doc(hidden)]
    pub transform_job: std::option::Option<crate::model::TransformJobStepMetadata>,
    /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
    #[doc(hidden)]
    pub tuning_job: std::option::Option<crate::model::TuningJobStepMetaData>,
    /// <p>The Amazon Resource Name (ARN) of the model that was created by this step execution.</p>
    #[doc(hidden)]
    pub model: std::option::Option<crate::model::ModelStepMetadata>,
    /// <p>The Amazon Resource Name (ARN) of the model package that the model was registered to by this step execution.</p>
    #[doc(hidden)]
    pub register_model: std::option::Option<crate::model::RegisterModelStepMetadata>,
    /// <p>The outcome of the condition evaluation that was run by this step execution.</p>
    #[doc(hidden)]
    pub condition: std::option::Option<crate::model::ConditionStepMetadata>,
    /// <p>The URL of the Amazon SQS queue used by this step execution, the pipeline generated token, and a list of output parameters.</p>
    #[doc(hidden)]
    pub callback: std::option::Option<crate::model::CallbackStepMetadata>,
    /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution and a list of output parameters.</p>
    #[doc(hidden)]
    pub lambda: std::option::Option<crate::model::LambdaStepMetadata>,
    /// <p>The configurations and outcomes of the check step execution. This includes: </p>
    /// <ul>
    /// <li> <p>The type of the check conducted.</p> </li>
    /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
    /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
    /// <li> <p>The model package group name provided.</p> </li>
    /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
    /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
    /// <li> <p>The Boolean flags indicating if the drift check is skipped.</p> </li>
    /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub quality_check: std::option::Option<crate::model::QualityCheckStepMetadata>,
    /// <p>Container for the metadata for a Clarify check step. The configurations and outcomes of the check step execution. This includes: </p>
    /// <ul>
    /// <li> <p>The type of the check conducted,</p> </li>
    /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
    /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
    /// <li> <p>The model package group name provided.</p> </li>
    /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
    /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
    /// <li> <p>The boolean flags indicating if the drift check is skipped.</p> </li>
    /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub clarify_check: std::option::Option<crate::model::ClarifyCheckStepMetadata>,
    /// <p>The configurations and outcomes of an Amazon EMR step execution.</p>
    #[doc(hidden)]
    pub emr: std::option::Option<crate::model::EmrStepMetadata>,
    /// <p>The configurations and outcomes of a Fail step execution.</p>
    #[doc(hidden)]
    pub fail: std::option::Option<crate::model::FailStepMetadata>,
    /// <p>The Amazon Resource Name (ARN) of the AutoML job that was run by this step.</p>
    #[doc(hidden)]
    pub auto_ml_job: std::option::Option<crate::model::AutoMlJobStepMetadata>,
}
impl PipelineExecutionStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
    pub fn training_job(&self) -> std::option::Option<&crate::model::TrainingJobStepMetadata> {
        self.training_job.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the processing job that was run by this step execution.</p>
    pub fn processing_job(&self) -> std::option::Option<&crate::model::ProcessingJobStepMetadata> {
        self.processing_job.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
    pub fn transform_job(&self) -> std::option::Option<&crate::model::TransformJobStepMetadata> {
        self.transform_job.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
    pub fn tuning_job(&self) -> std::option::Option<&crate::model::TuningJobStepMetaData> {
        self.tuning_job.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model that was created by this step execution.</p>
    pub fn model(&self) -> std::option::Option<&crate::model::ModelStepMetadata> {
        self.model.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model package that the model was registered to by this step execution.</p>
    pub fn register_model(&self) -> std::option::Option<&crate::model::RegisterModelStepMetadata> {
        self.register_model.as_ref()
    }
    /// <p>The outcome of the condition evaluation that was run by this step execution.</p>
    pub fn condition(&self) -> std::option::Option<&crate::model::ConditionStepMetadata> {
        self.condition.as_ref()
    }
    /// <p>The URL of the Amazon SQS queue used by this step execution, the pipeline generated token, and a list of output parameters.</p>
    pub fn callback(&self) -> std::option::Option<&crate::model::CallbackStepMetadata> {
        self.callback.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution and a list of output parameters.</p>
    pub fn lambda(&self) -> std::option::Option<&crate::model::LambdaStepMetadata> {
        self.lambda.as_ref()
    }
    /// <p>The configurations and outcomes of the check step execution. This includes: </p>
    /// <ul>
    /// <li> <p>The type of the check conducted.</p> </li>
    /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
    /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
    /// <li> <p>The model package group name provided.</p> </li>
    /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
    /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
    /// <li> <p>The Boolean flags indicating if the drift check is skipped.</p> </li>
    /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
    /// </ul>
    pub fn quality_check(&self) -> std::option::Option<&crate::model::QualityCheckStepMetadata> {
        self.quality_check.as_ref()
    }
    /// <p>Container for the metadata for a Clarify check step. The configurations and outcomes of the check step execution. This includes: </p>
    /// <ul>
    /// <li> <p>The type of the check conducted,</p> </li>
    /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
    /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
    /// <li> <p>The model package group name provided.</p> </li>
    /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
    /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
    /// <li> <p>The boolean flags indicating if the drift check is skipped.</p> </li>
    /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
    /// </ul>
    pub fn clarify_check(&self) -> std::option::Option<&crate::model::ClarifyCheckStepMetadata> {
        self.clarify_check.as_ref()
    }
    /// <p>The configurations and outcomes of an Amazon EMR step execution.</p>
    pub fn emr(&self) -> std::option::Option<&crate::model::EmrStepMetadata> {
        self.emr.as_ref()
    }
    /// <p>The configurations and outcomes of a Fail step execution.</p>
    pub fn fail(&self) -> std::option::Option<&crate::model::FailStepMetadata> {
        self.fail.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the AutoML job that was run by this step.</p>
    pub fn auto_ml_job(&self) -> std::option::Option<&crate::model::AutoMlJobStepMetadata> {
        self.auto_ml_job.as_ref()
    }
}
/// See [`PipelineExecutionStepMetadata`](crate::model::PipelineExecutionStepMetadata).
pub mod pipeline_execution_step_metadata {

    /// A builder for [`PipelineExecutionStepMetadata`](crate::model::PipelineExecutionStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_job: std::option::Option<crate::model::TrainingJobStepMetadata>,
        pub(crate) processing_job: std::option::Option<crate::model::ProcessingJobStepMetadata>,
        pub(crate) transform_job: std::option::Option<crate::model::TransformJobStepMetadata>,
        pub(crate) tuning_job: std::option::Option<crate::model::TuningJobStepMetaData>,
        pub(crate) model: std::option::Option<crate::model::ModelStepMetadata>,
        pub(crate) register_model: std::option::Option<crate::model::RegisterModelStepMetadata>,
        pub(crate) condition: std::option::Option<crate::model::ConditionStepMetadata>,
        pub(crate) callback: std::option::Option<crate::model::CallbackStepMetadata>,
        pub(crate) lambda: std::option::Option<crate::model::LambdaStepMetadata>,
        pub(crate) quality_check: std::option::Option<crate::model::QualityCheckStepMetadata>,
        pub(crate) clarify_check: std::option::Option<crate::model::ClarifyCheckStepMetadata>,
        pub(crate) emr: std::option::Option<crate::model::EmrStepMetadata>,
        pub(crate) fail: std::option::Option<crate::model::FailStepMetadata>,
        pub(crate) auto_ml_job: std::option::Option<crate::model::AutoMlJobStepMetadata>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
        pub fn training_job(mut self, input: crate::model::TrainingJobStepMetadata) -> Self {
            self.training_job = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
        pub fn set_training_job(
            mut self,
            input: std::option::Option<crate::model::TrainingJobStepMetadata>,
        ) -> Self {
            self.training_job = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the processing job that was run by this step execution.</p>
        pub fn processing_job(mut self, input: crate::model::ProcessingJobStepMetadata) -> Self {
            self.processing_job = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the processing job that was run by this step execution.</p>
        pub fn set_processing_job(
            mut self,
            input: std::option::Option<crate::model::ProcessingJobStepMetadata>,
        ) -> Self {
            self.processing_job = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
        pub fn transform_job(mut self, input: crate::model::TransformJobStepMetadata) -> Self {
            self.transform_job = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
        pub fn set_transform_job(
            mut self,
            input: std::option::Option<crate::model::TransformJobStepMetadata>,
        ) -> Self {
            self.transform_job = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
        pub fn tuning_job(mut self, input: crate::model::TuningJobStepMetaData) -> Self {
            self.tuning_job = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
        pub fn set_tuning_job(
            mut self,
            input: std::option::Option<crate::model::TuningJobStepMetaData>,
        ) -> Self {
            self.tuning_job = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model that was created by this step execution.</p>
        pub fn model(mut self, input: crate::model::ModelStepMetadata) -> Self {
            self.model = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model that was created by this step execution.</p>
        pub fn set_model(
            mut self,
            input: std::option::Option<crate::model::ModelStepMetadata>,
        ) -> Self {
            self.model = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package that the model was registered to by this step execution.</p>
        pub fn register_model(mut self, input: crate::model::RegisterModelStepMetadata) -> Self {
            self.register_model = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package that the model was registered to by this step execution.</p>
        pub fn set_register_model(
            mut self,
            input: std::option::Option<crate::model::RegisterModelStepMetadata>,
        ) -> Self {
            self.register_model = input;
            self
        }
        /// <p>The outcome of the condition evaluation that was run by this step execution.</p>
        pub fn condition(mut self, input: crate::model::ConditionStepMetadata) -> Self {
            self.condition = Some(input);
            self
        }
        /// <p>The outcome of the condition evaluation that was run by this step execution.</p>
        pub fn set_condition(
            mut self,
            input: std::option::Option<crate::model::ConditionStepMetadata>,
        ) -> Self {
            self.condition = input;
            self
        }
        /// <p>The URL of the Amazon SQS queue used by this step execution, the pipeline generated token, and a list of output parameters.</p>
        pub fn callback(mut self, input: crate::model::CallbackStepMetadata) -> Self {
            self.callback = Some(input);
            self
        }
        /// <p>The URL of the Amazon SQS queue used by this step execution, the pipeline generated token, and a list of output parameters.</p>
        pub fn set_callback(
            mut self,
            input: std::option::Option<crate::model::CallbackStepMetadata>,
        ) -> Self {
            self.callback = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution and a list of output parameters.</p>
        pub fn lambda(mut self, input: crate::model::LambdaStepMetadata) -> Self {
            self.lambda = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution and a list of output parameters.</p>
        pub fn set_lambda(
            mut self,
            input: std::option::Option<crate::model::LambdaStepMetadata>,
        ) -> Self {
            self.lambda = input;
            self
        }
        /// <p>The configurations and outcomes of the check step execution. This includes: </p>
        /// <ul>
        /// <li> <p>The type of the check conducted.</p> </li>
        /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
        /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
        /// <li> <p>The model package group name provided.</p> </li>
        /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
        /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
        /// <li> <p>The Boolean flags indicating if the drift check is skipped.</p> </li>
        /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
        /// </ul>
        pub fn quality_check(mut self, input: crate::model::QualityCheckStepMetadata) -> Self {
            self.quality_check = Some(input);
            self
        }
        /// <p>The configurations and outcomes of the check step execution. This includes: </p>
        /// <ul>
        /// <li> <p>The type of the check conducted.</p> </li>
        /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
        /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
        /// <li> <p>The model package group name provided.</p> </li>
        /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
        /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
        /// <li> <p>The Boolean flags indicating if the drift check is skipped.</p> </li>
        /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
        /// </ul>
        pub fn set_quality_check(
            mut self,
            input: std::option::Option<crate::model::QualityCheckStepMetadata>,
        ) -> Self {
            self.quality_check = input;
            self
        }
        /// <p>Container for the metadata for a Clarify check step. The configurations and outcomes of the check step execution. This includes: </p>
        /// <ul>
        /// <li> <p>The type of the check conducted,</p> </li>
        /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
        /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
        /// <li> <p>The model package group name provided.</p> </li>
        /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
        /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
        /// <li> <p>The boolean flags indicating if the drift check is skipped.</p> </li>
        /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
        /// </ul>
        pub fn clarify_check(mut self, input: crate::model::ClarifyCheckStepMetadata) -> Self {
            self.clarify_check = Some(input);
            self
        }
        /// <p>Container for the metadata for a Clarify check step. The configurations and outcomes of the check step execution. This includes: </p>
        /// <ul>
        /// <li> <p>The type of the check conducted,</p> </li>
        /// <li> <p>The Amazon S3 URIs of baseline constraints and statistics files to be used for the drift check.</p> </li>
        /// <li> <p>The Amazon S3 URIs of newly calculated baseline constraints and statistics.</p> </li>
        /// <li> <p>The model package group name provided.</p> </li>
        /// <li> <p>The Amazon S3 URI of the violation report if violations detected.</p> </li>
        /// <li> <p>The Amazon Resource Name (ARN) of check processing job initiated by the step execution.</p> </li>
        /// <li> <p>The boolean flags indicating if the drift check is skipped.</p> </li>
        /// <li> <p>If step property <code>BaselineUsedForDriftCheck</code> is set the same as <code>CalculatedBaseline</code>.</p> </li>
        /// </ul>
        pub fn set_clarify_check(
            mut self,
            input: std::option::Option<crate::model::ClarifyCheckStepMetadata>,
        ) -> Self {
            self.clarify_check = input;
            self
        }
        /// <p>The configurations and outcomes of an Amazon EMR step execution.</p>
        pub fn emr(mut self, input: crate::model::EmrStepMetadata) -> Self {
            self.emr = Some(input);
            self
        }
        /// <p>The configurations and outcomes of an Amazon EMR step execution.</p>
        pub fn set_emr(
            mut self,
            input: std::option::Option<crate::model::EmrStepMetadata>,
        ) -> Self {
            self.emr = input;
            self
        }
        /// <p>The configurations and outcomes of a Fail step execution.</p>
        pub fn fail(mut self, input: crate::model::FailStepMetadata) -> Self {
            self.fail = Some(input);
            self
        }
        /// <p>The configurations and outcomes of a Fail step execution.</p>
        pub fn set_fail(
            mut self,
            input: std::option::Option<crate::model::FailStepMetadata>,
        ) -> Self {
            self.fail = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job that was run by this step.</p>
        pub fn auto_ml_job(mut self, input: crate::model::AutoMlJobStepMetadata) -> Self {
            self.auto_ml_job = Some(input);
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job that was run by this step.</p>
        pub fn set_auto_ml_job(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobStepMetadata>,
        ) -> Self {
            self.auto_ml_job = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineExecutionStepMetadata`](crate::model::PipelineExecutionStepMetadata).
        pub fn build(self) -> crate::model::PipelineExecutionStepMetadata {
            crate::model::PipelineExecutionStepMetadata {
                training_job: self.training_job,
                processing_job: self.processing_job,
                transform_job: self.transform_job,
                tuning_job: self.tuning_job,
                model: self.model,
                register_model: self.register_model,
                condition: self.condition,
                callback: self.callback,
                lambda: self.lambda,
                quality_check: self.quality_check,
                clarify_check: self.clarify_check,
                emr: self.emr,
                fail: self.fail,
                auto_ml_job: self.auto_ml_job,
            }
        }
    }
}
impl PipelineExecutionStepMetadata {
    /// Creates a new builder-style object to manufacture [`PipelineExecutionStepMetadata`](crate::model::PipelineExecutionStepMetadata).
    pub fn builder() -> crate::model::pipeline_execution_step_metadata::Builder {
        crate::model::pipeline_execution_step_metadata::Builder::default()
    }
}

/// <p>Metadata for an AutoML job step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the AutoML job.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl AutoMlJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the AutoML job.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`AutoMlJobStepMetadata`](crate::model::AutoMlJobStepMetadata).
pub mod auto_ml_job_step_metadata {

    /// A builder for [`AutoMlJobStepMetadata`](crate::model::AutoMlJobStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the AutoML job.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AutoML job.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlJobStepMetadata`](crate::model::AutoMlJobStepMetadata).
        pub fn build(self) -> crate::model::AutoMlJobStepMetadata {
            crate::model::AutoMlJobStepMetadata { arn: self.arn }
        }
    }
}
impl AutoMlJobStepMetadata {
    /// Creates a new builder-style object to manufacture [`AutoMlJobStepMetadata`](crate::model::AutoMlJobStepMetadata).
    pub fn builder() -> crate::model::auto_ml_job_step_metadata::Builder {
        crate::model::auto_ml_job_step_metadata::Builder::default()
    }
}

/// <p>The container for the metadata for Fail step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FailStepMetadata {
    /// <p>A message that you define and then is processed and rendered by the Fail step when the error occurs.</p>
    #[doc(hidden)]
    pub error_message: std::option::Option<std::string::String>,
}
impl FailStepMetadata {
    /// <p>A message that you define and then is processed and rendered by the Fail step when the error occurs.</p>
    pub fn error_message(&self) -> std::option::Option<&str> {
        self.error_message.as_deref()
    }
}
/// See [`FailStepMetadata`](crate::model::FailStepMetadata).
pub mod fail_step_metadata {

    /// A builder for [`FailStepMetadata`](crate::model::FailStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) error_message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A message that you define and then is processed and rendered by the Fail step when the error occurs.</p>
        pub fn error_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.error_message = Some(input.into());
            self
        }
        /// <p>A message that you define and then is processed and rendered by the Fail step when the error occurs.</p>
        pub fn set_error_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.error_message = input;
            self
        }
        /// Consumes the builder and constructs a [`FailStepMetadata`](crate::model::FailStepMetadata).
        pub fn build(self) -> crate::model::FailStepMetadata {
            crate::model::FailStepMetadata {
                error_message: self.error_message,
            }
        }
    }
}
impl FailStepMetadata {
    /// Creates a new builder-style object to manufacture [`FailStepMetadata`](crate::model::FailStepMetadata).
    pub fn builder() -> crate::model::fail_step_metadata::Builder {
        crate::model::fail_step_metadata::Builder::default()
    }
}

/// <p>The configurations and outcomes of an Amazon EMR step execution.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EmrStepMetadata {
    /// <p>The identifier of the EMR cluster.</p>
    #[doc(hidden)]
    pub cluster_id: std::option::Option<std::string::String>,
    /// <p>The identifier of the EMR cluster step.</p>
    #[doc(hidden)]
    pub step_id: std::option::Option<std::string::String>,
    /// <p>The name of the EMR cluster step.</p>
    #[doc(hidden)]
    pub step_name: std::option::Option<std::string::String>,
    /// <p>The path to the log file where the cluster step's failure root cause is recorded.</p>
    #[doc(hidden)]
    pub log_file_path: std::option::Option<std::string::String>,
}
impl EmrStepMetadata {
    /// <p>The identifier of the EMR cluster.</p>
    pub fn cluster_id(&self) -> std::option::Option<&str> {
        self.cluster_id.as_deref()
    }
    /// <p>The identifier of the EMR cluster step.</p>
    pub fn step_id(&self) -> std::option::Option<&str> {
        self.step_id.as_deref()
    }
    /// <p>The name of the EMR cluster step.</p>
    pub fn step_name(&self) -> std::option::Option<&str> {
        self.step_name.as_deref()
    }
    /// <p>The path to the log file where the cluster step's failure root cause is recorded.</p>
    pub fn log_file_path(&self) -> std::option::Option<&str> {
        self.log_file_path.as_deref()
    }
}
/// See [`EmrStepMetadata`](crate::model::EmrStepMetadata).
pub mod emr_step_metadata {

    /// A builder for [`EmrStepMetadata`](crate::model::EmrStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cluster_id: std::option::Option<std::string::String>,
        pub(crate) step_id: std::option::Option<std::string::String>,
        pub(crate) step_name: std::option::Option<std::string::String>,
        pub(crate) log_file_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The identifier of the EMR cluster.</p>
        pub fn cluster_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.cluster_id = Some(input.into());
            self
        }
        /// <p>The identifier of the EMR cluster.</p>
        pub fn set_cluster_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.cluster_id = input;
            self
        }
        /// <p>The identifier of the EMR cluster step.</p>
        pub fn step_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.step_id = Some(input.into());
            self
        }
        /// <p>The identifier of the EMR cluster step.</p>
        pub fn set_step_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.step_id = input;
            self
        }
        /// <p>The name of the EMR cluster step.</p>
        pub fn step_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.step_name = Some(input.into());
            self
        }
        /// <p>The name of the EMR cluster step.</p>
        pub fn set_step_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.step_name = input;
            self
        }
        /// <p>The path to the log file where the cluster step's failure root cause is recorded.</p>
        pub fn log_file_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.log_file_path = Some(input.into());
            self
        }
        /// <p>The path to the log file where the cluster step's failure root cause is recorded.</p>
        pub fn set_log_file_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.log_file_path = input;
            self
        }
        /// Consumes the builder and constructs a [`EmrStepMetadata`](crate::model::EmrStepMetadata).
        pub fn build(self) -> crate::model::EmrStepMetadata {
            crate::model::EmrStepMetadata {
                cluster_id: self.cluster_id,
                step_id: self.step_id,
                step_name: self.step_name,
                log_file_path: self.log_file_path,
            }
        }
    }
}
impl EmrStepMetadata {
    /// Creates a new builder-style object to manufacture [`EmrStepMetadata`](crate::model::EmrStepMetadata).
    pub fn builder() -> crate::model::emr_step_metadata::Builder {
        crate::model::emr_step_metadata::Builder::default()
    }
}

/// <p>The container for the metadata for the ClarifyCheck step. For more information, see the topic on <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#step-type-clarify-check">ClarifyCheck step</a> in the <i>Amazon SageMaker Developer Guide</i>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ClarifyCheckStepMetadata {
    /// <p>The type of the Clarify Check step</p>
    #[doc(hidden)]
    pub check_type: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of baseline constraints file to be used for the drift check.</p>
    #[doc(hidden)]
    pub baseline_used_for_drift_check_constraints: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
    #[doc(hidden)]
    pub calculated_baseline_constraints: std::option::Option<std::string::String>,
    /// <p>The model package group name.</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of the violation report if violations are detected.</p>
    #[doc(hidden)]
    pub violation_report: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the check processing job that was run by this step's execution.</p>
    #[doc(hidden)]
    pub check_job_arn: std::option::Option<std::string::String>,
    /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
    #[doc(hidden)]
    pub skip_check: bool,
    /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> property. </p>
    #[doc(hidden)]
    pub register_new_baseline: bool,
}
impl ClarifyCheckStepMetadata {
    /// <p>The type of the Clarify Check step</p>
    pub fn check_type(&self) -> std::option::Option<&str> {
        self.check_type.as_deref()
    }
    /// <p>The Amazon S3 URI of baseline constraints file to be used for the drift check.</p>
    pub fn baseline_used_for_drift_check_constraints(&self) -> std::option::Option<&str> {
        self.baseline_used_for_drift_check_constraints.as_deref()
    }
    /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
    pub fn calculated_baseline_constraints(&self) -> std::option::Option<&str> {
        self.calculated_baseline_constraints.as_deref()
    }
    /// <p>The model package group name.</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>The Amazon S3 URI of the violation report if violations are detected.</p>
    pub fn violation_report(&self) -> std::option::Option<&str> {
        self.violation_report.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the check processing job that was run by this step's execution.</p>
    pub fn check_job_arn(&self) -> std::option::Option<&str> {
        self.check_job_arn.as_deref()
    }
    /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
    pub fn skip_check(&self) -> bool {
        self.skip_check
    }
    /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> property. </p>
    pub fn register_new_baseline(&self) -> bool {
        self.register_new_baseline
    }
}
/// See [`ClarifyCheckStepMetadata`](crate::model::ClarifyCheckStepMetadata).
pub mod clarify_check_step_metadata {

    /// A builder for [`ClarifyCheckStepMetadata`](crate::model::ClarifyCheckStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) check_type: std::option::Option<std::string::String>,
        pub(crate) baseline_used_for_drift_check_constraints:
            std::option::Option<std::string::String>,
        pub(crate) calculated_baseline_constraints: std::option::Option<std::string::String>,
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) violation_report: std::option::Option<std::string::String>,
        pub(crate) check_job_arn: std::option::Option<std::string::String>,
        pub(crate) skip_check: std::option::Option<bool>,
        pub(crate) register_new_baseline: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>The type of the Clarify Check step</p>
        pub fn check_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.check_type = Some(input.into());
            self
        }
        /// <p>The type of the Clarify Check step</p>
        pub fn set_check_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.check_type = input;
            self
        }
        /// <p>The Amazon S3 URI of baseline constraints file to be used for the drift check.</p>
        pub fn baseline_used_for_drift_check_constraints(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.baseline_used_for_drift_check_constraints = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of baseline constraints file to be used for the drift check.</p>
        pub fn set_baseline_used_for_drift_check_constraints(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baseline_used_for_drift_check_constraints = input;
            self
        }
        /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
        pub fn calculated_baseline_constraints(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.calculated_baseline_constraints = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
        pub fn set_calculated_baseline_constraints(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.calculated_baseline_constraints = input;
            self
        }
        /// <p>The model package group name.</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>The model package group name.</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>The Amazon S3 URI of the violation report if violations are detected.</p>
        pub fn violation_report(mut self, input: impl Into<std::string::String>) -> Self {
            self.violation_report = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the violation report if violations are detected.</p>
        pub fn set_violation_report(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.violation_report = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the check processing job that was run by this step's execution.</p>
        pub fn check_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.check_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the check processing job that was run by this step's execution.</p>
        pub fn set_check_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.check_job_arn = input;
            self
        }
        /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
        pub fn skip_check(mut self, input: bool) -> Self {
            self.skip_check = Some(input);
            self
        }
        /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
        pub fn set_skip_check(mut self, input: std::option::Option<bool>) -> Self {
            self.skip_check = input;
            self
        }
        /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> property. </p>
        pub fn register_new_baseline(mut self, input: bool) -> Self {
            self.register_new_baseline = Some(input);
            self
        }
        /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> property. </p>
        pub fn set_register_new_baseline(mut self, input: std::option::Option<bool>) -> Self {
            self.register_new_baseline = input;
            self
        }
        /// Consumes the builder and constructs a [`ClarifyCheckStepMetadata`](crate::model::ClarifyCheckStepMetadata).
        pub fn build(self) -> crate::model::ClarifyCheckStepMetadata {
            crate::model::ClarifyCheckStepMetadata {
                check_type: self.check_type,
                baseline_used_for_drift_check_constraints: self
                    .baseline_used_for_drift_check_constraints,
                calculated_baseline_constraints: self.calculated_baseline_constraints,
                model_package_group_name: self.model_package_group_name,
                violation_report: self.violation_report,
                check_job_arn: self.check_job_arn,
                skip_check: self.skip_check.unwrap_or_default(),
                register_new_baseline: self.register_new_baseline.unwrap_or_default(),
            }
        }
    }
}
impl ClarifyCheckStepMetadata {
    /// Creates a new builder-style object to manufacture [`ClarifyCheckStepMetadata`](crate::model::ClarifyCheckStepMetadata).
    pub fn builder() -> crate::model::clarify_check_step_metadata::Builder {
        crate::model::clarify_check_step_metadata::Builder::default()
    }
}

/// <p>Container for the metadata for a Quality check step. For more information, see the topic on <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/build-and-manage-steps.html#step-type-quality-check">QualityCheck step</a> in the <i>Amazon SageMaker Developer Guide</i>. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct QualityCheckStepMetadata {
    /// <p>The type of the Quality check step.</p>
    #[doc(hidden)]
    pub check_type: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of the baseline statistics file used for the drift check.</p>
    #[doc(hidden)]
    pub baseline_used_for_drift_check_statistics: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of the baseline constraints file used for the drift check.</p>
    #[doc(hidden)]
    pub baseline_used_for_drift_check_constraints: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of the newly calculated baseline statistics file.</p>
    #[doc(hidden)]
    pub calculated_baseline_statistics: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
    #[doc(hidden)]
    pub calculated_baseline_constraints: std::option::Option<std::string::String>,
    /// <p>The model package group name.</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 URI of violation report if violations are detected.</p>
    #[doc(hidden)]
    pub violation_report: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the Quality check processing job that was run by this step execution.</p>
    #[doc(hidden)]
    pub check_job_arn: std::option::Option<std::string::String>,
    /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
    #[doc(hidden)]
    pub skip_check: bool,
    /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> and <code> BaselineUsedForDriftCheckStatistics</code> properties. </p>
    #[doc(hidden)]
    pub register_new_baseline: bool,
}
impl QualityCheckStepMetadata {
    /// <p>The type of the Quality check step.</p>
    pub fn check_type(&self) -> std::option::Option<&str> {
        self.check_type.as_deref()
    }
    /// <p>The Amazon S3 URI of the baseline statistics file used for the drift check.</p>
    pub fn baseline_used_for_drift_check_statistics(&self) -> std::option::Option<&str> {
        self.baseline_used_for_drift_check_statistics.as_deref()
    }
    /// <p>The Amazon S3 URI of the baseline constraints file used for the drift check.</p>
    pub fn baseline_used_for_drift_check_constraints(&self) -> std::option::Option<&str> {
        self.baseline_used_for_drift_check_constraints.as_deref()
    }
    /// <p>The Amazon S3 URI of the newly calculated baseline statistics file.</p>
    pub fn calculated_baseline_statistics(&self) -> std::option::Option<&str> {
        self.calculated_baseline_statistics.as_deref()
    }
    /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
    pub fn calculated_baseline_constraints(&self) -> std::option::Option<&str> {
        self.calculated_baseline_constraints.as_deref()
    }
    /// <p>The model package group name.</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>The Amazon S3 URI of violation report if violations are detected.</p>
    pub fn violation_report(&self) -> std::option::Option<&str> {
        self.violation_report.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the Quality check processing job that was run by this step execution.</p>
    pub fn check_job_arn(&self) -> std::option::Option<&str> {
        self.check_job_arn.as_deref()
    }
    /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
    pub fn skip_check(&self) -> bool {
        self.skip_check
    }
    /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> and <code> BaselineUsedForDriftCheckStatistics</code> properties. </p>
    pub fn register_new_baseline(&self) -> bool {
        self.register_new_baseline
    }
}
/// See [`QualityCheckStepMetadata`](crate::model::QualityCheckStepMetadata).
pub mod quality_check_step_metadata {

    /// A builder for [`QualityCheckStepMetadata`](crate::model::QualityCheckStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) check_type: std::option::Option<std::string::String>,
        pub(crate) baseline_used_for_drift_check_statistics:
            std::option::Option<std::string::String>,
        pub(crate) baseline_used_for_drift_check_constraints:
            std::option::Option<std::string::String>,
        pub(crate) calculated_baseline_statistics: std::option::Option<std::string::String>,
        pub(crate) calculated_baseline_constraints: std::option::Option<std::string::String>,
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) violation_report: std::option::Option<std::string::String>,
        pub(crate) check_job_arn: std::option::Option<std::string::String>,
        pub(crate) skip_check: std::option::Option<bool>,
        pub(crate) register_new_baseline: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>The type of the Quality check step.</p>
        pub fn check_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.check_type = Some(input.into());
            self
        }
        /// <p>The type of the Quality check step.</p>
        pub fn set_check_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.check_type = input;
            self
        }
        /// <p>The Amazon S3 URI of the baseline statistics file used for the drift check.</p>
        pub fn baseline_used_for_drift_check_statistics(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.baseline_used_for_drift_check_statistics = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the baseline statistics file used for the drift check.</p>
        pub fn set_baseline_used_for_drift_check_statistics(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baseline_used_for_drift_check_statistics = input;
            self
        }
        /// <p>The Amazon S3 URI of the baseline constraints file used for the drift check.</p>
        pub fn baseline_used_for_drift_check_constraints(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.baseline_used_for_drift_check_constraints = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the baseline constraints file used for the drift check.</p>
        pub fn set_baseline_used_for_drift_check_constraints(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baseline_used_for_drift_check_constraints = input;
            self
        }
        /// <p>The Amazon S3 URI of the newly calculated baseline statistics file.</p>
        pub fn calculated_baseline_statistics(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.calculated_baseline_statistics = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the newly calculated baseline statistics file.</p>
        pub fn set_calculated_baseline_statistics(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.calculated_baseline_statistics = input;
            self
        }
        /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
        pub fn calculated_baseline_constraints(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.calculated_baseline_constraints = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the newly calculated baseline constraints file.</p>
        pub fn set_calculated_baseline_constraints(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.calculated_baseline_constraints = input;
            self
        }
        /// <p>The model package group name.</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>The model package group name.</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>The Amazon S3 URI of violation report if violations are detected.</p>
        pub fn violation_report(mut self, input: impl Into<std::string::String>) -> Self {
            self.violation_report = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of violation report if violations are detected.</p>
        pub fn set_violation_report(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.violation_report = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Quality check processing job that was run by this step execution.</p>
        pub fn check_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.check_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Quality check processing job that was run by this step execution.</p>
        pub fn set_check_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.check_job_arn = input;
            self
        }
        /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
        pub fn skip_check(mut self, input: bool) -> Self {
            self.skip_check = Some(input);
            self
        }
        /// <p>This flag indicates if the drift check against the previous baseline will be skipped or not. If it is set to <code>False</code>, the previous baseline of the configured check type must be available.</p>
        pub fn set_skip_check(mut self, input: std::option::Option<bool>) -> Self {
            self.skip_check = input;
            self
        }
        /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> and <code> BaselineUsedForDriftCheckStatistics</code> properties. </p>
        pub fn register_new_baseline(mut self, input: bool) -> Self {
            self.register_new_baseline = Some(input);
            self
        }
        /// <p>This flag indicates if a newly calculated baseline can be accessed through step properties <code>BaselineUsedForDriftCheckConstraints</code> and <code>BaselineUsedForDriftCheckStatistics</code>. If it is set to <code>False</code>, the previous baseline of the configured check type must also be available. These can be accessed through the <code>BaselineUsedForDriftCheckConstraints</code> and <code> BaselineUsedForDriftCheckStatistics</code> properties. </p>
        pub fn set_register_new_baseline(mut self, input: std::option::Option<bool>) -> Self {
            self.register_new_baseline = input;
            self
        }
        /// Consumes the builder and constructs a [`QualityCheckStepMetadata`](crate::model::QualityCheckStepMetadata).
        pub fn build(self) -> crate::model::QualityCheckStepMetadata {
            crate::model::QualityCheckStepMetadata {
                check_type: self.check_type,
                baseline_used_for_drift_check_statistics: self
                    .baseline_used_for_drift_check_statistics,
                baseline_used_for_drift_check_constraints: self
                    .baseline_used_for_drift_check_constraints,
                calculated_baseline_statistics: self.calculated_baseline_statistics,
                calculated_baseline_constraints: self.calculated_baseline_constraints,
                model_package_group_name: self.model_package_group_name,
                violation_report: self.violation_report,
                check_job_arn: self.check_job_arn,
                skip_check: self.skip_check.unwrap_or_default(),
                register_new_baseline: self.register_new_baseline.unwrap_or_default(),
            }
        }
    }
}
impl QualityCheckStepMetadata {
    /// Creates a new builder-style object to manufacture [`QualityCheckStepMetadata`](crate::model::QualityCheckStepMetadata).
    pub fn builder() -> crate::model::quality_check_step_metadata::Builder {
        crate::model::quality_check_step_metadata::Builder::default()
    }
}

/// <p>Metadata for a Lambda step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LambdaStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
    /// <p>A list of the output parameters of the Lambda step.</p>
    #[doc(hidden)]
    pub output_parameters: std::option::Option<std::vec::Vec<crate::model::OutputParameter>>,
}
impl LambdaStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
    /// <p>A list of the output parameters of the Lambda step.</p>
    pub fn output_parameters(&self) -> std::option::Option<&[crate::model::OutputParameter]> {
        self.output_parameters.as_deref()
    }
}
/// See [`LambdaStepMetadata`](crate::model::LambdaStepMetadata).
pub mod lambda_step_metadata {

    /// A builder for [`LambdaStepMetadata`](crate::model::LambdaStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
        pub(crate) output_parameters:
            std::option::Option<std::vec::Vec<crate::model::OutputParameter>>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Lambda function that was run by this step execution.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Appends an item to `output_parameters`.
        ///
        /// To override the contents of this collection use [`set_output_parameters`](Self::set_output_parameters).
        ///
        /// <p>A list of the output parameters of the Lambda step.</p>
        pub fn output_parameters(mut self, input: crate::model::OutputParameter) -> Self {
            let mut v = self.output_parameters.unwrap_or_default();
            v.push(input);
            self.output_parameters = Some(v);
            self
        }
        /// <p>A list of the output parameters of the Lambda step.</p>
        pub fn set_output_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::OutputParameter>>,
        ) -> Self {
            self.output_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`LambdaStepMetadata`](crate::model::LambdaStepMetadata).
        pub fn build(self) -> crate::model::LambdaStepMetadata {
            crate::model::LambdaStepMetadata {
                arn: self.arn,
                output_parameters: self.output_parameters,
            }
        }
    }
}
impl LambdaStepMetadata {
    /// Creates a new builder-style object to manufacture [`LambdaStepMetadata`](crate::model::LambdaStepMetadata).
    pub fn builder() -> crate::model::lambda_step_metadata::Builder {
        crate::model::lambda_step_metadata::Builder::default()
    }
}

/// <p>Metadata about a callback step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CallbackStepMetadata {
    /// <p>The pipeline generated token from the Amazon SQS queue.</p>
    #[doc(hidden)]
    pub callback_token: std::option::Option<std::string::String>,
    /// <p>The URL of the Amazon Simple Queue Service (Amazon SQS) queue used by the callback step.</p>
    #[doc(hidden)]
    pub sqs_queue_url: std::option::Option<std::string::String>,
    /// <p>A list of the output parameters of the callback step.</p>
    #[doc(hidden)]
    pub output_parameters: std::option::Option<std::vec::Vec<crate::model::OutputParameter>>,
}
impl CallbackStepMetadata {
    /// <p>The pipeline generated token from the Amazon SQS queue.</p>
    pub fn callback_token(&self) -> std::option::Option<&str> {
        self.callback_token.as_deref()
    }
    /// <p>The URL of the Amazon Simple Queue Service (Amazon SQS) queue used by the callback step.</p>
    pub fn sqs_queue_url(&self) -> std::option::Option<&str> {
        self.sqs_queue_url.as_deref()
    }
    /// <p>A list of the output parameters of the callback step.</p>
    pub fn output_parameters(&self) -> std::option::Option<&[crate::model::OutputParameter]> {
        self.output_parameters.as_deref()
    }
}
/// See [`CallbackStepMetadata`](crate::model::CallbackStepMetadata).
pub mod callback_step_metadata {

    /// A builder for [`CallbackStepMetadata`](crate::model::CallbackStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) callback_token: std::option::Option<std::string::String>,
        pub(crate) sqs_queue_url: std::option::Option<std::string::String>,
        pub(crate) output_parameters:
            std::option::Option<std::vec::Vec<crate::model::OutputParameter>>,
    }
    impl Builder {
        /// <p>The pipeline generated token from the Amazon SQS queue.</p>
        pub fn callback_token(mut self, input: impl Into<std::string::String>) -> Self {
            self.callback_token = Some(input.into());
            self
        }
        /// <p>The pipeline generated token from the Amazon SQS queue.</p>
        pub fn set_callback_token(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.callback_token = input;
            self
        }
        /// <p>The URL of the Amazon Simple Queue Service (Amazon SQS) queue used by the callback step.</p>
        pub fn sqs_queue_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.sqs_queue_url = Some(input.into());
            self
        }
        /// <p>The URL of the Amazon Simple Queue Service (Amazon SQS) queue used by the callback step.</p>
        pub fn set_sqs_queue_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sqs_queue_url = input;
            self
        }
        /// Appends an item to `output_parameters`.
        ///
        /// To override the contents of this collection use [`set_output_parameters`](Self::set_output_parameters).
        ///
        /// <p>A list of the output parameters of the callback step.</p>
        pub fn output_parameters(mut self, input: crate::model::OutputParameter) -> Self {
            let mut v = self.output_parameters.unwrap_or_default();
            v.push(input);
            self.output_parameters = Some(v);
            self
        }
        /// <p>A list of the output parameters of the callback step.</p>
        pub fn set_output_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::OutputParameter>>,
        ) -> Self {
            self.output_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`CallbackStepMetadata`](crate::model::CallbackStepMetadata).
        pub fn build(self) -> crate::model::CallbackStepMetadata {
            crate::model::CallbackStepMetadata {
                callback_token: self.callback_token,
                sqs_queue_url: self.sqs_queue_url,
                output_parameters: self.output_parameters,
            }
        }
    }
}
impl CallbackStepMetadata {
    /// Creates a new builder-style object to manufacture [`CallbackStepMetadata`](crate::model::CallbackStepMetadata).
    pub fn builder() -> crate::model::callback_step_metadata::Builder {
        crate::model::callback_step_metadata::Builder::default()
    }
}

/// <p>Metadata for a Condition step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ConditionStepMetadata {
    /// <p>The outcome of the Condition step evaluation.</p>
    #[doc(hidden)]
    pub outcome: std::option::Option<crate::model::ConditionOutcome>,
}
impl ConditionStepMetadata {
    /// <p>The outcome of the Condition step evaluation.</p>
    pub fn outcome(&self) -> std::option::Option<&crate::model::ConditionOutcome> {
        self.outcome.as_ref()
    }
}
/// See [`ConditionStepMetadata`](crate::model::ConditionStepMetadata).
pub mod condition_step_metadata {

    /// A builder for [`ConditionStepMetadata`](crate::model::ConditionStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) outcome: std::option::Option<crate::model::ConditionOutcome>,
    }
    impl Builder {
        /// <p>The outcome of the Condition step evaluation.</p>
        pub fn outcome(mut self, input: crate::model::ConditionOutcome) -> Self {
            self.outcome = Some(input);
            self
        }
        /// <p>The outcome of the Condition step evaluation.</p>
        pub fn set_outcome(
            mut self,
            input: std::option::Option<crate::model::ConditionOutcome>,
        ) -> Self {
            self.outcome = input;
            self
        }
        /// Consumes the builder and constructs a [`ConditionStepMetadata`](crate::model::ConditionStepMetadata).
        pub fn build(self) -> crate::model::ConditionStepMetadata {
            crate::model::ConditionStepMetadata {
                outcome: self.outcome,
            }
        }
    }
}
impl ConditionStepMetadata {
    /// Creates a new builder-style object to manufacture [`ConditionStepMetadata`](crate::model::ConditionStepMetadata).
    pub fn builder() -> crate::model::condition_step_metadata::Builder {
        crate::model::condition_step_metadata::Builder::default()
    }
}

/// When writing a match expression against `ConditionOutcome`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let conditionoutcome = unimplemented!();
/// match conditionoutcome {
///     ConditionOutcome::False => { /* ... */ },
///     ConditionOutcome::True => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `conditionoutcome` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ConditionOutcome::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ConditionOutcome::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ConditionOutcome::NewFeature` is defined.
/// Specifically, when `conditionoutcome` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ConditionOutcome::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ConditionOutcome {
    #[allow(missing_docs)] // documentation missing in model
    False,
    #[allow(missing_docs)] // documentation missing in model
    True,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ConditionOutcome {
    fn from(s: &str) -> Self {
        match s {
            "False" => ConditionOutcome::False,
            "True" => ConditionOutcome::True,
            other => ConditionOutcome::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ConditionOutcome {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ConditionOutcome::from(s))
    }
}
impl ConditionOutcome {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ConditionOutcome::False => "False",
            ConditionOutcome::True => "True",
            ConditionOutcome::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["False", "True"]
    }
}
impl AsRef<str> for ConditionOutcome {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Metadata for a register model job step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RegisterModelStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl RegisterModelStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`RegisterModelStepMetadata`](crate::model::RegisterModelStepMetadata).
pub mod register_model_step_metadata {

    /// A builder for [`RegisterModelStepMetadata`](crate::model::RegisterModelStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`RegisterModelStepMetadata`](crate::model::RegisterModelStepMetadata).
        pub fn build(self) -> crate::model::RegisterModelStepMetadata {
            crate::model::RegisterModelStepMetadata { arn: self.arn }
        }
    }
}
impl RegisterModelStepMetadata {
    /// Creates a new builder-style object to manufacture [`RegisterModelStepMetadata`](crate::model::RegisterModelStepMetadata).
    pub fn builder() -> crate::model::register_model_step_metadata::Builder {
        crate::model::register_model_step_metadata::Builder::default()
    }
}

/// <p>Metadata for Model steps.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the created model.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl ModelStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the created model.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`ModelStepMetadata`](crate::model::ModelStepMetadata).
pub mod model_step_metadata {

    /// A builder for [`ModelStepMetadata`](crate::model::ModelStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the created model.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the created model.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelStepMetadata`](crate::model::ModelStepMetadata).
        pub fn build(self) -> crate::model::ModelStepMetadata {
            crate::model::ModelStepMetadata { arn: self.arn }
        }
    }
}
impl ModelStepMetadata {
    /// Creates a new builder-style object to manufacture [`ModelStepMetadata`](crate::model::ModelStepMetadata).
    pub fn builder() -> crate::model::model_step_metadata::Builder {
        crate::model::model_step_metadata::Builder::default()
    }
}

/// <p>Metadata for a tuning step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TuningJobStepMetaData {
    /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl TuningJobStepMetaData {
    /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`TuningJobStepMetaData`](crate::model::TuningJobStepMetaData).
pub mod tuning_job_step_meta_data {

    /// A builder for [`TuningJobStepMetaData`](crate::model::TuningJobStepMetaData).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the tuning job that was run by this step execution.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`TuningJobStepMetaData`](crate::model::TuningJobStepMetaData).
        pub fn build(self) -> crate::model::TuningJobStepMetaData {
            crate::model::TuningJobStepMetaData { arn: self.arn }
        }
    }
}
impl TuningJobStepMetaData {
    /// Creates a new builder-style object to manufacture [`TuningJobStepMetaData`](crate::model::TuningJobStepMetaData).
    pub fn builder() -> crate::model::tuning_job_step_meta_data::Builder {
        crate::model::tuning_job_step_meta_data::Builder::default()
    }
}

/// <p>Metadata for a transform job step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TransformJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl TransformJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`TransformJobStepMetadata`](crate::model::TransformJobStepMetadata).
pub mod transform_job_step_metadata {

    /// A builder for [`TransformJobStepMetadata`](crate::model::TransformJobStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the transform job that was run by this step execution.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`TransformJobStepMetadata`](crate::model::TransformJobStepMetadata).
        pub fn build(self) -> crate::model::TransformJobStepMetadata {
            crate::model::TransformJobStepMetadata { arn: self.arn }
        }
    }
}
impl TransformJobStepMetadata {
    /// Creates a new builder-style object to manufacture [`TransformJobStepMetadata`](crate::model::TransformJobStepMetadata).
    pub fn builder() -> crate::model::transform_job_step_metadata::Builder {
        crate::model::transform_job_step_metadata::Builder::default()
    }
}

/// <p>Metadata for a processing job step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProcessingJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the processing job.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl ProcessingJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the processing job.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`ProcessingJobStepMetadata`](crate::model::ProcessingJobStepMetadata).
pub mod processing_job_step_metadata {

    /// A builder for [`ProcessingJobStepMetadata`](crate::model::ProcessingJobStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the processing job.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the processing job.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`ProcessingJobStepMetadata`](crate::model::ProcessingJobStepMetadata).
        pub fn build(self) -> crate::model::ProcessingJobStepMetadata {
            crate::model::ProcessingJobStepMetadata { arn: self.arn }
        }
    }
}
impl ProcessingJobStepMetadata {
    /// Creates a new builder-style object to manufacture [`ProcessingJobStepMetadata`](crate::model::ProcessingJobStepMetadata).
    pub fn builder() -> crate::model::processing_job_step_metadata::Builder {
        crate::model::processing_job_step_metadata::Builder::default()
    }
}

/// <p>Metadata for a training job step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrainingJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
    #[doc(hidden)]
    pub arn: std::option::Option<std::string::String>,
}
impl TrainingJobStepMetadata {
    /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
    pub fn arn(&self) -> std::option::Option<&str> {
        self.arn.as_deref()
    }
}
/// See [`TrainingJobStepMetadata`](crate::model::TrainingJobStepMetadata).
pub mod training_job_step_metadata {

    /// A builder for [`TrainingJobStepMetadata`](crate::model::TrainingJobStepMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
        pub fn arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the training job that was run by this step execution.</p>
        pub fn set_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.arn = input;
            self
        }
        /// Consumes the builder and constructs a [`TrainingJobStepMetadata`](crate::model::TrainingJobStepMetadata).
        pub fn build(self) -> crate::model::TrainingJobStepMetadata {
            crate::model::TrainingJobStepMetadata { arn: self.arn }
        }
    }
}
impl TrainingJobStepMetadata {
    /// Creates a new builder-style object to manufacture [`TrainingJobStepMetadata`](crate::model::TrainingJobStepMetadata).
    pub fn builder() -> crate::model::training_job_step_metadata::Builder {
        crate::model::training_job_step_metadata::Builder::default()
    }
}

/// <p>Details on the cache hit of a pipeline execution step.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CacheHitResult {
    /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
    #[doc(hidden)]
    pub source_pipeline_execution_arn: std::option::Option<std::string::String>,
}
impl CacheHitResult {
    /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
    pub fn source_pipeline_execution_arn(&self) -> std::option::Option<&str> {
        self.source_pipeline_execution_arn.as_deref()
    }
}
/// See [`CacheHitResult`](crate::model::CacheHitResult).
pub mod cache_hit_result {

    /// A builder for [`CacheHitResult`](crate::model::CacheHitResult).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_pipeline_execution_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
        pub fn source_pipeline_execution_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.source_pipeline_execution_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
        pub fn set_source_pipeline_execution_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.source_pipeline_execution_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`CacheHitResult`](crate::model::CacheHitResult).
        pub fn build(self) -> crate::model::CacheHitResult {
            crate::model::CacheHitResult {
                source_pipeline_execution_arn: self.source_pipeline_execution_arn,
            }
        }
    }
}
impl CacheHitResult {
    /// Creates a new builder-style object to manufacture [`CacheHitResult`](crate::model::CacheHitResult).
    pub fn builder() -> crate::model::cache_hit_result::Builder {
        crate::model::cache_hit_result::Builder::default()
    }
}

/// When writing a match expression against `StepStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let stepstatus = unimplemented!();
/// match stepstatus {
///     StepStatus::Executing => { /* ... */ },
///     StepStatus::Failed => { /* ... */ },
///     StepStatus::Starting => { /* ... */ },
///     StepStatus::Stopped => { /* ... */ },
///     StepStatus::Stopping => { /* ... */ },
///     StepStatus::Succeeded => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `stepstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `StepStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `StepStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `StepStatus::NewFeature` is defined.
/// Specifically, when `stepstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `StepStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum StepStatus {
    #[allow(missing_docs)] // documentation missing in model
    Executing,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    #[allow(missing_docs)] // documentation missing in model
    Succeeded,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for StepStatus {
    fn from(s: &str) -> Self {
        match s {
            "Executing" => StepStatus::Executing,
            "Failed" => StepStatus::Failed,
            "Starting" => StepStatus::Starting,
            "Stopped" => StepStatus::Stopped,
            "Stopping" => StepStatus::Stopping,
            "Succeeded" => StepStatus::Succeeded,
            other => StepStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for StepStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(StepStatus::from(s))
    }
}
impl StepStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            StepStatus::Executing => "Executing",
            StepStatus::Failed => "Failed",
            StepStatus::Starting => "Starting",
            StepStatus::Stopped => "Stopped",
            StepStatus::Stopping => "Stopping",
            StepStatus::Succeeded => "Succeeded",
            StepStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Executing",
            "Failed",
            "Starting",
            "Stopped",
            "Stopping",
            "Succeeded",
        ]
    }
}
impl AsRef<str> for StepStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A pipeline execution summary.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PipelineExecutionSummary {
    /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_arn: std::option::Option<std::string::String>,
    /// <p>The start time of the pipeline execution.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_status: std::option::Option<crate::model::PipelineExecutionStatus>,
    /// <p>The description of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_description: std::option::Option<std::string::String>,
    /// <p>The display name of the pipeline execution.</p>
    #[doc(hidden)]
    pub pipeline_execution_display_name: std::option::Option<std::string::String>,
    /// <p>A message generated by SageMaker Pipelines describing why the pipeline execution failed.</p>
    #[doc(hidden)]
    pub pipeline_execution_failure_reason: std::option::Option<std::string::String>,
}
impl PipelineExecutionSummary {
    /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
    pub fn pipeline_execution_arn(&self) -> std::option::Option<&str> {
        self.pipeline_execution_arn.as_deref()
    }
    /// <p>The start time of the pipeline execution.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>The status of the pipeline execution.</p>
    pub fn pipeline_execution_status(
        &self,
    ) -> std::option::Option<&crate::model::PipelineExecutionStatus> {
        self.pipeline_execution_status.as_ref()
    }
    /// <p>The description of the pipeline execution.</p>
    pub fn pipeline_execution_description(&self) -> std::option::Option<&str> {
        self.pipeline_execution_description.as_deref()
    }
    /// <p>The display name of the pipeline execution.</p>
    pub fn pipeline_execution_display_name(&self) -> std::option::Option<&str> {
        self.pipeline_execution_display_name.as_deref()
    }
    /// <p>A message generated by SageMaker Pipelines describing why the pipeline execution failed.</p>
    pub fn pipeline_execution_failure_reason(&self) -> std::option::Option<&str> {
        self.pipeline_execution_failure_reason.as_deref()
    }
}
/// See [`PipelineExecutionSummary`](crate::model::PipelineExecutionSummary).
pub mod pipeline_execution_summary {

    /// A builder for [`PipelineExecutionSummary`](crate::model::PipelineExecutionSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) pipeline_execution_arn: std::option::Option<std::string::String>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) pipeline_execution_status:
            std::option::Option<crate::model::PipelineExecutionStatus>,
        pub(crate) pipeline_execution_description: std::option::Option<std::string::String>,
        pub(crate) pipeline_execution_display_name: std::option::Option<std::string::String>,
        pub(crate) pipeline_execution_failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
        pub fn pipeline_execution_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pipeline_execution_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the pipeline execution.</p>
        pub fn set_pipeline_execution_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_arn = input;
            self
        }
        /// <p>The start time of the pipeline execution.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>The start time of the pipeline execution.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// <p>The status of the pipeline execution.</p>
        pub fn pipeline_execution_status(
            mut self,
            input: crate::model::PipelineExecutionStatus,
        ) -> Self {
            self.pipeline_execution_status = Some(input);
            self
        }
        /// <p>The status of the pipeline execution.</p>
        pub fn set_pipeline_execution_status(
            mut self,
            input: std::option::Option<crate::model::PipelineExecutionStatus>,
        ) -> Self {
            self.pipeline_execution_status = input;
            self
        }
        /// <p>The description of the pipeline execution.</p>
        pub fn pipeline_execution_description(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.pipeline_execution_description = Some(input.into());
            self
        }
        /// <p>The description of the pipeline execution.</p>
        pub fn set_pipeline_execution_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_description = input;
            self
        }
        /// <p>The display name of the pipeline execution.</p>
        pub fn pipeline_execution_display_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.pipeline_execution_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the pipeline execution.</p>
        pub fn set_pipeline_execution_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_display_name = input;
            self
        }
        /// <p>A message generated by SageMaker Pipelines describing why the pipeline execution failed.</p>
        pub fn pipeline_execution_failure_reason(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.pipeline_execution_failure_reason = Some(input.into());
            self
        }
        /// <p>A message generated by SageMaker Pipelines describing why the pipeline execution failed.</p>
        pub fn set_pipeline_execution_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pipeline_execution_failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`PipelineExecutionSummary`](crate::model::PipelineExecutionSummary).
        pub fn build(self) -> crate::model::PipelineExecutionSummary {
            crate::model::PipelineExecutionSummary {
                pipeline_execution_arn: self.pipeline_execution_arn,
                start_time: self.start_time,
                pipeline_execution_status: self.pipeline_execution_status,
                pipeline_execution_description: self.pipeline_execution_description,
                pipeline_execution_display_name: self.pipeline_execution_display_name,
                pipeline_execution_failure_reason: self.pipeline_execution_failure_reason,
            }
        }
    }
}
impl PipelineExecutionSummary {
    /// Creates a new builder-style object to manufacture [`PipelineExecutionSummary`](crate::model::PipelineExecutionSummary).
    pub fn builder() -> crate::model::pipeline_execution_summary::Builder {
        crate::model::pipeline_execution_summary::Builder::default()
    }
}

/// When writing a match expression against `SortPipelineExecutionsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortpipelineexecutionsby = unimplemented!();
/// match sortpipelineexecutionsby {
///     SortPipelineExecutionsBy::CreationTime => { /* ... */ },
///     SortPipelineExecutionsBy::PipelineExecutionArn => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortpipelineexecutionsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortPipelineExecutionsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortPipelineExecutionsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortPipelineExecutionsBy::NewFeature` is defined.
/// Specifically, when `sortpipelineexecutionsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortPipelineExecutionsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortPipelineExecutionsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    PipelineExecutionArn,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortPipelineExecutionsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortPipelineExecutionsBy::CreationTime,
            "PipelineExecutionArn" => SortPipelineExecutionsBy::PipelineExecutionArn,
            other => SortPipelineExecutionsBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for SortPipelineExecutionsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortPipelineExecutionsBy::from(s))
    }
}
impl SortPipelineExecutionsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortPipelineExecutionsBy::CreationTime => "CreationTime",
            SortPipelineExecutionsBy::PipelineExecutionArn => "PipelineExecutionArn",
            SortPipelineExecutionsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "PipelineExecutionArn"]
    }
}
impl AsRef<str> for SortPipelineExecutionsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information for an SageMaker notebook instance.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NotebookInstanceSummary {
    /// <p>The name of the notebook instance that you want a summary for.</p>
    #[doc(hidden)]
    pub notebook_instance_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the notebook instance.</p>
    #[doc(hidden)]
    pub notebook_instance_arn: std::option::Option<std::string::String>,
    /// <p>The status of the notebook instance.</p>
    #[doc(hidden)]
    pub notebook_instance_status: std::option::Option<crate::model::NotebookInstanceStatus>,
    /// <p>The URL that you use to connect to the Jupyter notebook running in your notebook instance. </p>
    #[doc(hidden)]
    pub url: std::option::Option<std::string::String>,
    /// <p>The type of ML compute instance that the notebook instance is running on.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::InstanceType>,
    /// <p>A timestamp that shows when the notebook instance was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that shows when the notebook instance was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The name of a notebook instance lifecycle configuration associated with this notebook instance.</p>
    /// <p>For information about notebook instance lifestyle configurations, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html">Step 2.1: (Optional) Customize a Notebook Instance</a>.</p>
    #[doc(hidden)]
    pub notebook_instance_lifecycle_config_name: std::option::Option<std::string::String>,
    /// <p>The Git repository associated with the notebook instance as its default code repository. This can be either the name of a Git repository stored as a resource in your account, or the URL of a Git repository in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. When you open a notebook instance, it opens in the directory that contains this repository. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
    #[doc(hidden)]
    pub default_code_repository: std::option::Option<std::string::String>,
    /// <p>An array of up to three Git repositories associated with the notebook instance. These can be either the names of Git repositories stored as resources in your account, or the URL of Git repositories in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. These repositories are cloned at the same level as the default repository of your notebook instance. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
    #[doc(hidden)]
    pub additional_code_repositories: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl NotebookInstanceSummary {
    /// <p>The name of the notebook instance that you want a summary for.</p>
    pub fn notebook_instance_name(&self) -> std::option::Option<&str> {
        self.notebook_instance_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the notebook instance.</p>
    pub fn notebook_instance_arn(&self) -> std::option::Option<&str> {
        self.notebook_instance_arn.as_deref()
    }
    /// <p>The status of the notebook instance.</p>
    pub fn notebook_instance_status(
        &self,
    ) -> std::option::Option<&crate::model::NotebookInstanceStatus> {
        self.notebook_instance_status.as_ref()
    }
    /// <p>The URL that you use to connect to the Jupyter notebook running in your notebook instance. </p>
    pub fn url(&self) -> std::option::Option<&str> {
        self.url.as_deref()
    }
    /// <p>The type of ML compute instance that the notebook instance is running on.</p>
    pub fn instance_type(&self) -> std::option::Option<&crate::model::InstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>A timestamp that shows when the notebook instance was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that shows when the notebook instance was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The name of a notebook instance lifecycle configuration associated with this notebook instance.</p>
    /// <p>For information about notebook instance lifestyle configurations, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html">Step 2.1: (Optional) Customize a Notebook Instance</a>.</p>
    pub fn notebook_instance_lifecycle_config_name(&self) -> std::option::Option<&str> {
        self.notebook_instance_lifecycle_config_name.as_deref()
    }
    /// <p>The Git repository associated with the notebook instance as its default code repository. This can be either the name of a Git repository stored as a resource in your account, or the URL of a Git repository in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. When you open a notebook instance, it opens in the directory that contains this repository. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
    pub fn default_code_repository(&self) -> std::option::Option<&str> {
        self.default_code_repository.as_deref()
    }
    /// <p>An array of up to three Git repositories associated with the notebook instance. These can be either the names of Git repositories stored as resources in your account, or the URL of Git repositories in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. These repositories are cloned at the same level as the default repository of your notebook instance. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
    pub fn additional_code_repositories(&self) -> std::option::Option<&[std::string::String]> {
        self.additional_code_repositories.as_deref()
    }
}
/// See [`NotebookInstanceSummary`](crate::model::NotebookInstanceSummary).
pub mod notebook_instance_summary {

    /// A builder for [`NotebookInstanceSummary`](crate::model::NotebookInstanceSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) notebook_instance_name: std::option::Option<std::string::String>,
        pub(crate) notebook_instance_arn: std::option::Option<std::string::String>,
        pub(crate) notebook_instance_status:
            std::option::Option<crate::model::NotebookInstanceStatus>,
        pub(crate) url: std::option::Option<std::string::String>,
        pub(crate) instance_type: std::option::Option<crate::model::InstanceType>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) notebook_instance_lifecycle_config_name:
            std::option::Option<std::string::String>,
        pub(crate) default_code_repository: std::option::Option<std::string::String>,
        pub(crate) additional_code_repositories:
            std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The name of the notebook instance that you want a summary for.</p>
        pub fn notebook_instance_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.notebook_instance_name = Some(input.into());
            self
        }
        /// <p>The name of the notebook instance that you want a summary for.</p>
        pub fn set_notebook_instance_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.notebook_instance_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the notebook instance.</p>
        pub fn notebook_instance_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.notebook_instance_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the notebook instance.</p>
        pub fn set_notebook_instance_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.notebook_instance_arn = input;
            self
        }
        /// <p>The status of the notebook instance.</p>
        pub fn notebook_instance_status(
            mut self,
            input: crate::model::NotebookInstanceStatus,
        ) -> Self {
            self.notebook_instance_status = Some(input);
            self
        }
        /// <p>The status of the notebook instance.</p>
        pub fn set_notebook_instance_status(
            mut self,
            input: std::option::Option<crate::model::NotebookInstanceStatus>,
        ) -> Self {
            self.notebook_instance_status = input;
            self
        }
        /// <p>The URL that you use to connect to the Jupyter notebook running in your notebook instance. </p>
        pub fn url(mut self, input: impl Into<std::string::String>) -> Self {
            self.url = Some(input.into());
            self
        }
        /// <p>The URL that you use to connect to the Jupyter notebook running in your notebook instance. </p>
        pub fn set_url(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.url = input;
            self
        }
        /// <p>The type of ML compute instance that the notebook instance is running on.</p>
        pub fn instance_type(mut self, input: crate::model::InstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The type of ML compute instance that the notebook instance is running on.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::InstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>A timestamp that shows when the notebook instance was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the notebook instance was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that shows when the notebook instance was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the notebook instance was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The name of a notebook instance lifecycle configuration associated with this notebook instance.</p>
        /// <p>For information about notebook instance lifestyle configurations, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html">Step 2.1: (Optional) Customize a Notebook Instance</a>.</p>
        pub fn notebook_instance_lifecycle_config_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.notebook_instance_lifecycle_config_name = Some(input.into());
            self
        }
        /// <p>The name of a notebook instance lifecycle configuration associated with this notebook instance.</p>
        /// <p>For information about notebook instance lifestyle configurations, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html">Step 2.1: (Optional) Customize a Notebook Instance</a>.</p>
        pub fn set_notebook_instance_lifecycle_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.notebook_instance_lifecycle_config_name = input;
            self
        }
        /// <p>The Git repository associated with the notebook instance as its default code repository. This can be either the name of a Git repository stored as a resource in your account, or the URL of a Git repository in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. When you open a notebook instance, it opens in the directory that contains this repository. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
        pub fn default_code_repository(mut self, input: impl Into<std::string::String>) -> Self {
            self.default_code_repository = Some(input.into());
            self
        }
        /// <p>The Git repository associated with the notebook instance as its default code repository. This can be either the name of a Git repository stored as a resource in your account, or the URL of a Git repository in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. When you open a notebook instance, it opens in the directory that contains this repository. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
        pub fn set_default_code_repository(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.default_code_repository = input;
            self
        }
        /// Appends an item to `additional_code_repositories`.
        ///
        /// To override the contents of this collection use [`set_additional_code_repositories`](Self::set_additional_code_repositories).
        ///
        /// <p>An array of up to three Git repositories associated with the notebook instance. These can be either the names of Git repositories stored as resources in your account, or the URL of Git repositories in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. These repositories are cloned at the same level as the default repository of your notebook instance. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
        pub fn additional_code_repositories(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            let mut v = self.additional_code_repositories.unwrap_or_default();
            v.push(input.into());
            self.additional_code_repositories = Some(v);
            self
        }
        /// <p>An array of up to three Git repositories associated with the notebook instance. These can be either the names of Git repositories stored as resources in your account, or the URL of Git repositories in <a href="https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html">Amazon Web Services CodeCommit</a> or in any other Git repository. These repositories are cloned at the same level as the default repository of your notebook instance. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html">Associating Git Repositories with SageMaker Notebook Instances</a>.</p>
        pub fn set_additional_code_repositories(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.additional_code_repositories = input;
            self
        }
        /// Consumes the builder and constructs a [`NotebookInstanceSummary`](crate::model::NotebookInstanceSummary).
        pub fn build(self) -> crate::model::NotebookInstanceSummary {
            crate::model::NotebookInstanceSummary {
                notebook_instance_name: self.notebook_instance_name,
                notebook_instance_arn: self.notebook_instance_arn,
                notebook_instance_status: self.notebook_instance_status,
                url: self.url,
                instance_type: self.instance_type,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                notebook_instance_lifecycle_config_name: self
                    .notebook_instance_lifecycle_config_name,
                default_code_repository: self.default_code_repository,
                additional_code_repositories: self.additional_code_repositories,
            }
        }
    }
}
impl NotebookInstanceSummary {
    /// Creates a new builder-style object to manufacture [`NotebookInstanceSummary`](crate::model::NotebookInstanceSummary).
    pub fn builder() -> crate::model::notebook_instance_summary::Builder {
        crate::model::notebook_instance_summary::Builder::default()
    }
}

/// When writing a match expression against `NotebookInstanceStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookinstancestatus = unimplemented!();
/// match notebookinstancestatus {
///     NotebookInstanceStatus::Deleting => { /* ... */ },
///     NotebookInstanceStatus::Failed => { /* ... */ },
///     NotebookInstanceStatus::InService => { /* ... */ },
///     NotebookInstanceStatus::Pending => { /* ... */ },
///     NotebookInstanceStatus::Stopped => { /* ... */ },
///     NotebookInstanceStatus::Stopping => { /* ... */ },
///     NotebookInstanceStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookinstancestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookInstanceStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookInstanceStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookInstanceStatus::NewFeature` is defined.
/// Specifically, when `notebookinstancestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookInstanceStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookInstanceStatus {
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookInstanceStatus {
    fn from(s: &str) -> Self {
        match s {
            "Deleting" => NotebookInstanceStatus::Deleting,
            "Failed" => NotebookInstanceStatus::Failed,
            "InService" => NotebookInstanceStatus::InService,
            "Pending" => NotebookInstanceStatus::Pending,
            "Stopped" => NotebookInstanceStatus::Stopped,
            "Stopping" => NotebookInstanceStatus::Stopping,
            "Updating" => NotebookInstanceStatus::Updating,
            other => {
                NotebookInstanceStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for NotebookInstanceStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookInstanceStatus::from(s))
    }
}
impl NotebookInstanceStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookInstanceStatus::Deleting => "Deleting",
            NotebookInstanceStatus::Failed => "Failed",
            NotebookInstanceStatus::InService => "InService",
            NotebookInstanceStatus::Pending => "Pending",
            NotebookInstanceStatus::Stopped => "Stopped",
            NotebookInstanceStatus::Stopping => "Stopping",
            NotebookInstanceStatus::Updating => "Updating",
            NotebookInstanceStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Deleting",
            "Failed",
            "InService",
            "Pending",
            "Stopped",
            "Stopping",
            "Updating",
        ]
    }
}
impl AsRef<str> for NotebookInstanceStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `NotebookInstanceSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookinstancesortorder = unimplemented!();
/// match notebookinstancesortorder {
///     NotebookInstanceSortOrder::Ascending => { /* ... */ },
///     NotebookInstanceSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookinstancesortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookInstanceSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookInstanceSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookInstanceSortOrder::NewFeature` is defined.
/// Specifically, when `notebookinstancesortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookInstanceSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookInstanceSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookInstanceSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => NotebookInstanceSortOrder::Ascending,
            "Descending" => NotebookInstanceSortOrder::Descending,
            other => NotebookInstanceSortOrder::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for NotebookInstanceSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookInstanceSortOrder::from(s))
    }
}
impl NotebookInstanceSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookInstanceSortOrder::Ascending => "Ascending",
            NotebookInstanceSortOrder::Descending => "Descending",
            NotebookInstanceSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for NotebookInstanceSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `NotebookInstanceSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookinstancesortkey = unimplemented!();
/// match notebookinstancesortkey {
///     NotebookInstanceSortKey::CreationTime => { /* ... */ },
///     NotebookInstanceSortKey::Name => { /* ... */ },
///     NotebookInstanceSortKey::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookinstancesortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookInstanceSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookInstanceSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookInstanceSortKey::NewFeature` is defined.
/// Specifically, when `notebookinstancesortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookInstanceSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookInstanceSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookInstanceSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => NotebookInstanceSortKey::CreationTime,
            "Name" => NotebookInstanceSortKey::Name,
            "Status" => NotebookInstanceSortKey::Status,
            other => NotebookInstanceSortKey::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for NotebookInstanceSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookInstanceSortKey::from(s))
    }
}
impl NotebookInstanceSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookInstanceSortKey::CreationTime => "CreationTime",
            NotebookInstanceSortKey::Name => "Name",
            NotebookInstanceSortKey::Status => "Status",
            NotebookInstanceSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for NotebookInstanceSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides a summary of a notebook instance lifecycle configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NotebookInstanceLifecycleConfigSummary {
    /// <p>The name of the lifecycle configuration.</p>
    #[doc(hidden)]
    pub notebook_instance_lifecycle_config_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the lifecycle configuration.</p>
    #[doc(hidden)]
    pub notebook_instance_lifecycle_config_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that tells when the lifecycle configuration was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that tells when the lifecycle configuration was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl NotebookInstanceLifecycleConfigSummary {
    /// <p>The name of the lifecycle configuration.</p>
    pub fn notebook_instance_lifecycle_config_name(&self) -> std::option::Option<&str> {
        self.notebook_instance_lifecycle_config_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the lifecycle configuration.</p>
    pub fn notebook_instance_lifecycle_config_arn(&self) -> std::option::Option<&str> {
        self.notebook_instance_lifecycle_config_arn.as_deref()
    }
    /// <p>A timestamp that tells when the lifecycle configuration was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that tells when the lifecycle configuration was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`NotebookInstanceLifecycleConfigSummary`](crate::model::NotebookInstanceLifecycleConfigSummary).
pub mod notebook_instance_lifecycle_config_summary {

    /// A builder for [`NotebookInstanceLifecycleConfigSummary`](crate::model::NotebookInstanceLifecycleConfigSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) notebook_instance_lifecycle_config_name:
            std::option::Option<std::string::String>,
        pub(crate) notebook_instance_lifecycle_config_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the lifecycle configuration.</p>
        pub fn notebook_instance_lifecycle_config_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.notebook_instance_lifecycle_config_name = Some(input.into());
            self
        }
        /// <p>The name of the lifecycle configuration.</p>
        pub fn set_notebook_instance_lifecycle_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.notebook_instance_lifecycle_config_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the lifecycle configuration.</p>
        pub fn notebook_instance_lifecycle_config_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.notebook_instance_lifecycle_config_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the lifecycle configuration.</p>
        pub fn set_notebook_instance_lifecycle_config_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.notebook_instance_lifecycle_config_arn = input;
            self
        }
        /// <p>A timestamp that tells when the lifecycle configuration was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that tells when the lifecycle configuration was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that tells when the lifecycle configuration was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that tells when the lifecycle configuration was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`NotebookInstanceLifecycleConfigSummary`](crate::model::NotebookInstanceLifecycleConfigSummary).
        pub fn build(self) -> crate::model::NotebookInstanceLifecycleConfigSummary {
            crate::model::NotebookInstanceLifecycleConfigSummary {
                notebook_instance_lifecycle_config_name: self
                    .notebook_instance_lifecycle_config_name,
                notebook_instance_lifecycle_config_arn: self.notebook_instance_lifecycle_config_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl NotebookInstanceLifecycleConfigSummary {
    /// Creates a new builder-style object to manufacture [`NotebookInstanceLifecycleConfigSummary`](crate::model::NotebookInstanceLifecycleConfigSummary).
    pub fn builder() -> crate::model::notebook_instance_lifecycle_config_summary::Builder {
        crate::model::notebook_instance_lifecycle_config_summary::Builder::default()
    }
}

/// When writing a match expression against `NotebookInstanceLifecycleConfigSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookinstancelifecycleconfigsortorder = unimplemented!();
/// match notebookinstancelifecycleconfigsortorder {
///     NotebookInstanceLifecycleConfigSortOrder::Ascending => { /* ... */ },
///     NotebookInstanceLifecycleConfigSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookinstancelifecycleconfigsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookInstanceLifecycleConfigSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookInstanceLifecycleConfigSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookInstanceLifecycleConfigSortOrder::NewFeature` is defined.
/// Specifically, when `notebookinstancelifecycleconfigsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookInstanceLifecycleConfigSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookInstanceLifecycleConfigSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookInstanceLifecycleConfigSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => NotebookInstanceLifecycleConfigSortOrder::Ascending,
            "Descending" => NotebookInstanceLifecycleConfigSortOrder::Descending,
            other => NotebookInstanceLifecycleConfigSortOrder::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for NotebookInstanceLifecycleConfigSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookInstanceLifecycleConfigSortOrder::from(s))
    }
}
impl NotebookInstanceLifecycleConfigSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookInstanceLifecycleConfigSortOrder::Ascending => "Ascending",
            NotebookInstanceLifecycleConfigSortOrder::Descending => "Descending",
            NotebookInstanceLifecycleConfigSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for NotebookInstanceLifecycleConfigSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `NotebookInstanceLifecycleConfigSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let notebookinstancelifecycleconfigsortkey = unimplemented!();
/// match notebookinstancelifecycleconfigsortkey {
///     NotebookInstanceLifecycleConfigSortKey::CreationTime => { /* ... */ },
///     NotebookInstanceLifecycleConfigSortKey::LastModifiedTime => { /* ... */ },
///     NotebookInstanceLifecycleConfigSortKey::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `notebookinstancelifecycleconfigsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `NotebookInstanceLifecycleConfigSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `NotebookInstanceLifecycleConfigSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `NotebookInstanceLifecycleConfigSortKey::NewFeature` is defined.
/// Specifically, when `notebookinstancelifecycleconfigsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `NotebookInstanceLifecycleConfigSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum NotebookInstanceLifecycleConfigSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for NotebookInstanceLifecycleConfigSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => NotebookInstanceLifecycleConfigSortKey::CreationTime,
            "LastModifiedTime" => NotebookInstanceLifecycleConfigSortKey::LastModifiedTime,
            "Name" => NotebookInstanceLifecycleConfigSortKey::Name,
            other => NotebookInstanceLifecycleConfigSortKey::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for NotebookInstanceLifecycleConfigSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(NotebookInstanceLifecycleConfigSortKey::from(s))
    }
}
impl NotebookInstanceLifecycleConfigSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            NotebookInstanceLifecycleConfigSortKey::CreationTime => "CreationTime",
            NotebookInstanceLifecycleConfigSortKey::LastModifiedTime => "LastModifiedTime",
            NotebookInstanceLifecycleConfigSortKey::Name => "Name",
            NotebookInstanceLifecycleConfigSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "LastModifiedTime", "Name"]
    }
}
impl AsRef<str> for NotebookInstanceLifecycleConfigSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summarizes the monitoring schedule.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringScheduleSummary {
    /// <p>The name of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_arn: std::option::Option<std::string::String>,
    /// <p>The creation time of the monitoring schedule.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last time the monitoring schedule was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_status: std::option::Option<crate::model::ScheduleStatus>,
    /// <p>The name of the endpoint using the monitoring schedule.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>The name of the monitoring job definition that the schedule is for.</p>
    #[doc(hidden)]
    pub monitoring_job_definition_name: std::option::Option<std::string::String>,
    /// <p>The type of the monitoring job definition that the schedule is for.</p>
    #[doc(hidden)]
    pub monitoring_type: std::option::Option<crate::model::MonitoringType>,
}
impl MonitoringScheduleSummary {
    /// <p>The name of the monitoring schedule.</p>
    pub fn monitoring_schedule_name(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
    pub fn monitoring_schedule_arn(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_arn.as_deref()
    }
    /// <p>The creation time of the monitoring schedule.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last time the monitoring schedule was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the monitoring schedule.</p>
    pub fn monitoring_schedule_status(&self) -> std::option::Option<&crate::model::ScheduleStatus> {
        self.monitoring_schedule_status.as_ref()
    }
    /// <p>The name of the endpoint using the monitoring schedule.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>The name of the monitoring job definition that the schedule is for.</p>
    pub fn monitoring_job_definition_name(&self) -> std::option::Option<&str> {
        self.monitoring_job_definition_name.as_deref()
    }
    /// <p>The type of the monitoring job definition that the schedule is for.</p>
    pub fn monitoring_type(&self) -> std::option::Option<&crate::model::MonitoringType> {
        self.monitoring_type.as_ref()
    }
}
/// See [`MonitoringScheduleSummary`](crate::model::MonitoringScheduleSummary).
pub mod monitoring_schedule_summary {

    /// A builder for [`MonitoringScheduleSummary`](crate::model::MonitoringScheduleSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_schedule_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_schedule_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) monitoring_schedule_status: std::option::Option<crate::model::ScheduleStatus>,
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_job_definition_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_type: std::option::Option<crate::model::MonitoringType>,
    }
    impl Builder {
        /// <p>The name of the monitoring schedule.</p>
        pub fn monitoring_schedule_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
        pub fn monitoring_schedule_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_arn = input;
            self
        }
        /// <p>The creation time of the monitoring schedule.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the monitoring schedule.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last time the monitoring schedule was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last time the monitoring schedule was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the monitoring schedule.</p>
        pub fn monitoring_schedule_status(mut self, input: crate::model::ScheduleStatus) -> Self {
            self.monitoring_schedule_status = Some(input);
            self
        }
        /// <p>The status of the monitoring schedule.</p>
        pub fn set_monitoring_schedule_status(
            mut self,
            input: std::option::Option<crate::model::ScheduleStatus>,
        ) -> Self {
            self.monitoring_schedule_status = input;
            self
        }
        /// <p>The name of the endpoint using the monitoring schedule.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint using the monitoring schedule.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>The name of the monitoring job definition that the schedule is for.</p>
        pub fn monitoring_job_definition_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring job definition that the schedule is for.</p>
        pub fn set_monitoring_job_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = input;
            self
        }
        /// <p>The type of the monitoring job definition that the schedule is for.</p>
        pub fn monitoring_type(mut self, input: crate::model::MonitoringType) -> Self {
            self.monitoring_type = Some(input);
            self
        }
        /// <p>The type of the monitoring job definition that the schedule is for.</p>
        pub fn set_monitoring_type(
            mut self,
            input: std::option::Option<crate::model::MonitoringType>,
        ) -> Self {
            self.monitoring_type = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringScheduleSummary`](crate::model::MonitoringScheduleSummary).
        pub fn build(self) -> crate::model::MonitoringScheduleSummary {
            crate::model::MonitoringScheduleSummary {
                monitoring_schedule_name: self.monitoring_schedule_name,
                monitoring_schedule_arn: self.monitoring_schedule_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                monitoring_schedule_status: self.monitoring_schedule_status,
                endpoint_name: self.endpoint_name,
                monitoring_job_definition_name: self.monitoring_job_definition_name,
                monitoring_type: self.monitoring_type,
            }
        }
    }
}
impl MonitoringScheduleSummary {
    /// Creates a new builder-style object to manufacture [`MonitoringScheduleSummary`](crate::model::MonitoringScheduleSummary).
    pub fn builder() -> crate::model::monitoring_schedule_summary::Builder {
        crate::model::monitoring_schedule_summary::Builder::default()
    }
}

/// When writing a match expression against `MonitoringScheduleSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringschedulesortkey = unimplemented!();
/// match monitoringschedulesortkey {
///     MonitoringScheduleSortKey::CreationTime => { /* ... */ },
///     MonitoringScheduleSortKey::Name => { /* ... */ },
///     MonitoringScheduleSortKey::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringschedulesortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringScheduleSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringScheduleSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringScheduleSortKey::NewFeature` is defined.
/// Specifically, when `monitoringschedulesortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringScheduleSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringScheduleSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringScheduleSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => MonitoringScheduleSortKey::CreationTime,
            "Name" => MonitoringScheduleSortKey::Name,
            "Status" => MonitoringScheduleSortKey::Status,
            other => MonitoringScheduleSortKey::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for MonitoringScheduleSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringScheduleSortKey::from(s))
    }
}
impl MonitoringScheduleSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringScheduleSortKey::CreationTime => "CreationTime",
            MonitoringScheduleSortKey::Name => "Name",
            MonitoringScheduleSortKey::Status => "Status",
            MonitoringScheduleSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for MonitoringScheduleSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `MonitoringExecutionSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringexecutionsortkey = unimplemented!();
/// match monitoringexecutionsortkey {
///     MonitoringExecutionSortKey::CreationTime => { /* ... */ },
///     MonitoringExecutionSortKey::ScheduledTime => { /* ... */ },
///     MonitoringExecutionSortKey::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringexecutionsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringExecutionSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringExecutionSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringExecutionSortKey::NewFeature` is defined.
/// Specifically, when `monitoringexecutionsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringExecutionSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringExecutionSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    ScheduledTime,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringExecutionSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => MonitoringExecutionSortKey::CreationTime,
            "ScheduledTime" => MonitoringExecutionSortKey::ScheduledTime,
            "Status" => MonitoringExecutionSortKey::Status,
            other => MonitoringExecutionSortKey::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for MonitoringExecutionSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringExecutionSortKey::from(s))
    }
}
impl MonitoringExecutionSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringExecutionSortKey::CreationTime => "CreationTime",
            MonitoringExecutionSortKey::ScheduledTime => "ScheduledTime",
            MonitoringExecutionSortKey::Status => "Status",
            MonitoringExecutionSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "ScheduledTime", "Status"]
    }
}
impl AsRef<str> for MonitoringExecutionSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information of an alert's history.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringAlertHistorySummary {
    /// <p>The name of a monitoring schedule.</p>
    #[doc(hidden)]
    pub monitoring_schedule_name: std::option::Option<std::string::String>,
    /// <p>The name of a monitoring alert.</p>
    #[doc(hidden)]
    pub monitoring_alert_name: std::option::Option<std::string::String>,
    /// <p>A timestamp that indicates when the first alert transition occurred in an alert history. An alert transition can be from status <code>InAlert</code> to <code>OK</code>, or from <code>OK</code> to <code>InAlert</code>.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The current alert status of an alert.</p>
    #[doc(hidden)]
    pub alert_status: std::option::Option<crate::model::MonitoringAlertStatus>,
}
impl MonitoringAlertHistorySummary {
    /// <p>The name of a monitoring schedule.</p>
    pub fn monitoring_schedule_name(&self) -> std::option::Option<&str> {
        self.monitoring_schedule_name.as_deref()
    }
    /// <p>The name of a monitoring alert.</p>
    pub fn monitoring_alert_name(&self) -> std::option::Option<&str> {
        self.monitoring_alert_name.as_deref()
    }
    /// <p>A timestamp that indicates when the first alert transition occurred in an alert history. An alert transition can be from status <code>InAlert</code> to <code>OK</code>, or from <code>OK</code> to <code>InAlert</code>.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The current alert status of an alert.</p>
    pub fn alert_status(&self) -> std::option::Option<&crate::model::MonitoringAlertStatus> {
        self.alert_status.as_ref()
    }
}
/// See [`MonitoringAlertHistorySummary`](crate::model::MonitoringAlertHistorySummary).
pub mod monitoring_alert_history_summary {

    /// A builder for [`MonitoringAlertHistorySummary`](crate::model::MonitoringAlertHistorySummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_schedule_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_alert_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) alert_status: std::option::Option<crate::model::MonitoringAlertStatus>,
    }
    impl Builder {
        /// <p>The name of a monitoring schedule.</p>
        pub fn monitoring_schedule_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_schedule_name = Some(input.into());
            self
        }
        /// <p>The name of a monitoring schedule.</p>
        pub fn set_monitoring_schedule_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_schedule_name = input;
            self
        }
        /// <p>The name of a monitoring alert.</p>
        pub fn monitoring_alert_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.monitoring_alert_name = Some(input.into());
            self
        }
        /// <p>The name of a monitoring alert.</p>
        pub fn set_monitoring_alert_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_alert_name = input;
            self
        }
        /// <p>A timestamp that indicates when the first alert transition occurred in an alert history. An alert transition can be from status <code>InAlert</code> to <code>OK</code>, or from <code>OK</code> to <code>InAlert</code>.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the first alert transition occurred in an alert history. An alert transition can be from status <code>InAlert</code> to <code>OK</code>, or from <code>OK</code> to <code>InAlert</code>.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The current alert status of an alert.</p>
        pub fn alert_status(mut self, input: crate::model::MonitoringAlertStatus) -> Self {
            self.alert_status = Some(input);
            self
        }
        /// <p>The current alert status of an alert.</p>
        pub fn set_alert_status(
            mut self,
            input: std::option::Option<crate::model::MonitoringAlertStatus>,
        ) -> Self {
            self.alert_status = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringAlertHistorySummary`](crate::model::MonitoringAlertHistorySummary).
        pub fn build(self) -> crate::model::MonitoringAlertHistorySummary {
            crate::model::MonitoringAlertHistorySummary {
                monitoring_schedule_name: self.monitoring_schedule_name,
                monitoring_alert_name: self.monitoring_alert_name,
                creation_time: self.creation_time,
                alert_status: self.alert_status,
            }
        }
    }
}
impl MonitoringAlertHistorySummary {
    /// Creates a new builder-style object to manufacture [`MonitoringAlertHistorySummary`](crate::model::MonitoringAlertHistorySummary).
    pub fn builder() -> crate::model::monitoring_alert_history_summary::Builder {
        crate::model::monitoring_alert_history_summary::Builder::default()
    }
}

/// When writing a match expression against `MonitoringAlertHistorySortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringalerthistorysortkey = unimplemented!();
/// match monitoringalerthistorysortkey {
///     MonitoringAlertHistorySortKey::CreationTime => { /* ... */ },
///     MonitoringAlertHistorySortKey::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringalerthistorysortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringAlertHistorySortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringAlertHistorySortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringAlertHistorySortKey::NewFeature` is defined.
/// Specifically, when `monitoringalerthistorysortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringAlertHistorySortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringAlertHistorySortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringAlertHistorySortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => MonitoringAlertHistorySortKey::CreationTime,
            "Status" => MonitoringAlertHistorySortKey::Status,
            other => MonitoringAlertHistorySortKey::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for MonitoringAlertHistorySortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringAlertHistorySortKey::from(s))
    }
}
impl MonitoringAlertHistorySortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringAlertHistorySortKey::CreationTime => "CreationTime",
            MonitoringAlertHistorySortKey::Status => "Status",
            MonitoringAlertHistorySortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Status"]
    }
}
impl AsRef<str> for MonitoringAlertHistorySortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelSummary {
    /// <p>The name of the model that you want a summary for.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model.</p>
    #[doc(hidden)]
    pub model_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that indicates when the model was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ModelSummary {
    /// <p>The name of the model that you want a summary for.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model.</p>
    pub fn model_arn(&self) -> std::option::Option<&str> {
        self.model_arn.as_deref()
    }
    /// <p>A timestamp that indicates when the model was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
}
/// See [`ModelSummary`](crate::model::ModelSummary).
pub mod model_summary {

    /// A builder for [`ModelSummary`](crate::model::ModelSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) model_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the model that you want a summary for.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model that you want a summary for.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model.</p>
        pub fn model_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model.</p>
        pub fn set_model_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_arn = input;
            self
        }
        /// <p>A timestamp that indicates when the model was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that indicates when the model was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelSummary`](crate::model::ModelSummary).
        pub fn build(self) -> crate::model::ModelSummary {
            crate::model::ModelSummary {
                model_name: self.model_name,
                model_arn: self.model_arn,
                creation_time: self.creation_time,
            }
        }
    }
}
impl ModelSummary {
    /// Creates a new builder-style object to manufacture [`ModelSummary`](crate::model::ModelSummary).
    pub fn builder() -> crate::model::model_summary::Builder {
        crate::model::model_summary::Builder::default()
    }
}

/// When writing a match expression against `OrderKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let orderkey = unimplemented!();
/// match orderkey {
///     OrderKey::Ascending => { /* ... */ },
///     OrderKey::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `orderkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `OrderKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `OrderKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `OrderKey::NewFeature` is defined.
/// Specifically, when `orderkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `OrderKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum OrderKey {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for OrderKey {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => OrderKey::Ascending,
            "Descending" => OrderKey::Descending,
            other => OrderKey::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for OrderKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(OrderKey::from(s))
    }
}
impl OrderKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            OrderKey::Ascending => "Ascending",
            OrderKey::Descending => "Descending",
            OrderKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for OrderKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelsortkey = unimplemented!();
/// match modelsortkey {
///     ModelSortKey::CreationTime => { /* ... */ },
///     ModelSortKey::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelSortKey::NewFeature` is defined.
/// Specifically, when `modelsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ModelSortKey::CreationTime,
            "Name" => ModelSortKey::Name,
            other => ModelSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ModelSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelSortKey::from(s))
    }
}
impl ModelSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelSortKey::CreationTime => "CreationTime",
            ModelSortKey::Name => "Name",
            ModelSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for ModelSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summary information about a monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringJobDefinitionSummary {
    /// <p>The name of the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_job_definition_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
    #[doc(hidden)]
    pub monitoring_job_definition_arn: std::option::Option<std::string::String>,
    /// <p>The time that the monitoring job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The name of the endpoint that the job monitors.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
}
impl MonitoringJobDefinitionSummary {
    /// <p>The name of the monitoring job.</p>
    pub fn monitoring_job_definition_name(&self) -> std::option::Option<&str> {
        self.monitoring_job_definition_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
    pub fn monitoring_job_definition_arn(&self) -> std::option::Option<&str> {
        self.monitoring_job_definition_arn.as_deref()
    }
    /// <p>The time that the monitoring job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The name of the endpoint that the job monitors.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
}
/// See [`MonitoringJobDefinitionSummary`](crate::model::MonitoringJobDefinitionSummary).
pub mod monitoring_job_definition_summary {

    /// A builder for [`MonitoringJobDefinitionSummary`](crate::model::MonitoringJobDefinitionSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) monitoring_job_definition_name: std::option::Option<std::string::String>,
        pub(crate) monitoring_job_definition_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the monitoring job.</p>
        pub fn monitoring_job_definition_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = Some(input.into());
            self
        }
        /// <p>The name of the monitoring job.</p>
        pub fn set_monitoring_job_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
        pub fn monitoring_job_definition_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the monitoring job.</p>
        pub fn set_monitoring_job_definition_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.monitoring_job_definition_arn = input;
            self
        }
        /// <p>The time that the monitoring job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the monitoring job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The name of the endpoint that the job monitors.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint that the job monitors.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringJobDefinitionSummary`](crate::model::MonitoringJobDefinitionSummary).
        pub fn build(self) -> crate::model::MonitoringJobDefinitionSummary {
            crate::model::MonitoringJobDefinitionSummary {
                monitoring_job_definition_name: self.monitoring_job_definition_name,
                monitoring_job_definition_arn: self.monitoring_job_definition_arn,
                creation_time: self.creation_time,
                endpoint_name: self.endpoint_name,
            }
        }
    }
}
impl MonitoringJobDefinitionSummary {
    /// Creates a new builder-style object to manufacture [`MonitoringJobDefinitionSummary`](crate::model::MonitoringJobDefinitionSummary).
    pub fn builder() -> crate::model::monitoring_job_definition_summary::Builder {
        crate::model::monitoring_job_definition_summary::Builder::default()
    }
}

/// When writing a match expression against `MonitoringJobDefinitionSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringjobdefinitionsortkey = unimplemented!();
/// match monitoringjobdefinitionsortkey {
///     MonitoringJobDefinitionSortKey::CreationTime => { /* ... */ },
///     MonitoringJobDefinitionSortKey::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringjobdefinitionsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringJobDefinitionSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringJobDefinitionSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringJobDefinitionSortKey::NewFeature` is defined.
/// Specifically, when `monitoringjobdefinitionsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringJobDefinitionSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringJobDefinitionSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringJobDefinitionSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => MonitoringJobDefinitionSortKey::CreationTime,
            "Name" => MonitoringJobDefinitionSortKey::Name,
            other => MonitoringJobDefinitionSortKey::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for MonitoringJobDefinitionSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringJobDefinitionSortKey::from(s))
    }
}
impl MonitoringJobDefinitionSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringJobDefinitionSortKey::CreationTime => "CreationTime",
            MonitoringJobDefinitionSortKey::Name => "Name",
            MonitoringJobDefinitionSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for MonitoringJobDefinitionSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about a model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageSummary {
    /// <p>The name of the model package.</p>
    #[doc(hidden)]
    pub model_package_name: std::option::Option<std::string::String>,
    /// <p>If the model package is a versioned model, the model group that the versioned model belongs to.</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>If the model package is a versioned model, the version of the model.</p>
    #[doc(hidden)]
    pub model_package_version: std::option::Option<i32>,
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    #[doc(hidden)]
    pub model_package_arn: std::option::Option<std::string::String>,
    /// <p>A brief description of the model package.</p>
    #[doc(hidden)]
    pub model_package_description: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the model package was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The overall status of the model package.</p>
    #[doc(hidden)]
    pub model_package_status: std::option::Option<crate::model::ModelPackageStatus>,
    /// <p>The approval status of the model. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
    /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
    /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_approval_status: std::option::Option<crate::model::ModelApprovalStatus>,
}
impl ModelPackageSummary {
    /// <p>The name of the model package.</p>
    pub fn model_package_name(&self) -> std::option::Option<&str> {
        self.model_package_name.as_deref()
    }
    /// <p>If the model package is a versioned model, the model group that the versioned model belongs to.</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>If the model package is a versioned model, the version of the model.</p>
    pub fn model_package_version(&self) -> std::option::Option<i32> {
        self.model_package_version
    }
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    pub fn model_package_arn(&self) -> std::option::Option<&str> {
        self.model_package_arn.as_deref()
    }
    /// <p>A brief description of the model package.</p>
    pub fn model_package_description(&self) -> std::option::Option<&str> {
        self.model_package_description.as_deref()
    }
    /// <p>A timestamp that shows when the model package was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The overall status of the model package.</p>
    pub fn model_package_status(&self) -> std::option::Option<&crate::model::ModelPackageStatus> {
        self.model_package_status.as_ref()
    }
    /// <p>The approval status of the model. This can be one of the following values.</p>
    /// <ul>
    /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
    /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
    /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
    /// </ul>
    pub fn model_approval_status(&self) -> std::option::Option<&crate::model::ModelApprovalStatus> {
        self.model_approval_status.as_ref()
    }
}
/// See [`ModelPackageSummary`](crate::model::ModelPackageSummary).
pub mod model_package_summary {

    /// A builder for [`ModelPackageSummary`](crate::model::ModelPackageSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_package_name: std::option::Option<std::string::String>,
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) model_package_version: std::option::Option<i32>,
        pub(crate) model_package_arn: std::option::Option<std::string::String>,
        pub(crate) model_package_description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) model_package_status: std::option::Option<crate::model::ModelPackageStatus>,
        pub(crate) model_approval_status: std::option::Option<crate::model::ModelApprovalStatus>,
    }
    impl Builder {
        /// <p>The name of the model package.</p>
        pub fn model_package_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_name = Some(input.into());
            self
        }
        /// <p>The name of the model package.</p>
        pub fn set_model_package_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_name = input;
            self
        }
        /// <p>If the model package is a versioned model, the model group that the versioned model belongs to.</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>If the model package is a versioned model, the model group that the versioned model belongs to.</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>If the model package is a versioned model, the version of the model.</p>
        pub fn model_package_version(mut self, input: i32) -> Self {
            self.model_package_version = Some(input);
            self
        }
        /// <p>If the model package is a versioned model, the version of the model.</p>
        pub fn set_model_package_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_package_version = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn model_package_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn set_model_package_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_arn = input;
            self
        }
        /// <p>A brief description of the model package.</p>
        pub fn model_package_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_description = Some(input.into());
            self
        }
        /// <p>A brief description of the model package.</p>
        pub fn set_model_package_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_description = input;
            self
        }
        /// <p>A timestamp that shows when the model package was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the model package was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The overall status of the model package.</p>
        pub fn model_package_status(mut self, input: crate::model::ModelPackageStatus) -> Self {
            self.model_package_status = Some(input);
            self
        }
        /// <p>The overall status of the model package.</p>
        pub fn set_model_package_status(
            mut self,
            input: std::option::Option<crate::model::ModelPackageStatus>,
        ) -> Self {
            self.model_package_status = input;
            self
        }
        /// <p>The approval status of the model. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
        /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
        /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
        /// </ul>
        pub fn model_approval_status(mut self, input: crate::model::ModelApprovalStatus) -> Self {
            self.model_approval_status = Some(input);
            self
        }
        /// <p>The approval status of the model. This can be one of the following values.</p>
        /// <ul>
        /// <li> <p> <code>APPROVED</code> - The model is approved</p> </li>
        /// <li> <p> <code>REJECTED</code> - The model is rejected.</p> </li>
        /// <li> <p> <code>PENDING_MANUAL_APPROVAL</code> - The model is waiting for manual approval.</p> </li>
        /// </ul>
        pub fn set_model_approval_status(
            mut self,
            input: std::option::Option<crate::model::ModelApprovalStatus>,
        ) -> Self {
            self.model_approval_status = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageSummary`](crate::model::ModelPackageSummary).
        pub fn build(self) -> crate::model::ModelPackageSummary {
            crate::model::ModelPackageSummary {
                model_package_name: self.model_package_name,
                model_package_group_name: self.model_package_group_name,
                model_package_version: self.model_package_version,
                model_package_arn: self.model_package_arn,
                model_package_description: self.model_package_description,
                creation_time: self.creation_time,
                model_package_status: self.model_package_status,
                model_approval_status: self.model_approval_status,
            }
        }
    }
}
impl ModelPackageSummary {
    /// Creates a new builder-style object to manufacture [`ModelPackageSummary`](crate::model::ModelPackageSummary).
    pub fn builder() -> crate::model::model_package_summary::Builder {
        crate::model::model_package_summary::Builder::default()
    }
}

/// When writing a match expression against `ModelPackageSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelpackagesortby = unimplemented!();
/// match modelpackagesortby {
///     ModelPackageSortBy::CreationTime => { /* ... */ },
///     ModelPackageSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelpackagesortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelPackageSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelPackageSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelPackageSortBy::NewFeature` is defined.
/// Specifically, when `modelpackagesortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelPackageSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelPackageSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelPackageSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ModelPackageSortBy::CreationTime,
            "Name" => ModelPackageSortBy::Name,
            other => {
                ModelPackageSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelPackageSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelPackageSortBy::from(s))
    }
}
impl ModelPackageSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelPackageSortBy::CreationTime => "CreationTime",
            ModelPackageSortBy::Name => "Name",
            ModelPackageSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for ModelPackageSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelPackageType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelpackagetype = unimplemented!();
/// match modelpackagetype {
///     ModelPackageType::Both => { /* ... */ },
///     ModelPackageType::Unversioned => { /* ... */ },
///     ModelPackageType::Versioned => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelpackagetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelPackageType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelPackageType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelPackageType::NewFeature` is defined.
/// Specifically, when `modelpackagetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelPackageType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelPackageType {
    #[allow(missing_docs)] // documentation missing in model
    Both,
    #[allow(missing_docs)] // documentation missing in model
    Unversioned,
    #[allow(missing_docs)] // documentation missing in model
    Versioned,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelPackageType {
    fn from(s: &str) -> Self {
        match s {
            "Both" => ModelPackageType::Both,
            "Unversioned" => ModelPackageType::Unversioned,
            "Versioned" => ModelPackageType::Versioned,
            other => ModelPackageType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ModelPackageType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelPackageType::from(s))
    }
}
impl ModelPackageType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelPackageType::Both => "Both",
            ModelPackageType::Unversioned => "Unversioned",
            ModelPackageType::Versioned => "Versioned",
            ModelPackageType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Both", "Unversioned", "Versioned"]
    }
}
impl AsRef<str> for ModelPackageType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summary information about a model group.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelPackageGroupSummary {
    /// <p>The name of the model group.</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model group.</p>
    #[doc(hidden)]
    pub model_package_group_arn: std::option::Option<std::string::String>,
    /// <p>A description of the model group.</p>
    #[doc(hidden)]
    pub model_package_group_description: std::option::Option<std::string::String>,
    /// <p>The time that the model group was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the model group.</p>
    #[doc(hidden)]
    pub model_package_group_status: std::option::Option<crate::model::ModelPackageGroupStatus>,
}
impl ModelPackageGroupSummary {
    /// <p>The name of the model group.</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model group.</p>
    pub fn model_package_group_arn(&self) -> std::option::Option<&str> {
        self.model_package_group_arn.as_deref()
    }
    /// <p>A description of the model group.</p>
    pub fn model_package_group_description(&self) -> std::option::Option<&str> {
        self.model_package_group_description.as_deref()
    }
    /// <p>The time that the model group was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The status of the model group.</p>
    pub fn model_package_group_status(
        &self,
    ) -> std::option::Option<&crate::model::ModelPackageGroupStatus> {
        self.model_package_group_status.as_ref()
    }
}
/// See [`ModelPackageGroupSummary`](crate::model::ModelPackageGroupSummary).
pub mod model_package_group_summary {

    /// A builder for [`ModelPackageGroupSummary`](crate::model::ModelPackageGroupSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) model_package_group_arn: std::option::Option<std::string::String>,
        pub(crate) model_package_group_description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) model_package_group_status:
            std::option::Option<crate::model::ModelPackageGroupStatus>,
    }
    impl Builder {
        /// <p>The name of the model group.</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>The name of the model group.</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model group.</p>
        pub fn model_package_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model group.</p>
        pub fn set_model_package_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_arn = input;
            self
        }
        /// <p>A description of the model group.</p>
        pub fn model_package_group_description(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.model_package_group_description = Some(input.into());
            self
        }
        /// <p>A description of the model group.</p>
        pub fn set_model_package_group_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_description = input;
            self
        }
        /// <p>The time that the model group was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time that the model group was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The status of the model group.</p>
        pub fn model_package_group_status(
            mut self,
            input: crate::model::ModelPackageGroupStatus,
        ) -> Self {
            self.model_package_group_status = Some(input);
            self
        }
        /// <p>The status of the model group.</p>
        pub fn set_model_package_group_status(
            mut self,
            input: std::option::Option<crate::model::ModelPackageGroupStatus>,
        ) -> Self {
            self.model_package_group_status = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelPackageGroupSummary`](crate::model::ModelPackageGroupSummary).
        pub fn build(self) -> crate::model::ModelPackageGroupSummary {
            crate::model::ModelPackageGroupSummary {
                model_package_group_name: self.model_package_group_name,
                model_package_group_arn: self.model_package_group_arn,
                model_package_group_description: self.model_package_group_description,
                creation_time: self.creation_time,
                model_package_group_status: self.model_package_group_status,
            }
        }
    }
}
impl ModelPackageGroupSummary {
    /// Creates a new builder-style object to manufacture [`ModelPackageGroupSummary`](crate::model::ModelPackageGroupSummary).
    pub fn builder() -> crate::model::model_package_group_summary::Builder {
        crate::model::model_package_group_summary::Builder::default()
    }
}

/// When writing a match expression against `ModelPackageGroupSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelpackagegroupsortby = unimplemented!();
/// match modelpackagegroupsortby {
///     ModelPackageGroupSortBy::CreationTime => { /* ... */ },
///     ModelPackageGroupSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelpackagegroupsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelPackageGroupSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelPackageGroupSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelPackageGroupSortBy::NewFeature` is defined.
/// Specifically, when `modelpackagegroupsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelPackageGroupSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelPackageGroupSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelPackageGroupSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ModelPackageGroupSortBy::CreationTime,
            "Name" => ModelPackageGroupSortBy::Name,
            other => ModelPackageGroupSortBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelPackageGroupSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelPackageGroupSortBy::from(s))
    }
}
impl ModelPackageGroupSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelPackageGroupSortBy::CreationTime => "CreationTime",
            ModelPackageGroupSortBy::Name => "Name",
            ModelPackageGroupSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for ModelPackageGroupSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of the model metadata.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelMetadataSummary {
    /// <p>The machine learning domain of the model.</p>
    #[doc(hidden)]
    pub domain: std::option::Option<std::string::String>,
    /// <p>The machine learning framework of the model.</p>
    #[doc(hidden)]
    pub framework: std::option::Option<std::string::String>,
    /// <p>The machine learning task of the model.</p>
    #[doc(hidden)]
    pub task: std::option::Option<std::string::String>,
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model: std::option::Option<std::string::String>,
    /// <p>The framework version of the model.</p>
    #[doc(hidden)]
    pub framework_version: std::option::Option<std::string::String>,
}
impl ModelMetadataSummary {
    /// <p>The machine learning domain of the model.</p>
    pub fn domain(&self) -> std::option::Option<&str> {
        self.domain.as_deref()
    }
    /// <p>The machine learning framework of the model.</p>
    pub fn framework(&self) -> std::option::Option<&str> {
        self.framework.as_deref()
    }
    /// <p>The machine learning task of the model.</p>
    pub fn task(&self) -> std::option::Option<&str> {
        self.task.as_deref()
    }
    /// <p>The name of the model.</p>
    pub fn model(&self) -> std::option::Option<&str> {
        self.model.as_deref()
    }
    /// <p>The framework version of the model.</p>
    pub fn framework_version(&self) -> std::option::Option<&str> {
        self.framework_version.as_deref()
    }
}
/// See [`ModelMetadataSummary`](crate::model::ModelMetadataSummary).
pub mod model_metadata_summary {

    /// A builder for [`ModelMetadataSummary`](crate::model::ModelMetadataSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain: std::option::Option<std::string::String>,
        pub(crate) framework: std::option::Option<std::string::String>,
        pub(crate) task: std::option::Option<std::string::String>,
        pub(crate) model: std::option::Option<std::string::String>,
        pub(crate) framework_version: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The machine learning domain of the model.</p>
        pub fn domain(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain = Some(input.into());
            self
        }
        /// <p>The machine learning domain of the model.</p>
        pub fn set_domain(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain = input;
            self
        }
        /// <p>The machine learning framework of the model.</p>
        pub fn framework(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework = Some(input.into());
            self
        }
        /// <p>The machine learning framework of the model.</p>
        pub fn set_framework(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.framework = input;
            self
        }
        /// <p>The machine learning task of the model.</p>
        pub fn task(mut self, input: impl Into<std::string::String>) -> Self {
            self.task = Some(input.into());
            self
        }
        /// <p>The machine learning task of the model.</p>
        pub fn set_task(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.task = input;
            self
        }
        /// <p>The name of the model.</p>
        pub fn model(mut self, input: impl Into<std::string::String>) -> Self {
            self.model = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model = input;
            self
        }
        /// <p>The framework version of the model.</p>
        pub fn framework_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework_version = Some(input.into());
            self
        }
        /// <p>The framework version of the model.</p>
        pub fn set_framework_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.framework_version = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelMetadataSummary`](crate::model::ModelMetadataSummary).
        pub fn build(self) -> crate::model::ModelMetadataSummary {
            crate::model::ModelMetadataSummary {
                domain: self.domain,
                framework: self.framework,
                task: self.task,
                model: self.model,
                framework_version: self.framework_version,
            }
        }
    }
}
impl ModelMetadataSummary {
    /// Creates a new builder-style object to manufacture [`ModelMetadataSummary`](crate::model::ModelMetadataSummary).
    pub fn builder() -> crate::model::model_metadata_summary::Builder {
        crate::model::model_metadata_summary::Builder::default()
    }
}

/// <p>One or more filters that searches for the specified resource or resources in a search. All resource objects that satisfy the expression's condition are included in the search results</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelMetadataSearchExpression {
    /// <p>A list of filter objects.</p>
    #[doc(hidden)]
    pub filters: std::option::Option<std::vec::Vec<crate::model::ModelMetadataFilter>>,
}
impl ModelMetadataSearchExpression {
    /// <p>A list of filter objects.</p>
    pub fn filters(&self) -> std::option::Option<&[crate::model::ModelMetadataFilter]> {
        self.filters.as_deref()
    }
}
/// See [`ModelMetadataSearchExpression`](crate::model::ModelMetadataSearchExpression).
pub mod model_metadata_search_expression {

    /// A builder for [`ModelMetadataSearchExpression`](crate::model::ModelMetadataSearchExpression).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) filters: std::option::Option<std::vec::Vec<crate::model::ModelMetadataFilter>>,
    }
    impl Builder {
        /// Appends an item to `filters`.
        ///
        /// To override the contents of this collection use [`set_filters`](Self::set_filters).
        ///
        /// <p>A list of filter objects.</p>
        pub fn filters(mut self, input: crate::model::ModelMetadataFilter) -> Self {
            let mut v = self.filters.unwrap_or_default();
            v.push(input);
            self.filters = Some(v);
            self
        }
        /// <p>A list of filter objects.</p>
        pub fn set_filters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ModelMetadataFilter>>,
        ) -> Self {
            self.filters = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelMetadataSearchExpression`](crate::model::ModelMetadataSearchExpression).
        pub fn build(self) -> crate::model::ModelMetadataSearchExpression {
            crate::model::ModelMetadataSearchExpression {
                filters: self.filters,
            }
        }
    }
}
impl ModelMetadataSearchExpression {
    /// Creates a new builder-style object to manufacture [`ModelMetadataSearchExpression`](crate::model::ModelMetadataSearchExpression).
    pub fn builder() -> crate::model::model_metadata_search_expression::Builder {
        crate::model::model_metadata_search_expression::Builder::default()
    }
}

/// <p>Part of the search expression. You can specify the name and value (domain, task, framework, framework version, task, and model).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelMetadataFilter {
    /// <p>The name of the of the model to filter by.</p>
    #[doc(hidden)]
    pub name: std::option::Option<crate::model::ModelMetadataFilterType>,
    /// <p>The value to filter the model metadata.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl ModelMetadataFilter {
    /// <p>The name of the of the model to filter by.</p>
    pub fn name(&self) -> std::option::Option<&crate::model::ModelMetadataFilterType> {
        self.name.as_ref()
    }
    /// <p>The value to filter the model metadata.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`ModelMetadataFilter`](crate::model::ModelMetadataFilter).
pub mod model_metadata_filter {

    /// A builder for [`ModelMetadataFilter`](crate::model::ModelMetadataFilter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<crate::model::ModelMetadataFilterType>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the of the model to filter by.</p>
        pub fn name(mut self, input: crate::model::ModelMetadataFilterType) -> Self {
            self.name = Some(input);
            self
        }
        /// <p>The name of the of the model to filter by.</p>
        pub fn set_name(
            mut self,
            input: std::option::Option<crate::model::ModelMetadataFilterType>,
        ) -> Self {
            self.name = input;
            self
        }
        /// <p>The value to filter the model metadata.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The value to filter the model metadata.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelMetadataFilter`](crate::model::ModelMetadataFilter).
        pub fn build(self) -> crate::model::ModelMetadataFilter {
            crate::model::ModelMetadataFilter {
                name: self.name,
                value: self.value,
            }
        }
    }
}
impl ModelMetadataFilter {
    /// Creates a new builder-style object to manufacture [`ModelMetadataFilter`](crate::model::ModelMetadataFilter).
    pub fn builder() -> crate::model::model_metadata_filter::Builder {
        crate::model::model_metadata_filter::Builder::default()
    }
}

/// When writing a match expression against `ModelMetadataFilterType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelmetadatafiltertype = unimplemented!();
/// match modelmetadatafiltertype {
///     ModelMetadataFilterType::Domain => { /* ... */ },
///     ModelMetadataFilterType::Framework => { /* ... */ },
///     ModelMetadataFilterType::Frameworkversion => { /* ... */ },
///     ModelMetadataFilterType::Task => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelmetadatafiltertype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelMetadataFilterType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelMetadataFilterType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelMetadataFilterType::NewFeature` is defined.
/// Specifically, when `modelmetadatafiltertype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelMetadataFilterType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelMetadataFilterType {
    #[allow(missing_docs)] // documentation missing in model
    Domain,
    #[allow(missing_docs)] // documentation missing in model
    Framework,
    #[allow(missing_docs)] // documentation missing in model
    Frameworkversion,
    #[allow(missing_docs)] // documentation missing in model
    Task,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelMetadataFilterType {
    fn from(s: &str) -> Self {
        match s {
            "Domain" => ModelMetadataFilterType::Domain,
            "Framework" => ModelMetadataFilterType::Framework,
            "FrameworkVersion" => ModelMetadataFilterType::Frameworkversion,
            "Task" => ModelMetadataFilterType::Task,
            other => ModelMetadataFilterType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelMetadataFilterType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelMetadataFilterType::from(s))
    }
}
impl ModelMetadataFilterType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelMetadataFilterType::Domain => "Domain",
            ModelMetadataFilterType::Framework => "Framework",
            ModelMetadataFilterType::Frameworkversion => "FrameworkVersion",
            ModelMetadataFilterType::Task => "Task",
            ModelMetadataFilterType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Domain", "Framework", "FrameworkVersion", "Task"]
    }
}
impl AsRef<str> for ModelMetadataFilterType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of a specific version of the model card.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelCardVersionSummary {
    /// <p>The name of the model card.</p>
    #[doc(hidden)]
    pub model_card_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model card.</p>
    #[doc(hidden)]
    pub model_card_arn: std::option::Option<std::string::String>,
    /// <p>The approval status of the model card version within your organization. Different organizations might have different criteria for model card review and approval.</p>
    /// <ul>
    /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
    /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
    /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
    /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_card_status: std::option::Option<crate::model::ModelCardStatus>,
    /// <p>A version of the model card.</p>
    #[doc(hidden)]
    pub model_card_version: i32,
    /// <p>The date and time that the model card version was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time date and time that the model card version was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ModelCardVersionSummary {
    /// <p>The name of the model card.</p>
    pub fn model_card_name(&self) -> std::option::Option<&str> {
        self.model_card_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model card.</p>
    pub fn model_card_arn(&self) -> std::option::Option<&str> {
        self.model_card_arn.as_deref()
    }
    /// <p>The approval status of the model card version within your organization. Different organizations might have different criteria for model card review and approval.</p>
    /// <ul>
    /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
    /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
    /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
    /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
    /// </ul>
    pub fn model_card_status(&self) -> std::option::Option<&crate::model::ModelCardStatus> {
        self.model_card_status.as_ref()
    }
    /// <p>A version of the model card.</p>
    pub fn model_card_version(&self) -> i32 {
        self.model_card_version
    }
    /// <p>The date and time that the model card version was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time date and time that the model card version was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ModelCardVersionSummary`](crate::model::ModelCardVersionSummary).
pub mod model_card_version_summary {

    /// A builder for [`ModelCardVersionSummary`](crate::model::ModelCardVersionSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_card_name: std::option::Option<std::string::String>,
        pub(crate) model_card_arn: std::option::Option<std::string::String>,
        pub(crate) model_card_status: std::option::Option<crate::model::ModelCardStatus>,
        pub(crate) model_card_version: std::option::Option<i32>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the model card.</p>
        pub fn model_card_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_name = Some(input.into());
            self
        }
        /// <p>The name of the model card.</p>
        pub fn set_model_card_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card.</p>
        pub fn model_card_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card.</p>
        pub fn set_model_card_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_arn = input;
            self
        }
        /// <p>The approval status of the model card version within your organization. Different organizations might have different criteria for model card review and approval.</p>
        /// <ul>
        /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
        /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
        /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
        /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
        /// </ul>
        pub fn model_card_status(mut self, input: crate::model::ModelCardStatus) -> Self {
            self.model_card_status = Some(input);
            self
        }
        /// <p>The approval status of the model card version within your organization. Different organizations might have different criteria for model card review and approval.</p>
        /// <ul>
        /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
        /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
        /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
        /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
        /// </ul>
        pub fn set_model_card_status(
            mut self,
            input: std::option::Option<crate::model::ModelCardStatus>,
        ) -> Self {
            self.model_card_status = input;
            self
        }
        /// <p>A version of the model card.</p>
        pub fn model_card_version(mut self, input: i32) -> Self {
            self.model_card_version = Some(input);
            self
        }
        /// <p>A version of the model card.</p>
        pub fn set_model_card_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_card_version = input;
            self
        }
        /// <p>The date and time that the model card version was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the model card version was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time date and time that the model card version was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time date and time that the model card version was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCardVersionSummary`](crate::model::ModelCardVersionSummary).
        pub fn build(self) -> crate::model::ModelCardVersionSummary {
            crate::model::ModelCardVersionSummary {
                model_card_name: self.model_card_name,
                model_card_arn: self.model_card_arn,
                model_card_status: self.model_card_status,
                model_card_version: self.model_card_version.unwrap_or_default(),
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ModelCardVersionSummary {
    /// Creates a new builder-style object to manufacture [`ModelCardVersionSummary`](crate::model::ModelCardVersionSummary).
    pub fn builder() -> crate::model::model_card_version_summary::Builder {
        crate::model::model_card_version_summary::Builder::default()
    }
}

/// When writing a match expression against `ModelCardSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardsortorder = unimplemented!();
/// match modelcardsortorder {
///     ModelCardSortOrder::Ascending => { /* ... */ },
///     ModelCardSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardSortOrder::NewFeature` is defined.
/// Specifically, when `modelcardsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => ModelCardSortOrder::Ascending,
            "Descending" => ModelCardSortOrder::Descending,
            other => {
                ModelCardSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelCardSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardSortOrder::from(s))
    }
}
impl ModelCardSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardSortOrder::Ascending => "Ascending",
            ModelCardSortOrder::Descending => "Descending",
            ModelCardSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for ModelCardSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelCardVersionSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardversionsortby = unimplemented!();
/// match modelcardversionsortby {
///     ModelCardVersionSortBy::Version => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardversionsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardVersionSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardVersionSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardVersionSortBy::NewFeature` is defined.
/// Specifically, when `modelcardversionsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardVersionSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardVersionSortBy {
    #[allow(missing_docs)] // documentation missing in model
    Version,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardVersionSortBy {
    fn from(s: &str) -> Self {
        match s {
            "Version" => ModelCardVersionSortBy::Version,
            other => {
                ModelCardVersionSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelCardVersionSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardVersionSortBy::from(s))
    }
}
impl ModelCardVersionSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardVersionSortBy::Version => "Version",
            ModelCardVersionSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Version"]
    }
}
impl AsRef<str> for ModelCardVersionSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of the model card.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelCardSummary {
    /// <p>The name of the model card.</p>
    #[doc(hidden)]
    pub model_card_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model card.</p>
    #[doc(hidden)]
    pub model_card_arn: std::option::Option<std::string::String>,
    /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
    /// <ul>
    /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
    /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
    /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
    /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub model_card_status: std::option::Option<crate::model::ModelCardStatus>,
    /// <p>The date and time that the model card was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the model card was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ModelCardSummary {
    /// <p>The name of the model card.</p>
    pub fn model_card_name(&self) -> std::option::Option<&str> {
        self.model_card_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model card.</p>
    pub fn model_card_arn(&self) -> std::option::Option<&str> {
        self.model_card_arn.as_deref()
    }
    /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
    /// <ul>
    /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
    /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
    /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
    /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
    /// </ul>
    pub fn model_card_status(&self) -> std::option::Option<&crate::model::ModelCardStatus> {
        self.model_card_status.as_ref()
    }
    /// <p>The date and time that the model card was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The date and time that the model card was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ModelCardSummary`](crate::model::ModelCardSummary).
pub mod model_card_summary {

    /// A builder for [`ModelCardSummary`](crate::model::ModelCardSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_card_name: std::option::Option<std::string::String>,
        pub(crate) model_card_arn: std::option::Option<std::string::String>,
        pub(crate) model_card_status: std::option::Option<crate::model::ModelCardStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the model card.</p>
        pub fn model_card_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_name = Some(input.into());
            self
        }
        /// <p>The name of the model card.</p>
        pub fn set_model_card_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card.</p>
        pub fn model_card_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card.</p>
        pub fn set_model_card_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_arn = input;
            self
        }
        /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
        /// <ul>
        /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
        /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
        /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
        /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
        /// </ul>
        pub fn model_card_status(mut self, input: crate::model::ModelCardStatus) -> Self {
            self.model_card_status = Some(input);
            self
        }
        /// <p>The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.</p>
        /// <ul>
        /// <li> <p> <code>Draft</code>: The model card is a work in progress.</p> </li>
        /// <li> <p> <code>PendingReview</code>: The model card is pending review.</p> </li>
        /// <li> <p> <code>Approved</code>: The model card is approved.</p> </li>
        /// <li> <p> <code>Archived</code>: The model card is archived. No more updates should be made to the model card, but it can still be exported.</p> </li>
        /// </ul>
        pub fn set_model_card_status(
            mut self,
            input: std::option::Option<crate::model::ModelCardStatus>,
        ) -> Self {
            self.model_card_status = input;
            self
        }
        /// <p>The date and time that the model card was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the model card was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The date and time that the model card was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The date and time that the model card was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCardSummary`](crate::model::ModelCardSummary).
        pub fn build(self) -> crate::model::ModelCardSummary {
            crate::model::ModelCardSummary {
                model_card_name: self.model_card_name,
                model_card_arn: self.model_card_arn,
                model_card_status: self.model_card_status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ModelCardSummary {
    /// Creates a new builder-style object to manufacture [`ModelCardSummary`](crate::model::ModelCardSummary).
    pub fn builder() -> crate::model::model_card_summary::Builder {
        crate::model::model_card_summary::Builder::default()
    }
}

/// When writing a match expression against `ModelCardSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardsortby = unimplemented!();
/// match modelcardsortby {
///     ModelCardSortBy::CreationTime => { /* ... */ },
///     ModelCardSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardSortBy::NewFeature` is defined.
/// Specifically, when `modelcardsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ModelCardSortBy::CreationTime,
            "Name" => ModelCardSortBy::Name,
            other => ModelCardSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ModelCardSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardSortBy::from(s))
    }
}
impl ModelCardSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardSortBy::CreationTime => "CreationTime",
            ModelCardSortBy::Name => "Name",
            ModelCardSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for ModelCardSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The summary of the Amazon SageMaker Model Card export job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelCardExportJobSummary {
    /// <p>The name of the model card export job.</p>
    #[doc(hidden)]
    pub model_card_export_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model card export job.</p>
    #[doc(hidden)]
    pub model_card_export_job_arn: std::option::Option<std::string::String>,
    /// <p>The completion status of the model card export job.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::ModelCardExportJobStatus>,
    /// <p>The name of the model card that the export job exports.</p>
    #[doc(hidden)]
    pub model_card_name: std::option::Option<std::string::String>,
    /// <p>The version of the model card that the export job exports.</p>
    #[doc(hidden)]
    pub model_card_version: i32,
    /// <p>The date and time that the model card export job was created.</p>
    #[doc(hidden)]
    pub created_at: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the model card export job was last modified..</p>
    #[doc(hidden)]
    pub last_modified_at: std::option::Option<aws_smithy_types::DateTime>,
}
impl ModelCardExportJobSummary {
    /// <p>The name of the model card export job.</p>
    pub fn model_card_export_job_name(&self) -> std::option::Option<&str> {
        self.model_card_export_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model card export job.</p>
    pub fn model_card_export_job_arn(&self) -> std::option::Option<&str> {
        self.model_card_export_job_arn.as_deref()
    }
    /// <p>The completion status of the model card export job.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::ModelCardExportJobStatus> {
        self.status.as_ref()
    }
    /// <p>The name of the model card that the export job exports.</p>
    pub fn model_card_name(&self) -> std::option::Option<&str> {
        self.model_card_name.as_deref()
    }
    /// <p>The version of the model card that the export job exports.</p>
    pub fn model_card_version(&self) -> i32 {
        self.model_card_version
    }
    /// <p>The date and time that the model card export job was created.</p>
    pub fn created_at(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.created_at.as_ref()
    }
    /// <p>The date and time that the model card export job was last modified..</p>
    pub fn last_modified_at(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_at.as_ref()
    }
}
/// See [`ModelCardExportJobSummary`](crate::model::ModelCardExportJobSummary).
pub mod model_card_export_job_summary {

    /// A builder for [`ModelCardExportJobSummary`](crate::model::ModelCardExportJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_card_export_job_name: std::option::Option<std::string::String>,
        pub(crate) model_card_export_job_arn: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::ModelCardExportJobStatus>,
        pub(crate) model_card_name: std::option::Option<std::string::String>,
        pub(crate) model_card_version: std::option::Option<i32>,
        pub(crate) created_at: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_at: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the model card export job.</p>
        pub fn model_card_export_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_export_job_name = Some(input.into());
            self
        }
        /// <p>The name of the model card export job.</p>
        pub fn set_model_card_export_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_export_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card export job.</p>
        pub fn model_card_export_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_export_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model card export job.</p>
        pub fn set_model_card_export_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_export_job_arn = input;
            self
        }
        /// <p>The completion status of the model card export job.</p>
        pub fn status(mut self, input: crate::model::ModelCardExportJobStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The completion status of the model card export job.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::ModelCardExportJobStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The name of the model card that the export job exports.</p>
        pub fn model_card_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_card_name = Some(input.into());
            self
        }
        /// <p>The name of the model card that the export job exports.</p>
        pub fn set_model_card_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_card_name = input;
            self
        }
        /// <p>The version of the model card that the export job exports.</p>
        pub fn model_card_version(mut self, input: i32) -> Self {
            self.model_card_version = Some(input);
            self
        }
        /// <p>The version of the model card that the export job exports.</p>
        pub fn set_model_card_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_card_version = input;
            self
        }
        /// <p>The date and time that the model card export job was created.</p>
        pub fn created_at(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.created_at = Some(input);
            self
        }
        /// <p>The date and time that the model card export job was created.</p>
        pub fn set_created_at(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.created_at = input;
            self
        }
        /// <p>The date and time that the model card export job was last modified..</p>
        pub fn last_modified_at(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_at = Some(input);
            self
        }
        /// <p>The date and time that the model card export job was last modified..</p>
        pub fn set_last_modified_at(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_at = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCardExportJobSummary`](crate::model::ModelCardExportJobSummary).
        pub fn build(self) -> crate::model::ModelCardExportJobSummary {
            crate::model::ModelCardExportJobSummary {
                model_card_export_job_name: self.model_card_export_job_name,
                model_card_export_job_arn: self.model_card_export_job_arn,
                status: self.status,
                model_card_name: self.model_card_name,
                model_card_version: self.model_card_version.unwrap_or_default(),
                created_at: self.created_at,
                last_modified_at: self.last_modified_at,
            }
        }
    }
}
impl ModelCardExportJobSummary {
    /// Creates a new builder-style object to manufacture [`ModelCardExportJobSummary`](crate::model::ModelCardExportJobSummary).
    pub fn builder() -> crate::model::model_card_export_job_summary::Builder {
        crate::model::model_card_export_job_summary::Builder::default()
    }
}

/// When writing a match expression against `ModelCardExportJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardexportjobstatus = unimplemented!();
/// match modelcardexportjobstatus {
///     ModelCardExportJobStatus::Completed => { /* ... */ },
///     ModelCardExportJobStatus::Failed => { /* ... */ },
///     ModelCardExportJobStatus::InProgress => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardexportjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardExportJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardExportJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardExportJobStatus::NewFeature` is defined.
/// Specifically, when `modelcardexportjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardExportJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardExportJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardExportJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => ModelCardExportJobStatus::Completed,
            "Failed" => ModelCardExportJobStatus::Failed,
            "InProgress" => ModelCardExportJobStatus::InProgress,
            other => ModelCardExportJobStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelCardExportJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardExportJobStatus::from(s))
    }
}
impl ModelCardExportJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardExportJobStatus::Completed => "Completed",
            ModelCardExportJobStatus::Failed => "Failed",
            ModelCardExportJobStatus::InProgress => "InProgress",
            ModelCardExportJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress"]
    }
}
impl AsRef<str> for ModelCardExportJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelCardExportJobSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardexportjobsortorder = unimplemented!();
/// match modelcardexportjobsortorder {
///     ModelCardExportJobSortOrder::Ascending => { /* ... */ },
///     ModelCardExportJobSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardexportjobsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardExportJobSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardExportJobSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardExportJobSortOrder::NewFeature` is defined.
/// Specifically, when `modelcardexportjobsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardExportJobSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardExportJobSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardExportJobSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => ModelCardExportJobSortOrder::Ascending,
            "Descending" => ModelCardExportJobSortOrder::Descending,
            other => ModelCardExportJobSortOrder::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelCardExportJobSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardExportJobSortOrder::from(s))
    }
}
impl ModelCardExportJobSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardExportJobSortOrder::Ascending => "Ascending",
            ModelCardExportJobSortOrder::Descending => "Descending",
            ModelCardExportJobSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for ModelCardExportJobSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ModelCardExportJobSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardexportjobsortby = unimplemented!();
/// match modelcardexportjobsortby {
///     ModelCardExportJobSortBy::CreationTime => { /* ... */ },
///     ModelCardExportJobSortBy::Name => { /* ... */ },
///     ModelCardExportJobSortBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardexportjobsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardExportJobSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardExportJobSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardExportJobSortBy::NewFeature` is defined.
/// Specifically, when `modelcardexportjobsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardExportJobSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
/// Attribute by which to sort returned export jobs.
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardExportJobSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardExportJobSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ModelCardExportJobSortBy::CreationTime,
            "Name" => ModelCardExportJobSortBy::Name,
            "Status" => ModelCardExportJobSortBy::Status,
            other => ModelCardExportJobSortBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelCardExportJobSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardExportJobSortBy::from(s))
    }
}
impl ModelCardExportJobSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardExportJobSortBy::CreationTime => "CreationTime",
            ModelCardExportJobSortBy::Name => "Name",
            ModelCardExportJobSortBy::Status => "Status",
            ModelCardExportJobSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for ModelCardExportJobSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Lists a summary of the properties of a lineage group. A lineage group provides a group of shareable lineage entity resources.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LineageGroupSummary {
    /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
    #[doc(hidden)]
    pub lineage_group_arn: std::option::Option<std::string::String>,
    /// <p>The name or Amazon Resource Name (ARN) of the lineage group.</p>
    #[doc(hidden)]
    pub lineage_group_name: std::option::Option<std::string::String>,
    /// <p>The display name of the lineage group summary.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The creation time of the lineage group summary.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last modified time of the lineage group summary.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl LineageGroupSummary {
    /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
    pub fn lineage_group_arn(&self) -> std::option::Option<&str> {
        self.lineage_group_arn.as_deref()
    }
    /// <p>The name or Amazon Resource Name (ARN) of the lineage group.</p>
    pub fn lineage_group_name(&self) -> std::option::Option<&str> {
        self.lineage_group_name.as_deref()
    }
    /// <p>The display name of the lineage group summary.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The creation time of the lineage group summary.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last modified time of the lineage group summary.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`LineageGroupSummary`](crate::model::LineageGroupSummary).
pub mod lineage_group_summary {

    /// A builder for [`LineageGroupSummary`](crate::model::LineageGroupSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) lineage_group_arn: std::option::Option<std::string::String>,
        pub(crate) lineage_group_name: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
        pub fn lineage_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.lineage_group_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the lineage group resource.</p>
        pub fn set_lineage_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.lineage_group_arn = input;
            self
        }
        /// <p>The name or Amazon Resource Name (ARN) of the lineage group.</p>
        pub fn lineage_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.lineage_group_name = Some(input.into());
            self
        }
        /// <p>The name or Amazon Resource Name (ARN) of the lineage group.</p>
        pub fn set_lineage_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.lineage_group_name = input;
            self
        }
        /// <p>The display name of the lineage group summary.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The display name of the lineage group summary.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The creation time of the lineage group summary.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the lineage group summary.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last modified time of the lineage group summary.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last modified time of the lineage group summary.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`LineageGroupSummary`](crate::model::LineageGroupSummary).
        pub fn build(self) -> crate::model::LineageGroupSummary {
            crate::model::LineageGroupSummary {
                lineage_group_arn: self.lineage_group_arn,
                lineage_group_name: self.lineage_group_name,
                display_name: self.display_name,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl LineageGroupSummary {
    /// Creates a new builder-style object to manufacture [`LineageGroupSummary`](crate::model::LineageGroupSummary).
    pub fn builder() -> crate::model::lineage_group_summary::Builder {
        crate::model::lineage_group_summary::Builder::default()
    }
}

/// When writing a match expression against `SortLineageGroupsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortlineagegroupsby = unimplemented!();
/// match sortlineagegroupsby {
///     SortLineageGroupsBy::CreationTime => { /* ... */ },
///     SortLineageGroupsBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortlineagegroupsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortLineageGroupsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortLineageGroupsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortLineageGroupsBy::NewFeature` is defined.
/// Specifically, when `sortlineagegroupsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortLineageGroupsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortLineageGroupsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortLineageGroupsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortLineageGroupsBy::CreationTime,
            "Name" => SortLineageGroupsBy::Name,
            other => {
                SortLineageGroupsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for SortLineageGroupsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortLineageGroupsBy::from(s))
    }
}
impl SortLineageGroupsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortLineageGroupsBy::CreationTime => "CreationTime",
            SortLineageGroupsBy::Name => "Name",
            SortLineageGroupsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortLineageGroupsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information for a work team.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobForWorkteamSummary {
    /// <p>The name of the labeling job that the work team is assigned to.</p>
    #[doc(hidden)]
    pub labeling_job_name: std::option::Option<std::string::String>,
    /// <p>A unique identifier for a labeling job. You can use this to refer to a specific labeling job.</p>
    #[doc(hidden)]
    pub job_reference_code: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services account ID of the account used to start the labeling job.</p>
    #[doc(hidden)]
    pub work_requester_account_id: std::option::Option<std::string::String>,
    /// <p>The date and time that the labeling job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Provides information about the progress of a labeling job.</p>
    #[doc(hidden)]
    pub label_counters: std::option::Option<crate::model::LabelCountersForWorkteam>,
    /// <p>The configured number of workers per data object.</p>
    #[doc(hidden)]
    pub number_of_human_workers_per_data_object: std::option::Option<i32>,
}
impl LabelingJobForWorkteamSummary {
    /// <p>The name of the labeling job that the work team is assigned to.</p>
    pub fn labeling_job_name(&self) -> std::option::Option<&str> {
        self.labeling_job_name.as_deref()
    }
    /// <p>A unique identifier for a labeling job. You can use this to refer to a specific labeling job.</p>
    pub fn job_reference_code(&self) -> std::option::Option<&str> {
        self.job_reference_code.as_deref()
    }
    /// <p>The Amazon Web Services account ID of the account used to start the labeling job.</p>
    pub fn work_requester_account_id(&self) -> std::option::Option<&str> {
        self.work_requester_account_id.as_deref()
    }
    /// <p>The date and time that the labeling job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Provides information about the progress of a labeling job.</p>
    pub fn label_counters(&self) -> std::option::Option<&crate::model::LabelCountersForWorkteam> {
        self.label_counters.as_ref()
    }
    /// <p>The configured number of workers per data object.</p>
    pub fn number_of_human_workers_per_data_object(&self) -> std::option::Option<i32> {
        self.number_of_human_workers_per_data_object
    }
}
/// See [`LabelingJobForWorkteamSummary`](crate::model::LabelingJobForWorkteamSummary).
pub mod labeling_job_for_workteam_summary {

    /// A builder for [`LabelingJobForWorkteamSummary`](crate::model::LabelingJobForWorkteamSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) labeling_job_name: std::option::Option<std::string::String>,
        pub(crate) job_reference_code: std::option::Option<std::string::String>,
        pub(crate) work_requester_account_id: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) label_counters: std::option::Option<crate::model::LabelCountersForWorkteam>,
        pub(crate) number_of_human_workers_per_data_object: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The name of the labeling job that the work team is assigned to.</p>
        pub fn labeling_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.labeling_job_name = Some(input.into());
            self
        }
        /// <p>The name of the labeling job that the work team is assigned to.</p>
        pub fn set_labeling_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.labeling_job_name = input;
            self
        }
        /// <p>A unique identifier for a labeling job. You can use this to refer to a specific labeling job.</p>
        pub fn job_reference_code(mut self, input: impl Into<std::string::String>) -> Self {
            self.job_reference_code = Some(input.into());
            self
        }
        /// <p>A unique identifier for a labeling job. You can use this to refer to a specific labeling job.</p>
        pub fn set_job_reference_code(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.job_reference_code = input;
            self
        }
        /// <p>The Amazon Web Services account ID of the account used to start the labeling job.</p>
        pub fn work_requester_account_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.work_requester_account_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services account ID of the account used to start the labeling job.</p>
        pub fn set_work_requester_account_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.work_requester_account_id = input;
            self
        }
        /// <p>The date and time that the labeling job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the labeling job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Provides information about the progress of a labeling job.</p>
        pub fn label_counters(mut self, input: crate::model::LabelCountersForWorkteam) -> Self {
            self.label_counters = Some(input);
            self
        }
        /// <p>Provides information about the progress of a labeling job.</p>
        pub fn set_label_counters(
            mut self,
            input: std::option::Option<crate::model::LabelCountersForWorkteam>,
        ) -> Self {
            self.label_counters = input;
            self
        }
        /// <p>The configured number of workers per data object.</p>
        pub fn number_of_human_workers_per_data_object(mut self, input: i32) -> Self {
            self.number_of_human_workers_per_data_object = Some(input);
            self
        }
        /// <p>The configured number of workers per data object.</p>
        pub fn set_number_of_human_workers_per_data_object(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.number_of_human_workers_per_data_object = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobForWorkteamSummary`](crate::model::LabelingJobForWorkteamSummary).
        pub fn build(self) -> crate::model::LabelingJobForWorkteamSummary {
            crate::model::LabelingJobForWorkteamSummary {
                labeling_job_name: self.labeling_job_name,
                job_reference_code: self.job_reference_code,
                work_requester_account_id: self.work_requester_account_id,
                creation_time: self.creation_time,
                label_counters: self.label_counters,
                number_of_human_workers_per_data_object: self
                    .number_of_human_workers_per_data_object,
            }
        }
    }
}
impl LabelingJobForWorkteamSummary {
    /// Creates a new builder-style object to manufacture [`LabelingJobForWorkteamSummary`](crate::model::LabelingJobForWorkteamSummary).
    pub fn builder() -> crate::model::labeling_job_for_workteam_summary::Builder {
        crate::model::labeling_job_for_workteam_summary::Builder::default()
    }
}

/// <p>Provides counts for human-labeled tasks in the labeling job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelCountersForWorkteam {
    /// <p>The total number of data objects labeled by a human worker.</p>
    #[doc(hidden)]
    pub human_labeled: i32,
    /// <p>The total number of data objects that need to be labeled by a human worker.</p>
    #[doc(hidden)]
    pub pending_human: i32,
    /// <p>The total number of tasks in the labeling job.</p>
    #[doc(hidden)]
    pub total: i32,
}
impl LabelCountersForWorkteam {
    /// <p>The total number of data objects labeled by a human worker.</p>
    pub fn human_labeled(&self) -> i32 {
        self.human_labeled
    }
    /// <p>The total number of data objects that need to be labeled by a human worker.</p>
    pub fn pending_human(&self) -> i32 {
        self.pending_human
    }
    /// <p>The total number of tasks in the labeling job.</p>
    pub fn total(&self) -> i32 {
        self.total
    }
}
/// See [`LabelCountersForWorkteam`](crate::model::LabelCountersForWorkteam).
pub mod label_counters_for_workteam {

    /// A builder for [`LabelCountersForWorkteam`](crate::model::LabelCountersForWorkteam).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) human_labeled: std::option::Option<i32>,
        pub(crate) pending_human: std::option::Option<i32>,
        pub(crate) total: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The total number of data objects labeled by a human worker.</p>
        pub fn human_labeled(mut self, input: i32) -> Self {
            self.human_labeled = Some(input);
            self
        }
        /// <p>The total number of data objects labeled by a human worker.</p>
        pub fn set_human_labeled(mut self, input: std::option::Option<i32>) -> Self {
            self.human_labeled = input;
            self
        }
        /// <p>The total number of data objects that need to be labeled by a human worker.</p>
        pub fn pending_human(mut self, input: i32) -> Self {
            self.pending_human = Some(input);
            self
        }
        /// <p>The total number of data objects that need to be labeled by a human worker.</p>
        pub fn set_pending_human(mut self, input: std::option::Option<i32>) -> Self {
            self.pending_human = input;
            self
        }
        /// <p>The total number of tasks in the labeling job.</p>
        pub fn total(mut self, input: i32) -> Self {
            self.total = Some(input);
            self
        }
        /// <p>The total number of tasks in the labeling job.</p>
        pub fn set_total(mut self, input: std::option::Option<i32>) -> Self {
            self.total = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelCountersForWorkteam`](crate::model::LabelCountersForWorkteam).
        pub fn build(self) -> crate::model::LabelCountersForWorkteam {
            crate::model::LabelCountersForWorkteam {
                human_labeled: self.human_labeled.unwrap_or_default(),
                pending_human: self.pending_human.unwrap_or_default(),
                total: self.total.unwrap_or_default(),
            }
        }
    }
}
impl LabelCountersForWorkteam {
    /// Creates a new builder-style object to manufacture [`LabelCountersForWorkteam`](crate::model::LabelCountersForWorkteam).
    pub fn builder() -> crate::model::label_counters_for_workteam::Builder {
        crate::model::label_counters_for_workteam::Builder::default()
    }
}

/// When writing a match expression against `ListLabelingJobsForWorkteamSortByOptions`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listlabelingjobsforworkteamsortbyoptions = unimplemented!();
/// match listlabelingjobsforworkteamsortbyoptions {
///     ListLabelingJobsForWorkteamSortByOptions::CreationTime => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listlabelingjobsforworkteamsortbyoptions` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListLabelingJobsForWorkteamSortByOptions::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListLabelingJobsForWorkteamSortByOptions::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListLabelingJobsForWorkteamSortByOptions::NewFeature` is defined.
/// Specifically, when `listlabelingjobsforworkteamsortbyoptions` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListLabelingJobsForWorkteamSortByOptions::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListLabelingJobsForWorkteamSortByOptions {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListLabelingJobsForWorkteamSortByOptions {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ListLabelingJobsForWorkteamSortByOptions::CreationTime,
            other => ListLabelingJobsForWorkteamSortByOptions::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for ListLabelingJobsForWorkteamSortByOptions {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListLabelingJobsForWorkteamSortByOptions::from(s))
    }
}
impl ListLabelingJobsForWorkteamSortByOptions {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListLabelingJobsForWorkteamSortByOptions::CreationTime => "CreationTime",
            ListLabelingJobsForWorkteamSortByOptions::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime"]
    }
}
impl AsRef<str> for ListLabelingJobsForWorkteamSortByOptions {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about a labeling job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobSummary {
    /// <p>The name of the labeling job.</p>
    #[doc(hidden)]
    pub labeling_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) assigned to the labeling job when it was created.</p>
    #[doc(hidden)]
    pub labeling_job_arn: std::option::Option<std::string::String>,
    /// <p>The date and time that the job was created (timestamp).</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the job was last modified (timestamp).</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The current status of the labeling job. </p>
    #[doc(hidden)]
    pub labeling_job_status: std::option::Option<crate::model::LabelingJobStatus>,
    /// <p>Counts showing the progress of the labeling job.</p>
    #[doc(hidden)]
    pub label_counters: std::option::Option<crate::model::LabelCounters>,
    /// <p>The Amazon Resource Name (ARN) of the work team assigned to the job.</p>
    #[doc(hidden)]
    pub workteam_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of a Lambda function. The function is run before each data object is sent to a worker.</p>
    #[doc(hidden)]
    pub pre_human_task_lambda_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the Lambda function used to consolidate the annotations from individual workers into a label for a data object. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">Annotation Consolidation</a>.</p>
    #[doc(hidden)]
    pub annotation_consolidation_lambda_arn: std::option::Option<std::string::String>,
    /// <p>If the <code>LabelingJobStatus</code> field is <code>Failed</code>, this field contains a description of the error.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The location of the output produced by the labeling job.</p>
    #[doc(hidden)]
    pub labeling_job_output: std::option::Option<crate::model::LabelingJobOutput>,
    /// <p>Input configuration for the labeling job.</p>
    #[doc(hidden)]
    pub input_config: std::option::Option<crate::model::LabelingJobInputConfig>,
}
impl LabelingJobSummary {
    /// <p>The name of the labeling job.</p>
    pub fn labeling_job_name(&self) -> std::option::Option<&str> {
        self.labeling_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) assigned to the labeling job when it was created.</p>
    pub fn labeling_job_arn(&self) -> std::option::Option<&str> {
        self.labeling_job_arn.as_deref()
    }
    /// <p>The date and time that the job was created (timestamp).</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The date and time that the job was last modified (timestamp).</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The current status of the labeling job. </p>
    pub fn labeling_job_status(&self) -> std::option::Option<&crate::model::LabelingJobStatus> {
        self.labeling_job_status.as_ref()
    }
    /// <p>Counts showing the progress of the labeling job.</p>
    pub fn label_counters(&self) -> std::option::Option<&crate::model::LabelCounters> {
        self.label_counters.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the work team assigned to the job.</p>
    pub fn workteam_arn(&self) -> std::option::Option<&str> {
        self.workteam_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of a Lambda function. The function is run before each data object is sent to a worker.</p>
    pub fn pre_human_task_lambda_arn(&self) -> std::option::Option<&str> {
        self.pre_human_task_lambda_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the Lambda function used to consolidate the annotations from individual workers into a label for a data object. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">Annotation Consolidation</a>.</p>
    pub fn annotation_consolidation_lambda_arn(&self) -> std::option::Option<&str> {
        self.annotation_consolidation_lambda_arn.as_deref()
    }
    /// <p>If the <code>LabelingJobStatus</code> field is <code>Failed</code>, this field contains a description of the error.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The location of the output produced by the labeling job.</p>
    pub fn labeling_job_output(&self) -> std::option::Option<&crate::model::LabelingJobOutput> {
        self.labeling_job_output.as_ref()
    }
    /// <p>Input configuration for the labeling job.</p>
    pub fn input_config(&self) -> std::option::Option<&crate::model::LabelingJobInputConfig> {
        self.input_config.as_ref()
    }
}
/// See [`LabelingJobSummary`](crate::model::LabelingJobSummary).
pub mod labeling_job_summary {

    /// A builder for [`LabelingJobSummary`](crate::model::LabelingJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) labeling_job_name: std::option::Option<std::string::String>,
        pub(crate) labeling_job_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) labeling_job_status: std::option::Option<crate::model::LabelingJobStatus>,
        pub(crate) label_counters: std::option::Option<crate::model::LabelCounters>,
        pub(crate) workteam_arn: std::option::Option<std::string::String>,
        pub(crate) pre_human_task_lambda_arn: std::option::Option<std::string::String>,
        pub(crate) annotation_consolidation_lambda_arn: std::option::Option<std::string::String>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) labeling_job_output: std::option::Option<crate::model::LabelingJobOutput>,
        pub(crate) input_config: std::option::Option<crate::model::LabelingJobInputConfig>,
    }
    impl Builder {
        /// <p>The name of the labeling job.</p>
        pub fn labeling_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.labeling_job_name = Some(input.into());
            self
        }
        /// <p>The name of the labeling job.</p>
        pub fn set_labeling_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.labeling_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) assigned to the labeling job when it was created.</p>
        pub fn labeling_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.labeling_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) assigned to the labeling job when it was created.</p>
        pub fn set_labeling_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.labeling_job_arn = input;
            self
        }
        /// <p>The date and time that the job was created (timestamp).</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the job was created (timestamp).</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The date and time that the job was last modified (timestamp).</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The date and time that the job was last modified (timestamp).</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The current status of the labeling job. </p>
        pub fn labeling_job_status(mut self, input: crate::model::LabelingJobStatus) -> Self {
            self.labeling_job_status = Some(input);
            self
        }
        /// <p>The current status of the labeling job. </p>
        pub fn set_labeling_job_status(
            mut self,
            input: std::option::Option<crate::model::LabelingJobStatus>,
        ) -> Self {
            self.labeling_job_status = input;
            self
        }
        /// <p>Counts showing the progress of the labeling job.</p>
        pub fn label_counters(mut self, input: crate::model::LabelCounters) -> Self {
            self.label_counters = Some(input);
            self
        }
        /// <p>Counts showing the progress of the labeling job.</p>
        pub fn set_label_counters(
            mut self,
            input: std::option::Option<crate::model::LabelCounters>,
        ) -> Self {
            self.label_counters = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the work team assigned to the job.</p>
        pub fn workteam_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workteam_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the work team assigned to the job.</p>
        pub fn set_workteam_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.workteam_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Lambda function. The function is run before each data object is sent to a worker.</p>
        pub fn pre_human_task_lambda_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pre_human_task_lambda_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Lambda function. The function is run before each data object is sent to a worker.</p>
        pub fn set_pre_human_task_lambda_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pre_human_task_lambda_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Lambda function used to consolidate the annotations from individual workers into a label for a data object. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">Annotation Consolidation</a>.</p>
        pub fn annotation_consolidation_lambda_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.annotation_consolidation_lambda_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Lambda function used to consolidate the annotations from individual workers into a label for a data object. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">Annotation Consolidation</a>.</p>
        pub fn set_annotation_consolidation_lambda_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.annotation_consolidation_lambda_arn = input;
            self
        }
        /// <p>If the <code>LabelingJobStatus</code> field is <code>Failed</code>, this field contains a description of the error.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the <code>LabelingJobStatus</code> field is <code>Failed</code>, this field contains a description of the error.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The location of the output produced by the labeling job.</p>
        pub fn labeling_job_output(mut self, input: crate::model::LabelingJobOutput) -> Self {
            self.labeling_job_output = Some(input);
            self
        }
        /// <p>The location of the output produced by the labeling job.</p>
        pub fn set_labeling_job_output(
            mut self,
            input: std::option::Option<crate::model::LabelingJobOutput>,
        ) -> Self {
            self.labeling_job_output = input;
            self
        }
        /// <p>Input configuration for the labeling job.</p>
        pub fn input_config(mut self, input: crate::model::LabelingJobInputConfig) -> Self {
            self.input_config = Some(input);
            self
        }
        /// <p>Input configuration for the labeling job.</p>
        pub fn set_input_config(
            mut self,
            input: std::option::Option<crate::model::LabelingJobInputConfig>,
        ) -> Self {
            self.input_config = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobSummary`](crate::model::LabelingJobSummary).
        pub fn build(self) -> crate::model::LabelingJobSummary {
            crate::model::LabelingJobSummary {
                labeling_job_name: self.labeling_job_name,
                labeling_job_arn: self.labeling_job_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                labeling_job_status: self.labeling_job_status,
                label_counters: self.label_counters,
                workteam_arn: self.workteam_arn,
                pre_human_task_lambda_arn: self.pre_human_task_lambda_arn,
                annotation_consolidation_lambda_arn: self.annotation_consolidation_lambda_arn,
                failure_reason: self.failure_reason,
                labeling_job_output: self.labeling_job_output,
                input_config: self.input_config,
            }
        }
    }
}
impl LabelingJobSummary {
    /// Creates a new builder-style object to manufacture [`LabelingJobSummary`](crate::model::LabelingJobSummary).
    pub fn builder() -> crate::model::labeling_job_summary::Builder {
        crate::model::labeling_job_summary::Builder::default()
    }
}

/// <p>Input configuration information for a labeling job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobInputConfig {
    /// <p>The location of the input data.</p>
    #[doc(hidden)]
    pub data_source: std::option::Option<crate::model::LabelingJobDataSource>,
    /// <p>Attributes of the data specified by the customer.</p>
    #[doc(hidden)]
    pub data_attributes: std::option::Option<crate::model::LabelingJobDataAttributes>,
}
impl LabelingJobInputConfig {
    /// <p>The location of the input data.</p>
    pub fn data_source(&self) -> std::option::Option<&crate::model::LabelingJobDataSource> {
        self.data_source.as_ref()
    }
    /// <p>Attributes of the data specified by the customer.</p>
    pub fn data_attributes(&self) -> std::option::Option<&crate::model::LabelingJobDataAttributes> {
        self.data_attributes.as_ref()
    }
}
/// See [`LabelingJobInputConfig`](crate::model::LabelingJobInputConfig).
pub mod labeling_job_input_config {

    /// A builder for [`LabelingJobInputConfig`](crate::model::LabelingJobInputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) data_source: std::option::Option<crate::model::LabelingJobDataSource>,
        pub(crate) data_attributes: std::option::Option<crate::model::LabelingJobDataAttributes>,
    }
    impl Builder {
        /// <p>The location of the input data.</p>
        pub fn data_source(mut self, input: crate::model::LabelingJobDataSource) -> Self {
            self.data_source = Some(input);
            self
        }
        /// <p>The location of the input data.</p>
        pub fn set_data_source(
            mut self,
            input: std::option::Option<crate::model::LabelingJobDataSource>,
        ) -> Self {
            self.data_source = input;
            self
        }
        /// <p>Attributes of the data specified by the customer.</p>
        pub fn data_attributes(mut self, input: crate::model::LabelingJobDataAttributes) -> Self {
            self.data_attributes = Some(input);
            self
        }
        /// <p>Attributes of the data specified by the customer.</p>
        pub fn set_data_attributes(
            mut self,
            input: std::option::Option<crate::model::LabelingJobDataAttributes>,
        ) -> Self {
            self.data_attributes = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobInputConfig`](crate::model::LabelingJobInputConfig).
        pub fn build(self) -> crate::model::LabelingJobInputConfig {
            crate::model::LabelingJobInputConfig {
                data_source: self.data_source,
                data_attributes: self.data_attributes,
            }
        }
    }
}
impl LabelingJobInputConfig {
    /// Creates a new builder-style object to manufacture [`LabelingJobInputConfig`](crate::model::LabelingJobInputConfig).
    pub fn builder() -> crate::model::labeling_job_input_config::Builder {
        crate::model::labeling_job_input_config::Builder::default()
    }
}

/// <p>Attributes of the data specified by the customer. Use these to describe the data to be labeled.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobDataAttributes {
    /// <p>Declares that your content is free of personally identifiable information or adult content. SageMaker may restrict the Amazon Mechanical Turk workers that can view your task based on this information.</p>
    #[doc(hidden)]
    pub content_classifiers: std::option::Option<std::vec::Vec<crate::model::ContentClassifier>>,
}
impl LabelingJobDataAttributes {
    /// <p>Declares that your content is free of personally identifiable information or adult content. SageMaker may restrict the Amazon Mechanical Turk workers that can view your task based on this information.</p>
    pub fn content_classifiers(&self) -> std::option::Option<&[crate::model::ContentClassifier]> {
        self.content_classifiers.as_deref()
    }
}
/// See [`LabelingJobDataAttributes`](crate::model::LabelingJobDataAttributes).
pub mod labeling_job_data_attributes {

    /// A builder for [`LabelingJobDataAttributes`](crate::model::LabelingJobDataAttributes).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) content_classifiers:
            std::option::Option<std::vec::Vec<crate::model::ContentClassifier>>,
    }
    impl Builder {
        /// Appends an item to `content_classifiers`.
        ///
        /// To override the contents of this collection use [`set_content_classifiers`](Self::set_content_classifiers).
        ///
        /// <p>Declares that your content is free of personally identifiable information or adult content. SageMaker may restrict the Amazon Mechanical Turk workers that can view your task based on this information.</p>
        pub fn content_classifiers(mut self, input: crate::model::ContentClassifier) -> Self {
            let mut v = self.content_classifiers.unwrap_or_default();
            v.push(input);
            self.content_classifiers = Some(v);
            self
        }
        /// <p>Declares that your content is free of personally identifiable information or adult content. SageMaker may restrict the Amazon Mechanical Turk workers that can view your task based on this information.</p>
        pub fn set_content_classifiers(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ContentClassifier>>,
        ) -> Self {
            self.content_classifiers = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobDataAttributes`](crate::model::LabelingJobDataAttributes).
        pub fn build(self) -> crate::model::LabelingJobDataAttributes {
            crate::model::LabelingJobDataAttributes {
                content_classifiers: self.content_classifiers,
            }
        }
    }
}
impl LabelingJobDataAttributes {
    /// Creates a new builder-style object to manufacture [`LabelingJobDataAttributes`](crate::model::LabelingJobDataAttributes).
    pub fn builder() -> crate::model::labeling_job_data_attributes::Builder {
        crate::model::labeling_job_data_attributes::Builder::default()
    }
}

/// When writing a match expression against `ContentClassifier`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let contentclassifier = unimplemented!();
/// match contentclassifier {
///     ContentClassifier::FreeOfAdultContent => { /* ... */ },
///     ContentClassifier::FreeOfPersonallyIdentifiableInformation => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `contentclassifier` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ContentClassifier::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ContentClassifier::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ContentClassifier::NewFeature` is defined.
/// Specifically, when `contentclassifier` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ContentClassifier::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ContentClassifier {
    #[allow(missing_docs)] // documentation missing in model
    FreeOfAdultContent,
    #[allow(missing_docs)] // documentation missing in model
    FreeOfPersonallyIdentifiableInformation,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ContentClassifier {
    fn from(s: &str) -> Self {
        match s {
            "FreeOfAdultContent" => ContentClassifier::FreeOfAdultContent,
            "FreeOfPersonallyIdentifiableInformation" => {
                ContentClassifier::FreeOfPersonallyIdentifiableInformation
            }
            other => {
                ContentClassifier::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ContentClassifier {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ContentClassifier::from(s))
    }
}
impl ContentClassifier {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ContentClassifier::FreeOfAdultContent => "FreeOfAdultContent",
            ContentClassifier::FreeOfPersonallyIdentifiableInformation => {
                "FreeOfPersonallyIdentifiableInformation"
            }
            ContentClassifier::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "FreeOfAdultContent",
            "FreeOfPersonallyIdentifiableInformation",
        ]
    }
}
impl AsRef<str> for ContentClassifier {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides information about the location of input data.</p>
/// <p>You must specify at least one of the following: <code>S3DataSource</code> or <code>SnsDataSource</code>.</p>
/// <p>Use <code>SnsDataSource</code> to specify an SNS input topic for a streaming labeling job. If you do not specify and SNS input topic ARN, Ground Truth will create a one-time labeling job.</p>
/// <p>Use <code>S3DataSource</code> to specify an input manifest file for both streaming and one-time labeling jobs. Adding an <code>S3DataSource</code> is optional if you use <code>SnsDataSource</code> to create a streaming labeling job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobDataSource {
    /// <p>The Amazon S3 location of the input data objects.</p>
    #[doc(hidden)]
    pub s3_data_source: std::option::Option<crate::model::LabelingJobS3DataSource>,
    /// <p>An Amazon SNS data source used for streaming labeling jobs. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-send-data">Send Data to a Streaming Labeling Job</a>. </p>
    #[doc(hidden)]
    pub sns_data_source: std::option::Option<crate::model::LabelingJobSnsDataSource>,
}
impl LabelingJobDataSource {
    /// <p>The Amazon S3 location of the input data objects.</p>
    pub fn s3_data_source(&self) -> std::option::Option<&crate::model::LabelingJobS3DataSource> {
        self.s3_data_source.as_ref()
    }
    /// <p>An Amazon SNS data source used for streaming labeling jobs. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-send-data">Send Data to a Streaming Labeling Job</a>. </p>
    pub fn sns_data_source(&self) -> std::option::Option<&crate::model::LabelingJobSnsDataSource> {
        self.sns_data_source.as_ref()
    }
}
/// See [`LabelingJobDataSource`](crate::model::LabelingJobDataSource).
pub mod labeling_job_data_source {

    /// A builder for [`LabelingJobDataSource`](crate::model::LabelingJobDataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_source: std::option::Option<crate::model::LabelingJobS3DataSource>,
        pub(crate) sns_data_source: std::option::Option<crate::model::LabelingJobSnsDataSource>,
    }
    impl Builder {
        /// <p>The Amazon S3 location of the input data objects.</p>
        pub fn s3_data_source(mut self, input: crate::model::LabelingJobS3DataSource) -> Self {
            self.s3_data_source = Some(input);
            self
        }
        /// <p>The Amazon S3 location of the input data objects.</p>
        pub fn set_s3_data_source(
            mut self,
            input: std::option::Option<crate::model::LabelingJobS3DataSource>,
        ) -> Self {
            self.s3_data_source = input;
            self
        }
        /// <p>An Amazon SNS data source used for streaming labeling jobs. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-send-data">Send Data to a Streaming Labeling Job</a>. </p>
        pub fn sns_data_source(mut self, input: crate::model::LabelingJobSnsDataSource) -> Self {
            self.sns_data_source = Some(input);
            self
        }
        /// <p>An Amazon SNS data source used for streaming labeling jobs. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-send-data">Send Data to a Streaming Labeling Job</a>. </p>
        pub fn set_sns_data_source(
            mut self,
            input: std::option::Option<crate::model::LabelingJobSnsDataSource>,
        ) -> Self {
            self.sns_data_source = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobDataSource`](crate::model::LabelingJobDataSource).
        pub fn build(self) -> crate::model::LabelingJobDataSource {
            crate::model::LabelingJobDataSource {
                s3_data_source: self.s3_data_source,
                sns_data_source: self.sns_data_source,
            }
        }
    }
}
impl LabelingJobDataSource {
    /// Creates a new builder-style object to manufacture [`LabelingJobDataSource`](crate::model::LabelingJobDataSource).
    pub fn builder() -> crate::model::labeling_job_data_source::Builder {
        crate::model::labeling_job_data_source::Builder::default()
    }
}

/// <p>An Amazon SNS data source used for streaming labeling jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobSnsDataSource {
    /// <p>The Amazon SNS input topic Amazon Resource Name (ARN). Specify the ARN of the input topic you will use to send new data objects to a streaming labeling job.</p>
    #[doc(hidden)]
    pub sns_topic_arn: std::option::Option<std::string::String>,
}
impl LabelingJobSnsDataSource {
    /// <p>The Amazon SNS input topic Amazon Resource Name (ARN). Specify the ARN of the input topic you will use to send new data objects to a streaming labeling job.</p>
    pub fn sns_topic_arn(&self) -> std::option::Option<&str> {
        self.sns_topic_arn.as_deref()
    }
}
/// See [`LabelingJobSnsDataSource`](crate::model::LabelingJobSnsDataSource).
pub mod labeling_job_sns_data_source {

    /// A builder for [`LabelingJobSnsDataSource`](crate::model::LabelingJobSnsDataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) sns_topic_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon SNS input topic Amazon Resource Name (ARN). Specify the ARN of the input topic you will use to send new data objects to a streaming labeling job.</p>
        pub fn sns_topic_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.sns_topic_arn = Some(input.into());
            self
        }
        /// <p>The Amazon SNS input topic Amazon Resource Name (ARN). Specify the ARN of the input topic you will use to send new data objects to a streaming labeling job.</p>
        pub fn set_sns_topic_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sns_topic_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobSnsDataSource`](crate::model::LabelingJobSnsDataSource).
        pub fn build(self) -> crate::model::LabelingJobSnsDataSource {
            crate::model::LabelingJobSnsDataSource {
                sns_topic_arn: self.sns_topic_arn,
            }
        }
    }
}
impl LabelingJobSnsDataSource {
    /// Creates a new builder-style object to manufacture [`LabelingJobSnsDataSource`](crate::model::LabelingJobSnsDataSource).
    pub fn builder() -> crate::model::labeling_job_sns_data_source::Builder {
        crate::model::labeling_job_sns_data_source::Builder::default()
    }
}

/// <p>The Amazon S3 location of the input data objects.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobS3DataSource {
    /// <p>The Amazon S3 location of the manifest file that describes the input data objects. </p>
    /// <p>The input manifest file referenced in <code>ManifestS3Uri</code> must contain one of the following keys: <code>source-ref</code> or <code>source</code>. The value of the keys are interpreted as follows:</p>
    /// <ul>
    /// <li> <p> <code>source-ref</code>: The source of the object is the Amazon S3 object specified in the value. Use this value when the object is a binary object, such as an image.</p> </li>
    /// <li> <p> <code>source</code>: The source of the object is the value. Use this value when the object is a text value.</p> </li>
    /// </ul>
    /// <p>If you are a new user of Ground Truth, it is recommended you review <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-input-data-input-manifest.html">Use an Input Manifest File </a> in the Amazon SageMaker Developer Guide to learn how to create an input manifest file.</p>
    #[doc(hidden)]
    pub manifest_s3_uri: std::option::Option<std::string::String>,
}
impl LabelingJobS3DataSource {
    /// <p>The Amazon S3 location of the manifest file that describes the input data objects. </p>
    /// <p>The input manifest file referenced in <code>ManifestS3Uri</code> must contain one of the following keys: <code>source-ref</code> or <code>source</code>. The value of the keys are interpreted as follows:</p>
    /// <ul>
    /// <li> <p> <code>source-ref</code>: The source of the object is the Amazon S3 object specified in the value. Use this value when the object is a binary object, such as an image.</p> </li>
    /// <li> <p> <code>source</code>: The source of the object is the value. Use this value when the object is a text value.</p> </li>
    /// </ul>
    /// <p>If you are a new user of Ground Truth, it is recommended you review <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-input-data-input-manifest.html">Use an Input Manifest File </a> in the Amazon SageMaker Developer Guide to learn how to create an input manifest file.</p>
    pub fn manifest_s3_uri(&self) -> std::option::Option<&str> {
        self.manifest_s3_uri.as_deref()
    }
}
/// See [`LabelingJobS3DataSource`](crate::model::LabelingJobS3DataSource).
pub mod labeling_job_s3_data_source {

    /// A builder for [`LabelingJobS3DataSource`](crate::model::LabelingJobS3DataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) manifest_s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 location of the manifest file that describes the input data objects. </p>
        /// <p>The input manifest file referenced in <code>ManifestS3Uri</code> must contain one of the following keys: <code>source-ref</code> or <code>source</code>. The value of the keys are interpreted as follows:</p>
        /// <ul>
        /// <li> <p> <code>source-ref</code>: The source of the object is the Amazon S3 object specified in the value. Use this value when the object is a binary object, such as an image.</p> </li>
        /// <li> <p> <code>source</code>: The source of the object is the value. Use this value when the object is a text value.</p> </li>
        /// </ul>
        /// <p>If you are a new user of Ground Truth, it is recommended you review <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-input-data-input-manifest.html">Use an Input Manifest File </a> in the Amazon SageMaker Developer Guide to learn how to create an input manifest file.</p>
        pub fn manifest_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.manifest_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location of the manifest file that describes the input data objects. </p>
        /// <p>The input manifest file referenced in <code>ManifestS3Uri</code> must contain one of the following keys: <code>source-ref</code> or <code>source</code>. The value of the keys are interpreted as follows:</p>
        /// <ul>
        /// <li> <p> <code>source-ref</code>: The source of the object is the Amazon S3 object specified in the value. Use this value when the object is a binary object, such as an image.</p> </li>
        /// <li> <p> <code>source</code>: The source of the object is the value. Use this value when the object is a text value.</p> </li>
        /// </ul>
        /// <p>If you are a new user of Ground Truth, it is recommended you review <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-input-data-input-manifest.html">Use an Input Manifest File </a> in the Amazon SageMaker Developer Guide to learn how to create an input manifest file.</p>
        pub fn set_manifest_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.manifest_s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobS3DataSource`](crate::model::LabelingJobS3DataSource).
        pub fn build(self) -> crate::model::LabelingJobS3DataSource {
            crate::model::LabelingJobS3DataSource {
                manifest_s3_uri: self.manifest_s3_uri,
            }
        }
    }
}
impl LabelingJobS3DataSource {
    /// Creates a new builder-style object to manufacture [`LabelingJobS3DataSource`](crate::model::LabelingJobS3DataSource).
    pub fn builder() -> crate::model::labeling_job_s3_data_source::Builder {
        crate::model::labeling_job_s3_data_source::Builder::default()
    }
}

/// <p>Specifies the location of the output produced by the labeling job. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobOutput {
    /// <p>The Amazon S3 bucket location of the manifest file for labeled data. </p>
    #[doc(hidden)]
    pub output_dataset_s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) for the most recent SageMaker model trained as part of automated data labeling. </p>
    #[doc(hidden)]
    pub final_active_learning_model_arn: std::option::Option<std::string::String>,
}
impl LabelingJobOutput {
    /// <p>The Amazon S3 bucket location of the manifest file for labeled data. </p>
    pub fn output_dataset_s3_uri(&self) -> std::option::Option<&str> {
        self.output_dataset_s3_uri.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) for the most recent SageMaker model trained as part of automated data labeling. </p>
    pub fn final_active_learning_model_arn(&self) -> std::option::Option<&str> {
        self.final_active_learning_model_arn.as_deref()
    }
}
/// See [`LabelingJobOutput`](crate::model::LabelingJobOutput).
pub mod labeling_job_output {

    /// A builder for [`LabelingJobOutput`](crate::model::LabelingJobOutput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) output_dataset_s3_uri: std::option::Option<std::string::String>,
        pub(crate) final_active_learning_model_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 bucket location of the manifest file for labeled data. </p>
        pub fn output_dataset_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.output_dataset_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 bucket location of the manifest file for labeled data. </p>
        pub fn set_output_dataset_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.output_dataset_s3_uri = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) for the most recent SageMaker model trained as part of automated data labeling. </p>
        pub fn final_active_learning_model_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.final_active_learning_model_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) for the most recent SageMaker model trained as part of automated data labeling. </p>
        pub fn set_final_active_learning_model_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.final_active_learning_model_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobOutput`](crate::model::LabelingJobOutput).
        pub fn build(self) -> crate::model::LabelingJobOutput {
            crate::model::LabelingJobOutput {
                output_dataset_s3_uri: self.output_dataset_s3_uri,
                final_active_learning_model_arn: self.final_active_learning_model_arn,
            }
        }
    }
}
impl LabelingJobOutput {
    /// Creates a new builder-style object to manufacture [`LabelingJobOutput`](crate::model::LabelingJobOutput).
    pub fn builder() -> crate::model::labeling_job_output::Builder {
        crate::model::labeling_job_output::Builder::default()
    }
}

/// <p>Provides a breakdown of the number of objects labeled.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelCounters {
    /// <p>The total number of objects labeled.</p>
    #[doc(hidden)]
    pub total_labeled: i32,
    /// <p>The total number of objects labeled by a human worker.</p>
    #[doc(hidden)]
    pub human_labeled: i32,
    /// <p>The total number of objects labeled by automated data labeling.</p>
    #[doc(hidden)]
    pub machine_labeled: i32,
    /// <p>The total number of objects that could not be labeled due to an error.</p>
    #[doc(hidden)]
    pub failed_non_retryable_error: i32,
    /// <p>The total number of objects not yet labeled.</p>
    #[doc(hidden)]
    pub unlabeled: i32,
}
impl LabelCounters {
    /// <p>The total number of objects labeled.</p>
    pub fn total_labeled(&self) -> i32 {
        self.total_labeled
    }
    /// <p>The total number of objects labeled by a human worker.</p>
    pub fn human_labeled(&self) -> i32 {
        self.human_labeled
    }
    /// <p>The total number of objects labeled by automated data labeling.</p>
    pub fn machine_labeled(&self) -> i32 {
        self.machine_labeled
    }
    /// <p>The total number of objects that could not be labeled due to an error.</p>
    pub fn failed_non_retryable_error(&self) -> i32 {
        self.failed_non_retryable_error
    }
    /// <p>The total number of objects not yet labeled.</p>
    pub fn unlabeled(&self) -> i32 {
        self.unlabeled
    }
}
/// See [`LabelCounters`](crate::model::LabelCounters).
pub mod label_counters {

    /// A builder for [`LabelCounters`](crate::model::LabelCounters).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) total_labeled: std::option::Option<i32>,
        pub(crate) human_labeled: std::option::Option<i32>,
        pub(crate) machine_labeled: std::option::Option<i32>,
        pub(crate) failed_non_retryable_error: std::option::Option<i32>,
        pub(crate) unlabeled: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The total number of objects labeled.</p>
        pub fn total_labeled(mut self, input: i32) -> Self {
            self.total_labeled = Some(input);
            self
        }
        /// <p>The total number of objects labeled.</p>
        pub fn set_total_labeled(mut self, input: std::option::Option<i32>) -> Self {
            self.total_labeled = input;
            self
        }
        /// <p>The total number of objects labeled by a human worker.</p>
        pub fn human_labeled(mut self, input: i32) -> Self {
            self.human_labeled = Some(input);
            self
        }
        /// <p>The total number of objects labeled by a human worker.</p>
        pub fn set_human_labeled(mut self, input: std::option::Option<i32>) -> Self {
            self.human_labeled = input;
            self
        }
        /// <p>The total number of objects labeled by automated data labeling.</p>
        pub fn machine_labeled(mut self, input: i32) -> Self {
            self.machine_labeled = Some(input);
            self
        }
        /// <p>The total number of objects labeled by automated data labeling.</p>
        pub fn set_machine_labeled(mut self, input: std::option::Option<i32>) -> Self {
            self.machine_labeled = input;
            self
        }
        /// <p>The total number of objects that could not be labeled due to an error.</p>
        pub fn failed_non_retryable_error(mut self, input: i32) -> Self {
            self.failed_non_retryable_error = Some(input);
            self
        }
        /// <p>The total number of objects that could not be labeled due to an error.</p>
        pub fn set_failed_non_retryable_error(mut self, input: std::option::Option<i32>) -> Self {
            self.failed_non_retryable_error = input;
            self
        }
        /// <p>The total number of objects not yet labeled.</p>
        pub fn unlabeled(mut self, input: i32) -> Self {
            self.unlabeled = Some(input);
            self
        }
        /// <p>The total number of objects not yet labeled.</p>
        pub fn set_unlabeled(mut self, input: std::option::Option<i32>) -> Self {
            self.unlabeled = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelCounters`](crate::model::LabelCounters).
        pub fn build(self) -> crate::model::LabelCounters {
            crate::model::LabelCounters {
                total_labeled: self.total_labeled.unwrap_or_default(),
                human_labeled: self.human_labeled.unwrap_or_default(),
                machine_labeled: self.machine_labeled.unwrap_or_default(),
                failed_non_retryable_error: self.failed_non_retryable_error.unwrap_or_default(),
                unlabeled: self.unlabeled.unwrap_or_default(),
            }
        }
    }
}
impl LabelCounters {
    /// Creates a new builder-style object to manufacture [`LabelCounters`](crate::model::LabelCounters).
    pub fn builder() -> crate::model::label_counters::Builder {
        crate::model::label_counters::Builder::default()
    }
}

/// When writing a match expression against `LabelingJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let labelingjobstatus = unimplemented!();
/// match labelingjobstatus {
///     LabelingJobStatus::Completed => { /* ... */ },
///     LabelingJobStatus::Failed => { /* ... */ },
///     LabelingJobStatus::InProgress => { /* ... */ },
///     LabelingJobStatus::Initializing => { /* ... */ },
///     LabelingJobStatus::Stopped => { /* ... */ },
///     LabelingJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `labelingjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `LabelingJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `LabelingJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `LabelingJobStatus::NewFeature` is defined.
/// Specifically, when `labelingjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `LabelingJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum LabelingJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Initializing,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for LabelingJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => LabelingJobStatus::Completed,
            "Failed" => LabelingJobStatus::Failed,
            "InProgress" => LabelingJobStatus::InProgress,
            "Initializing" => LabelingJobStatus::Initializing,
            "Stopped" => LabelingJobStatus::Stopped,
            "Stopping" => LabelingJobStatus::Stopping,
            other => {
                LabelingJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for LabelingJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(LabelingJobStatus::from(s))
    }
}
impl LabelingJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            LabelingJobStatus::Completed => "Completed",
            LabelingJobStatus::Failed => "Failed",
            LabelingJobStatus::InProgress => "InProgress",
            LabelingJobStatus::Initializing => "Initializing",
            LabelingJobStatus::Stopped => "Stopped",
            LabelingJobStatus::Stopping => "Stopping",
            LabelingJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Completed",
            "Failed",
            "InProgress",
            "Initializing",
            "Stopped",
            "Stopping",
        ]
    }
}
impl AsRef<str> for LabelingJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A returned array object for the <code>Steps</code> response field in the <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InferenceRecommendationsJobStep.html">ListInferenceRecommendationsJobSteps</a> API command.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceRecommendationsJobStep {
    /// <p>The type of the subtask.</p>
    /// <p> <code>BENCHMARK</code>: Evaluate the performance of your model on different instance types.</p>
    #[doc(hidden)]
    pub step_type: std::option::Option<crate::model::RecommendationStepType>,
    /// <p>The name of the Inference Recommender job.</p>
    #[doc(hidden)]
    pub job_name: std::option::Option<std::string::String>,
    /// <p>The current status of the benchmark.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::RecommendationJobStatus>,
    /// <p>The details for a specific benchmark.</p>
    #[doc(hidden)]
    pub inference_benchmark: std::option::Option<crate::model::RecommendationJobInferenceBenchmark>,
}
impl InferenceRecommendationsJobStep {
    /// <p>The type of the subtask.</p>
    /// <p> <code>BENCHMARK</code>: Evaluate the performance of your model on different instance types.</p>
    pub fn step_type(&self) -> std::option::Option<&crate::model::RecommendationStepType> {
        self.step_type.as_ref()
    }
    /// <p>The name of the Inference Recommender job.</p>
    pub fn job_name(&self) -> std::option::Option<&str> {
        self.job_name.as_deref()
    }
    /// <p>The current status of the benchmark.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::RecommendationJobStatus> {
        self.status.as_ref()
    }
    /// <p>The details for a specific benchmark.</p>
    pub fn inference_benchmark(
        &self,
    ) -> std::option::Option<&crate::model::RecommendationJobInferenceBenchmark> {
        self.inference_benchmark.as_ref()
    }
}
/// See [`InferenceRecommendationsJobStep`](crate::model::InferenceRecommendationsJobStep).
pub mod inference_recommendations_job_step {

    /// A builder for [`InferenceRecommendationsJobStep`](crate::model::InferenceRecommendationsJobStep).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) step_type: std::option::Option<crate::model::RecommendationStepType>,
        pub(crate) job_name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::RecommendationJobStatus>,
        pub(crate) inference_benchmark:
            std::option::Option<crate::model::RecommendationJobInferenceBenchmark>,
    }
    impl Builder {
        /// <p>The type of the subtask.</p>
        /// <p> <code>BENCHMARK</code>: Evaluate the performance of your model on different instance types.</p>
        pub fn step_type(mut self, input: crate::model::RecommendationStepType) -> Self {
            self.step_type = Some(input);
            self
        }
        /// <p>The type of the subtask.</p>
        /// <p> <code>BENCHMARK</code>: Evaluate the performance of your model on different instance types.</p>
        pub fn set_step_type(
            mut self,
            input: std::option::Option<crate::model::RecommendationStepType>,
        ) -> Self {
            self.step_type = input;
            self
        }
        /// <p>The name of the Inference Recommender job.</p>
        pub fn job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.job_name = Some(input.into());
            self
        }
        /// <p>The name of the Inference Recommender job.</p>
        pub fn set_job_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.job_name = input;
            self
        }
        /// <p>The current status of the benchmark.</p>
        pub fn status(mut self, input: crate::model::RecommendationJobStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The current status of the benchmark.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The details for a specific benchmark.</p>
        pub fn inference_benchmark(
            mut self,
            input: crate::model::RecommendationJobInferenceBenchmark,
        ) -> Self {
            self.inference_benchmark = Some(input);
            self
        }
        /// <p>The details for a specific benchmark.</p>
        pub fn set_inference_benchmark(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobInferenceBenchmark>,
        ) -> Self {
            self.inference_benchmark = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceRecommendationsJobStep`](crate::model::InferenceRecommendationsJobStep).
        pub fn build(self) -> crate::model::InferenceRecommendationsJobStep {
            crate::model::InferenceRecommendationsJobStep {
                step_type: self.step_type,
                job_name: self.job_name,
                status: self.status,
                inference_benchmark: self.inference_benchmark,
            }
        }
    }
}
impl InferenceRecommendationsJobStep {
    /// Creates a new builder-style object to manufacture [`InferenceRecommendationsJobStep`](crate::model::InferenceRecommendationsJobStep).
    pub fn builder() -> crate::model::inference_recommendations_job_step::Builder {
        crate::model::inference_recommendations_job_step::Builder::default()
    }
}

/// <p>The details for a specific benchmark from an Inference Recommender job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobInferenceBenchmark {
    /// <p>The metrics of recommendations.</p>
    #[doc(hidden)]
    pub metrics: std::option::Option<crate::model::RecommendationMetrics>,
    /// <p>The endpoint configuration made by Inference Recommender during a recommendation job.</p>
    #[doc(hidden)]
    pub endpoint_configuration: std::option::Option<crate::model::EndpointOutputConfiguration>,
    /// <p>Defines the model configuration. Includes the specification name and environment parameters.</p>
    #[doc(hidden)]
    pub model_configuration: std::option::Option<crate::model::ModelConfiguration>,
    /// <p>The reason why a benchmark failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl RecommendationJobInferenceBenchmark {
    /// <p>The metrics of recommendations.</p>
    pub fn metrics(&self) -> std::option::Option<&crate::model::RecommendationMetrics> {
        self.metrics.as_ref()
    }
    /// <p>The endpoint configuration made by Inference Recommender during a recommendation job.</p>
    pub fn endpoint_configuration(
        &self,
    ) -> std::option::Option<&crate::model::EndpointOutputConfiguration> {
        self.endpoint_configuration.as_ref()
    }
    /// <p>Defines the model configuration. Includes the specification name and environment parameters.</p>
    pub fn model_configuration(&self) -> std::option::Option<&crate::model::ModelConfiguration> {
        self.model_configuration.as_ref()
    }
    /// <p>The reason why a benchmark failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`RecommendationJobInferenceBenchmark`](crate::model::RecommendationJobInferenceBenchmark).
pub mod recommendation_job_inference_benchmark {

    /// A builder for [`RecommendationJobInferenceBenchmark`](crate::model::RecommendationJobInferenceBenchmark).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metrics: std::option::Option<crate::model::RecommendationMetrics>,
        pub(crate) endpoint_configuration:
            std::option::Option<crate::model::EndpointOutputConfiguration>,
        pub(crate) model_configuration: std::option::Option<crate::model::ModelConfiguration>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The metrics of recommendations.</p>
        pub fn metrics(mut self, input: crate::model::RecommendationMetrics) -> Self {
            self.metrics = Some(input);
            self
        }
        /// <p>The metrics of recommendations.</p>
        pub fn set_metrics(
            mut self,
            input: std::option::Option<crate::model::RecommendationMetrics>,
        ) -> Self {
            self.metrics = input;
            self
        }
        /// <p>The endpoint configuration made by Inference Recommender during a recommendation job.</p>
        pub fn endpoint_configuration(
            mut self,
            input: crate::model::EndpointOutputConfiguration,
        ) -> Self {
            self.endpoint_configuration = Some(input);
            self
        }
        /// <p>The endpoint configuration made by Inference Recommender during a recommendation job.</p>
        pub fn set_endpoint_configuration(
            mut self,
            input: std::option::Option<crate::model::EndpointOutputConfiguration>,
        ) -> Self {
            self.endpoint_configuration = input;
            self
        }
        /// <p>Defines the model configuration. Includes the specification name and environment parameters.</p>
        pub fn model_configuration(mut self, input: crate::model::ModelConfiguration) -> Self {
            self.model_configuration = Some(input);
            self
        }
        /// <p>Defines the model configuration. Includes the specification name and environment parameters.</p>
        pub fn set_model_configuration(
            mut self,
            input: std::option::Option<crate::model::ModelConfiguration>,
        ) -> Self {
            self.model_configuration = input;
            self
        }
        /// <p>The reason why a benchmark failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The reason why a benchmark failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobInferenceBenchmark`](crate::model::RecommendationJobInferenceBenchmark).
        pub fn build(self) -> crate::model::RecommendationJobInferenceBenchmark {
            crate::model::RecommendationJobInferenceBenchmark {
                metrics: self.metrics,
                endpoint_configuration: self.endpoint_configuration,
                model_configuration: self.model_configuration,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl RecommendationJobInferenceBenchmark {
    /// Creates a new builder-style object to manufacture [`RecommendationJobInferenceBenchmark`](crate::model::RecommendationJobInferenceBenchmark).
    pub fn builder() -> crate::model::recommendation_job_inference_benchmark::Builder {
        crate::model::recommendation_job_inference_benchmark::Builder::default()
    }
}

/// <p>Defines the model configuration. Includes the specification name and environment parameters.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelConfiguration {
    /// <p>The inference specification name in the model package version.</p>
    #[doc(hidden)]
    pub inference_specification_name: std::option::Option<std::string::String>,
    /// <p>Defines the environment parameters that includes key, value types, and values.</p>
    #[doc(hidden)]
    pub environment_parameters:
        std::option::Option<std::vec::Vec<crate::model::EnvironmentParameter>>,
}
impl ModelConfiguration {
    /// <p>The inference specification name in the model package version.</p>
    pub fn inference_specification_name(&self) -> std::option::Option<&str> {
        self.inference_specification_name.as_deref()
    }
    /// <p>Defines the environment parameters that includes key, value types, and values.</p>
    pub fn environment_parameters(
        &self,
    ) -> std::option::Option<&[crate::model::EnvironmentParameter]> {
        self.environment_parameters.as_deref()
    }
}
/// See [`ModelConfiguration`](crate::model::ModelConfiguration).
pub mod model_configuration {

    /// A builder for [`ModelConfiguration`](crate::model::ModelConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) inference_specification_name: std::option::Option<std::string::String>,
        pub(crate) environment_parameters:
            std::option::Option<std::vec::Vec<crate::model::EnvironmentParameter>>,
    }
    impl Builder {
        /// <p>The inference specification name in the model package version.</p>
        pub fn inference_specification_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.inference_specification_name = Some(input.into());
            self
        }
        /// <p>The inference specification name in the model package version.</p>
        pub fn set_inference_specification_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.inference_specification_name = input;
            self
        }
        /// Appends an item to `environment_parameters`.
        ///
        /// To override the contents of this collection use [`set_environment_parameters`](Self::set_environment_parameters).
        ///
        /// <p>Defines the environment parameters that includes key, value types, and values.</p>
        pub fn environment_parameters(mut self, input: crate::model::EnvironmentParameter) -> Self {
            let mut v = self.environment_parameters.unwrap_or_default();
            v.push(input);
            self.environment_parameters = Some(v);
            self
        }
        /// <p>Defines the environment parameters that includes key, value types, and values.</p>
        pub fn set_environment_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::EnvironmentParameter>>,
        ) -> Self {
            self.environment_parameters = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelConfiguration`](crate::model::ModelConfiguration).
        pub fn build(self) -> crate::model::ModelConfiguration {
            crate::model::ModelConfiguration {
                inference_specification_name: self.inference_specification_name,
                environment_parameters: self.environment_parameters,
            }
        }
    }
}
impl ModelConfiguration {
    /// Creates a new builder-style object to manufacture [`ModelConfiguration`](crate::model::ModelConfiguration).
    pub fn builder() -> crate::model::model_configuration::Builder {
        crate::model::model_configuration::Builder::default()
    }
}

/// <p>A list of environment parameters suggested by the Amazon SageMaker Inference Recommender.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EnvironmentParameter {
    /// <p>The environment key suggested by the Amazon SageMaker Inference Recommender.</p>
    #[doc(hidden)]
    pub key: std::option::Option<std::string::String>,
    /// <p>The value type suggested by the Amazon SageMaker Inference Recommender.</p>
    #[doc(hidden)]
    pub value_type: std::option::Option<std::string::String>,
    /// <p>The value suggested by the Amazon SageMaker Inference Recommender.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl EnvironmentParameter {
    /// <p>The environment key suggested by the Amazon SageMaker Inference Recommender.</p>
    pub fn key(&self) -> std::option::Option<&str> {
        self.key.as_deref()
    }
    /// <p>The value type suggested by the Amazon SageMaker Inference Recommender.</p>
    pub fn value_type(&self) -> std::option::Option<&str> {
        self.value_type.as_deref()
    }
    /// <p>The value suggested by the Amazon SageMaker Inference Recommender.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`EnvironmentParameter`](crate::model::EnvironmentParameter).
pub mod environment_parameter {

    /// A builder for [`EnvironmentParameter`](crate::model::EnvironmentParameter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) key: std::option::Option<std::string::String>,
        pub(crate) value_type: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The environment key suggested by the Amazon SageMaker Inference Recommender.</p>
        pub fn key(mut self, input: impl Into<std::string::String>) -> Self {
            self.key = Some(input.into());
            self
        }
        /// <p>The environment key suggested by the Amazon SageMaker Inference Recommender.</p>
        pub fn set_key(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.key = input;
            self
        }
        /// <p>The value type suggested by the Amazon SageMaker Inference Recommender.</p>
        pub fn value_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.value_type = Some(input.into());
            self
        }
        /// <p>The value type suggested by the Amazon SageMaker Inference Recommender.</p>
        pub fn set_value_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value_type = input;
            self
        }
        /// <p>The value suggested by the Amazon SageMaker Inference Recommender.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The value suggested by the Amazon SageMaker Inference Recommender.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`EnvironmentParameter`](crate::model::EnvironmentParameter).
        pub fn build(self) -> crate::model::EnvironmentParameter {
            crate::model::EnvironmentParameter {
                key: self.key,
                value_type: self.value_type,
                value: self.value,
            }
        }
    }
}
impl EnvironmentParameter {
    /// Creates a new builder-style object to manufacture [`EnvironmentParameter`](crate::model::EnvironmentParameter).
    pub fn builder() -> crate::model::environment_parameter::Builder {
        crate::model::environment_parameter::Builder::default()
    }
}

/// <p>The endpoint configuration made by Inference Recommender during a recommendation job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointOutputConfiguration {
    /// <p>The name of the endpoint made during a recommendation job.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>The name of the production variant (deployed model) made during a recommendation job.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>The instance type recommended by Amazon SageMaker Inference Recommender.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
    /// <p>The number of instances recommended to launch initially.</p>
    #[doc(hidden)]
    pub initial_instance_count: i32,
}
impl EndpointOutputConfiguration {
    /// <p>The name of the endpoint made during a recommendation job.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>The name of the production variant (deployed model) made during a recommendation job.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>The instance type recommended by Amazon SageMaker Inference Recommender.</p>
    pub fn instance_type(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The number of instances recommended to launch initially.</p>
    pub fn initial_instance_count(&self) -> i32 {
        self.initial_instance_count
    }
}
/// See [`EndpointOutputConfiguration`](crate::model::EndpointOutputConfiguration).
pub mod endpoint_output_configuration {

    /// A builder for [`EndpointOutputConfiguration`](crate::model::EndpointOutputConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
        pub(crate) initial_instance_count: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The name of the endpoint made during a recommendation job.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint made during a recommendation job.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>The name of the production variant (deployed model) made during a recommendation job.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the production variant (deployed model) made during a recommendation job.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// <p>The instance type recommended by Amazon SageMaker Inference Recommender.</p>
        pub fn instance_type(mut self, input: crate::model::ProductionVariantInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance type recommended by Amazon SageMaker Inference Recommender.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The number of instances recommended to launch initially.</p>
        pub fn initial_instance_count(mut self, input: i32) -> Self {
            self.initial_instance_count = Some(input);
            self
        }
        /// <p>The number of instances recommended to launch initially.</p>
        pub fn set_initial_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.initial_instance_count = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointOutputConfiguration`](crate::model::EndpointOutputConfiguration).
        pub fn build(self) -> crate::model::EndpointOutputConfiguration {
            crate::model::EndpointOutputConfiguration {
                endpoint_name: self.endpoint_name,
                variant_name: self.variant_name,
                instance_type: self.instance_type,
                initial_instance_count: self.initial_instance_count.unwrap_or_default(),
            }
        }
    }
}
impl EndpointOutputConfiguration {
    /// Creates a new builder-style object to manufacture [`EndpointOutputConfiguration`](crate::model::EndpointOutputConfiguration).
    pub fn builder() -> crate::model::endpoint_output_configuration::Builder {
        crate::model::endpoint_output_configuration::Builder::default()
    }
}

/// <p>The metrics of recommendations.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationMetrics {
    /// <p>Defines the cost per hour for the instance. </p>
    #[doc(hidden)]
    pub cost_per_hour: f32,
    /// <p>Defines the cost per inference for the instance .</p>
    #[doc(hidden)]
    pub cost_per_inference: f32,
    /// <p>The expected maximum number of requests per minute for the instance.</p>
    #[doc(hidden)]
    pub max_invocations: i32,
    /// <p>The expected model latency at maximum invocation per minute for the instance.</p>
    #[doc(hidden)]
    pub model_latency: i32,
}
impl RecommendationMetrics {
    /// <p>Defines the cost per hour for the instance. </p>
    pub fn cost_per_hour(&self) -> f32 {
        self.cost_per_hour
    }
    /// <p>Defines the cost per inference for the instance .</p>
    pub fn cost_per_inference(&self) -> f32 {
        self.cost_per_inference
    }
    /// <p>The expected maximum number of requests per minute for the instance.</p>
    pub fn max_invocations(&self) -> i32 {
        self.max_invocations
    }
    /// <p>The expected model latency at maximum invocation per minute for the instance.</p>
    pub fn model_latency(&self) -> i32 {
        self.model_latency
    }
}
/// See [`RecommendationMetrics`](crate::model::RecommendationMetrics).
pub mod recommendation_metrics {

    /// A builder for [`RecommendationMetrics`](crate::model::RecommendationMetrics).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) cost_per_hour: std::option::Option<f32>,
        pub(crate) cost_per_inference: std::option::Option<f32>,
        pub(crate) max_invocations: std::option::Option<i32>,
        pub(crate) model_latency: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Defines the cost per hour for the instance. </p>
        pub fn cost_per_hour(mut self, input: f32) -> Self {
            self.cost_per_hour = Some(input);
            self
        }
        /// <p>Defines the cost per hour for the instance. </p>
        pub fn set_cost_per_hour(mut self, input: std::option::Option<f32>) -> Self {
            self.cost_per_hour = input;
            self
        }
        /// <p>Defines the cost per inference for the instance .</p>
        pub fn cost_per_inference(mut self, input: f32) -> Self {
            self.cost_per_inference = Some(input);
            self
        }
        /// <p>Defines the cost per inference for the instance .</p>
        pub fn set_cost_per_inference(mut self, input: std::option::Option<f32>) -> Self {
            self.cost_per_inference = input;
            self
        }
        /// <p>The expected maximum number of requests per minute for the instance.</p>
        pub fn max_invocations(mut self, input: i32) -> Self {
            self.max_invocations = Some(input);
            self
        }
        /// <p>The expected maximum number of requests per minute for the instance.</p>
        pub fn set_max_invocations(mut self, input: std::option::Option<i32>) -> Self {
            self.max_invocations = input;
            self
        }
        /// <p>The expected model latency at maximum invocation per minute for the instance.</p>
        pub fn model_latency(mut self, input: i32) -> Self {
            self.model_latency = Some(input);
            self
        }
        /// <p>The expected model latency at maximum invocation per minute for the instance.</p>
        pub fn set_model_latency(mut self, input: std::option::Option<i32>) -> Self {
            self.model_latency = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationMetrics`](crate::model::RecommendationMetrics).
        pub fn build(self) -> crate::model::RecommendationMetrics {
            crate::model::RecommendationMetrics {
                cost_per_hour: self.cost_per_hour.unwrap_or_default(),
                cost_per_inference: self.cost_per_inference.unwrap_or_default(),
                max_invocations: self.max_invocations.unwrap_or_default(),
                model_latency: self.model_latency.unwrap_or_default(),
            }
        }
    }
}
impl RecommendationMetrics {
    /// Creates a new builder-style object to manufacture [`RecommendationMetrics`](crate::model::RecommendationMetrics).
    pub fn builder() -> crate::model::recommendation_metrics::Builder {
        crate::model::recommendation_metrics::Builder::default()
    }
}

/// When writing a match expression against `RecommendationJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let recommendationjobstatus = unimplemented!();
/// match recommendationjobstatus {
///     RecommendationJobStatus::Completed => { /* ... */ },
///     RecommendationJobStatus::Failed => { /* ... */ },
///     RecommendationJobStatus::InProgress => { /* ... */ },
///     RecommendationJobStatus::Pending => { /* ... */ },
///     RecommendationJobStatus::Stopped => { /* ... */ },
///     RecommendationJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `recommendationjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RecommendationJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RecommendationJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RecommendationJobStatus::NewFeature` is defined.
/// Specifically, when `recommendationjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RecommendationJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RecommendationJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RecommendationJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "COMPLETED" => RecommendationJobStatus::Completed,
            "FAILED" => RecommendationJobStatus::Failed,
            "IN_PROGRESS" => RecommendationJobStatus::InProgress,
            "PENDING" => RecommendationJobStatus::Pending,
            "STOPPED" => RecommendationJobStatus::Stopped,
            "STOPPING" => RecommendationJobStatus::Stopping,
            other => RecommendationJobStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for RecommendationJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RecommendationJobStatus::from(s))
    }
}
impl RecommendationJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RecommendationJobStatus::Completed => "COMPLETED",
            RecommendationJobStatus::Failed => "FAILED",
            RecommendationJobStatus::InProgress => "IN_PROGRESS",
            RecommendationJobStatus::Pending => "PENDING",
            RecommendationJobStatus::Stopped => "STOPPED",
            RecommendationJobStatus::Stopping => "STOPPING",
            RecommendationJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "COMPLETED",
            "FAILED",
            "IN_PROGRESS",
            "PENDING",
            "STOPPED",
            "STOPPING",
        ]
    }
}
impl AsRef<str> for RecommendationJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `RecommendationStepType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let recommendationsteptype = unimplemented!();
/// match recommendationsteptype {
///     RecommendationStepType::Benchmark => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `recommendationsteptype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RecommendationStepType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RecommendationStepType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RecommendationStepType::NewFeature` is defined.
/// Specifically, when `recommendationsteptype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RecommendationStepType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RecommendationStepType {
    #[allow(missing_docs)] // documentation missing in model
    Benchmark,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RecommendationStepType {
    fn from(s: &str) -> Self {
        match s {
            "BENCHMARK" => RecommendationStepType::Benchmark,
            other => {
                RecommendationStepType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for RecommendationStepType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RecommendationStepType::from(s))
    }
}
impl RecommendationStepType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RecommendationStepType::Benchmark => "BENCHMARK",
            RecommendationStepType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["BENCHMARK"]
    }
}
impl AsRef<str> for RecommendationStepType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A structure that contains a list of recommendation jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceRecommendationsJob {
    /// <p>The name of the job.</p>
    #[doc(hidden)]
    pub job_name: std::option::Option<std::string::String>,
    /// <p>The job description.</p>
    #[doc(hidden)]
    pub job_description: std::option::Option<std::string::String>,
    /// <p>The recommendation job type.</p>
    #[doc(hidden)]
    pub job_type: std::option::Option<crate::model::RecommendationJobType>,
    /// <p>The Amazon Resource Name (ARN) of the recommendation job.</p>
    #[doc(hidden)]
    pub job_arn: std::option::Option<std::string::String>,
    /// <p>The status of the job.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::RecommendationJobStatus>,
    /// <p>A timestamp that shows when the job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that shows when the job completed.</p>
    #[doc(hidden)]
    pub completion_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The Amazon Resource Name (ARN) of an IAM role that enables Amazon SageMaker to perform tasks on your behalf.</p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>If the job fails, provides information why the job failed.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl InferenceRecommendationsJob {
    /// <p>The name of the job.</p>
    pub fn job_name(&self) -> std::option::Option<&str> {
        self.job_name.as_deref()
    }
    /// <p>The job description.</p>
    pub fn job_description(&self) -> std::option::Option<&str> {
        self.job_description.as_deref()
    }
    /// <p>The recommendation job type.</p>
    pub fn job_type(&self) -> std::option::Option<&crate::model::RecommendationJobType> {
        self.job_type.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the recommendation job.</p>
    pub fn job_arn(&self) -> std::option::Option<&str> {
        self.job_arn.as_deref()
    }
    /// <p>The status of the job.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::RecommendationJobStatus> {
        self.status.as_ref()
    }
    /// <p>A timestamp that shows when the job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that shows when the job completed.</p>
    pub fn completion_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.completion_time.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of an IAM role that enables Amazon SageMaker to perform tasks on your behalf.</p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
    /// <p>A timestamp that shows when the job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>If the job fails, provides information why the job failed.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`InferenceRecommendationsJob`](crate::model::InferenceRecommendationsJob).
pub mod inference_recommendations_job {

    /// A builder for [`InferenceRecommendationsJob`](crate::model::InferenceRecommendationsJob).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) job_name: std::option::Option<std::string::String>,
        pub(crate) job_description: std::option::Option<std::string::String>,
        pub(crate) job_type: std::option::Option<crate::model::RecommendationJobType>,
        pub(crate) job_arn: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::RecommendationJobStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) completion_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the job.</p>
        pub fn job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.job_name = Some(input.into());
            self
        }
        /// <p>The name of the job.</p>
        pub fn set_job_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.job_name = input;
            self
        }
        /// <p>The job description.</p>
        pub fn job_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.job_description = Some(input.into());
            self
        }
        /// <p>The job description.</p>
        pub fn set_job_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.job_description = input;
            self
        }
        /// <p>The recommendation job type.</p>
        pub fn job_type(mut self, input: crate::model::RecommendationJobType) -> Self {
            self.job_type = Some(input);
            self
        }
        /// <p>The recommendation job type.</p>
        pub fn set_job_type(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobType>,
        ) -> Self {
            self.job_type = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the recommendation job.</p>
        pub fn job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the recommendation job.</p>
        pub fn set_job_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.job_arn = input;
            self
        }
        /// <p>The status of the job.</p>
        pub fn status(mut self, input: crate::model::RecommendationJobStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the job.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>A timestamp that shows when the job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that shows when the job completed.</p>
        pub fn completion_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.completion_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the job completed.</p>
        pub fn set_completion_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.completion_time = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of an IAM role that enables Amazon SageMaker to perform tasks on your behalf.</p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of an IAM role that enables Amazon SageMaker to perform tasks on your behalf.</p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// <p>A timestamp that shows when the job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>If the job fails, provides information why the job failed.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>If the job fails, provides information why the job failed.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceRecommendationsJob`](crate::model::InferenceRecommendationsJob).
        pub fn build(self) -> crate::model::InferenceRecommendationsJob {
            crate::model::InferenceRecommendationsJob {
                job_name: self.job_name,
                job_description: self.job_description,
                job_type: self.job_type,
                job_arn: self.job_arn,
                status: self.status,
                creation_time: self.creation_time,
                completion_time: self.completion_time,
                role_arn: self.role_arn,
                last_modified_time: self.last_modified_time,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl InferenceRecommendationsJob {
    /// Creates a new builder-style object to manufacture [`InferenceRecommendationsJob`](crate::model::InferenceRecommendationsJob).
    pub fn builder() -> crate::model::inference_recommendations_job::Builder {
        crate::model::inference_recommendations_job::Builder::default()
    }
}

/// When writing a match expression against `RecommendationJobType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let recommendationjobtype = unimplemented!();
/// match recommendationjobtype {
///     RecommendationJobType::Advanced => { /* ... */ },
///     RecommendationJobType::Default => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `recommendationjobtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RecommendationJobType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RecommendationJobType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RecommendationJobType::NewFeature` is defined.
/// Specifically, when `recommendationjobtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RecommendationJobType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RecommendationJobType {
    #[allow(missing_docs)] // documentation missing in model
    Advanced,
    #[allow(missing_docs)] // documentation missing in model
    Default,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RecommendationJobType {
    fn from(s: &str) -> Self {
        match s {
            "Advanced" => RecommendationJobType::Advanced,
            "Default" => RecommendationJobType::Default,
            other => {
                RecommendationJobType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for RecommendationJobType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RecommendationJobType::from(s))
    }
}
impl RecommendationJobType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RecommendationJobType::Advanced => "Advanced",
            RecommendationJobType::Default => "Default",
            RecommendationJobType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Advanced", "Default"]
    }
}
impl AsRef<str> for RecommendationJobType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ListInferenceRecommendationsJobsSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listinferencerecommendationsjobssortby = unimplemented!();
/// match listinferencerecommendationsjobssortby {
///     ListInferenceRecommendationsJobsSortBy::CreationTime => { /* ... */ },
///     ListInferenceRecommendationsJobsSortBy::Name => { /* ... */ },
///     ListInferenceRecommendationsJobsSortBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listinferencerecommendationsjobssortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListInferenceRecommendationsJobsSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListInferenceRecommendationsJobsSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListInferenceRecommendationsJobsSortBy::NewFeature` is defined.
/// Specifically, when `listinferencerecommendationsjobssortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListInferenceRecommendationsJobsSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListInferenceRecommendationsJobsSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListInferenceRecommendationsJobsSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ListInferenceRecommendationsJobsSortBy::CreationTime,
            "Name" => ListInferenceRecommendationsJobsSortBy::Name,
            "Status" => ListInferenceRecommendationsJobsSortBy::Status,
            other => ListInferenceRecommendationsJobsSortBy::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for ListInferenceRecommendationsJobsSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListInferenceRecommendationsJobsSortBy::from(s))
    }
}
impl ListInferenceRecommendationsJobsSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListInferenceRecommendationsJobsSortBy::CreationTime => "CreationTime",
            ListInferenceRecommendationsJobsSortBy::Name => "Name",
            ListInferenceRecommendationsJobsSortBy::Status => "Status",
            ListInferenceRecommendationsJobsSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for ListInferenceRecommendationsJobsSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Lists a summary of properties of an inference experiment.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceExperimentSummary {
    /// <p>The name of the inference experiment.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The type of the inference experiment.</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::InferenceExperimentType>,
    /// <p>The duration for which the inference experiment ran or will run.</p>
    /// <p>The maximum duration that you can set for an inference experiment is 30 days.</p>
    #[doc(hidden)]
    pub schedule: std::option::Option<crate::model::InferenceExperimentSchedule>,
    /// <p>The status of the inference experiment.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::InferenceExperimentStatus>,
    /// <p>The error message for the inference experiment status result.</p>
    #[doc(hidden)]
    pub status_reason: std::option::Option<std::string::String>,
    /// <p>The description of the inference experiment.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The timestamp at which the inference experiment was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The timestamp at which the inference experiment was completed.</p>
    #[doc(hidden)]
    pub completion_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The timestamp when you last modified the inference experiment.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p> The ARN of the IAM role that Amazon SageMaker can assume to access model artifacts and container images, and manage Amazon SageMaker Inference endpoints for model deployment. </p>
    #[doc(hidden)]
    pub role_arn: std::option::Option<std::string::String>,
}
impl InferenceExperimentSummary {
    /// <p>The name of the inference experiment.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The type of the inference experiment.</p>
    pub fn r#type(&self) -> std::option::Option<&crate::model::InferenceExperimentType> {
        self.r#type.as_ref()
    }
    /// <p>The duration for which the inference experiment ran or will run.</p>
    /// <p>The maximum duration that you can set for an inference experiment is 30 days.</p>
    pub fn schedule(&self) -> std::option::Option<&crate::model::InferenceExperimentSchedule> {
        self.schedule.as_ref()
    }
    /// <p>The status of the inference experiment.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::InferenceExperimentStatus> {
        self.status.as_ref()
    }
    /// <p>The error message for the inference experiment status result.</p>
    pub fn status_reason(&self) -> std::option::Option<&str> {
        self.status_reason.as_deref()
    }
    /// <p>The description of the inference experiment.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The timestamp at which the inference experiment was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The timestamp at which the inference experiment was completed.</p>
    pub fn completion_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.completion_time.as_ref()
    }
    /// <p>The timestamp when you last modified the inference experiment.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p> The ARN of the IAM role that Amazon SageMaker can assume to access model artifacts and container images, and manage Amazon SageMaker Inference endpoints for model deployment. </p>
    pub fn role_arn(&self) -> std::option::Option<&str> {
        self.role_arn.as_deref()
    }
}
/// See [`InferenceExperimentSummary`](crate::model::InferenceExperimentSummary).
pub mod inference_experiment_summary {

    /// A builder for [`InferenceExperimentSummary`](crate::model::InferenceExperimentSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) r#type: std::option::Option<crate::model::InferenceExperimentType>,
        pub(crate) schedule: std::option::Option<crate::model::InferenceExperimentSchedule>,
        pub(crate) status: std::option::Option<crate::model::InferenceExperimentStatus>,
        pub(crate) status_reason: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) completion_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) role_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the inference experiment.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the inference experiment.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The type of the inference experiment.</p>
        pub fn r#type(mut self, input: crate::model::InferenceExperimentType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>The type of the inference experiment.</p>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::InferenceExperimentType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The duration for which the inference experiment ran or will run.</p>
        /// <p>The maximum duration that you can set for an inference experiment is 30 days.</p>
        pub fn schedule(mut self, input: crate::model::InferenceExperimentSchedule) -> Self {
            self.schedule = Some(input);
            self
        }
        /// <p>The duration for which the inference experiment ran or will run.</p>
        /// <p>The maximum duration that you can set for an inference experiment is 30 days.</p>
        pub fn set_schedule(
            mut self,
            input: std::option::Option<crate::model::InferenceExperimentSchedule>,
        ) -> Self {
            self.schedule = input;
            self
        }
        /// <p>The status of the inference experiment.</p>
        pub fn status(mut self, input: crate::model::InferenceExperimentStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the inference experiment.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::InferenceExperimentStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The error message for the inference experiment status result.</p>
        pub fn status_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.status_reason = Some(input.into());
            self
        }
        /// <p>The error message for the inference experiment status result.</p>
        pub fn set_status_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.status_reason = input;
            self
        }
        /// <p>The description of the inference experiment.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>The description of the inference experiment.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>The timestamp at which the inference experiment was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The timestamp at which the inference experiment was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The timestamp at which the inference experiment was completed.</p>
        pub fn completion_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.completion_time = Some(input);
            self
        }
        /// <p>The timestamp at which the inference experiment was completed.</p>
        pub fn set_completion_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.completion_time = input;
            self
        }
        /// <p>The timestamp when you last modified the inference experiment.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The timestamp when you last modified the inference experiment.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p> The ARN of the IAM role that Amazon SageMaker can assume to access model artifacts and container images, and manage Amazon SageMaker Inference endpoints for model deployment. </p>
        pub fn role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.role_arn = Some(input.into());
            self
        }
        /// <p> The ARN of the IAM role that Amazon SageMaker can assume to access model artifacts and container images, and manage Amazon SageMaker Inference endpoints for model deployment. </p>
        pub fn set_role_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.role_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceExperimentSummary`](crate::model::InferenceExperimentSummary).
        pub fn build(self) -> crate::model::InferenceExperimentSummary {
            crate::model::InferenceExperimentSummary {
                name: self.name,
                r#type: self.r#type,
                schedule: self.schedule,
                status: self.status,
                status_reason: self.status_reason,
                description: self.description,
                creation_time: self.creation_time,
                completion_time: self.completion_time,
                last_modified_time: self.last_modified_time,
                role_arn: self.role_arn,
            }
        }
    }
}
impl InferenceExperimentSummary {
    /// Creates a new builder-style object to manufacture [`InferenceExperimentSummary`](crate::model::InferenceExperimentSummary).
    pub fn builder() -> crate::model::inference_experiment_summary::Builder {
        crate::model::inference_experiment_summary::Builder::default()
    }
}

/// When writing a match expression against `InferenceExperimentStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let inferenceexperimentstatus = unimplemented!();
/// match inferenceexperimentstatus {
///     InferenceExperimentStatus::Cancelled => { /* ... */ },
///     InferenceExperimentStatus::Completed => { /* ... */ },
///     InferenceExperimentStatus::Created => { /* ... */ },
///     InferenceExperimentStatus::Creating => { /* ... */ },
///     InferenceExperimentStatus::Running => { /* ... */ },
///     InferenceExperimentStatus::Starting => { /* ... */ },
///     InferenceExperimentStatus::Stopping => { /* ... */ },
///     InferenceExperimentStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `inferenceexperimentstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `InferenceExperimentStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `InferenceExperimentStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `InferenceExperimentStatus::NewFeature` is defined.
/// Specifically, when `inferenceexperimentstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `InferenceExperimentStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum InferenceExperimentStatus {
    #[allow(missing_docs)] // documentation missing in model
    Cancelled,
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Created,
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    Running,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for InferenceExperimentStatus {
    fn from(s: &str) -> Self {
        match s {
            "Cancelled" => InferenceExperimentStatus::Cancelled,
            "Completed" => InferenceExperimentStatus::Completed,
            "Created" => InferenceExperimentStatus::Created,
            "Creating" => InferenceExperimentStatus::Creating,
            "Running" => InferenceExperimentStatus::Running,
            "Starting" => InferenceExperimentStatus::Starting,
            "Stopping" => InferenceExperimentStatus::Stopping,
            "Updating" => InferenceExperimentStatus::Updating,
            other => InferenceExperimentStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for InferenceExperimentStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(InferenceExperimentStatus::from(s))
    }
}
impl InferenceExperimentStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            InferenceExperimentStatus::Cancelled => "Cancelled",
            InferenceExperimentStatus::Completed => "Completed",
            InferenceExperimentStatus::Created => "Created",
            InferenceExperimentStatus::Creating => "Creating",
            InferenceExperimentStatus::Running => "Running",
            InferenceExperimentStatus::Starting => "Starting",
            InferenceExperimentStatus::Stopping => "Stopping",
            InferenceExperimentStatus::Updating => "Updating",
            InferenceExperimentStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Cancelled",
            "Completed",
            "Created",
            "Creating",
            "Running",
            "Starting",
            "Stopping",
            "Updating",
        ]
    }
}
impl AsRef<str> for InferenceExperimentStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `InferenceExperimentType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let inferenceexperimenttype = unimplemented!();
/// match inferenceexperimenttype {
///     InferenceExperimentType::ShadowMode => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `inferenceexperimenttype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `InferenceExperimentType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `InferenceExperimentType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `InferenceExperimentType::NewFeature` is defined.
/// Specifically, when `inferenceexperimenttype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `InferenceExperimentType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum InferenceExperimentType {
    #[allow(missing_docs)] // documentation missing in model
    ShadowMode,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for InferenceExperimentType {
    fn from(s: &str) -> Self {
        match s {
            "ShadowMode" => InferenceExperimentType::ShadowMode,
            other => InferenceExperimentType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for InferenceExperimentType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(InferenceExperimentType::from(s))
    }
}
impl InferenceExperimentType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            InferenceExperimentType::ShadowMode => "ShadowMode",
            InferenceExperimentType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ShadowMode"]
    }
}
impl AsRef<str> for InferenceExperimentType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `SortInferenceExperimentsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortinferenceexperimentsby = unimplemented!();
/// match sortinferenceexperimentsby {
///     SortInferenceExperimentsBy::CreationTime => { /* ... */ },
///     SortInferenceExperimentsBy::Name => { /* ... */ },
///     SortInferenceExperimentsBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortinferenceexperimentsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortInferenceExperimentsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortInferenceExperimentsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortInferenceExperimentsBy::NewFeature` is defined.
/// Specifically, when `sortinferenceexperimentsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortInferenceExperimentsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortInferenceExperimentsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortInferenceExperimentsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortInferenceExperimentsBy::CreationTime,
            "Name" => SortInferenceExperimentsBy::Name,
            "Status" => SortInferenceExperimentsBy::Status,
            other => SortInferenceExperimentsBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for SortInferenceExperimentsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortInferenceExperimentsBy::from(s))
    }
}
impl SortInferenceExperimentsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortInferenceExperimentsBy::CreationTime => "CreationTime",
            SortInferenceExperimentsBy::Name => "Name",
            SortInferenceExperimentsBy::Status => "Status",
            SortInferenceExperimentsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for SortInferenceExperimentsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A version of a SageMaker <code>Image</code>. A version represents an existing container image.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ImageVersion {
    /// <p>When the version was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When a create or delete operation fails, the reason for the failure.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The ARN of the image the version is based on.</p>
    #[doc(hidden)]
    pub image_arn: std::option::Option<std::string::String>,
    /// <p>The ARN of the version.</p>
    #[doc(hidden)]
    pub image_version_arn: std::option::Option<std::string::String>,
    /// <p>The status of the version.</p>
    #[doc(hidden)]
    pub image_version_status: std::option::Option<crate::model::ImageVersionStatus>,
    /// <p>When the version was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The version number.</p>
    #[doc(hidden)]
    pub version: std::option::Option<i32>,
}
impl ImageVersion {
    /// <p>When the version was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When a create or delete operation fails, the reason for the failure.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The ARN of the image the version is based on.</p>
    pub fn image_arn(&self) -> std::option::Option<&str> {
        self.image_arn.as_deref()
    }
    /// <p>The ARN of the version.</p>
    pub fn image_version_arn(&self) -> std::option::Option<&str> {
        self.image_version_arn.as_deref()
    }
    /// <p>The status of the version.</p>
    pub fn image_version_status(&self) -> std::option::Option<&crate::model::ImageVersionStatus> {
        self.image_version_status.as_ref()
    }
    /// <p>When the version was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The version number.</p>
    pub fn version(&self) -> std::option::Option<i32> {
        self.version
    }
}
/// See [`ImageVersion`](crate::model::ImageVersion).
pub mod image_version {

    /// A builder for [`ImageVersion`](crate::model::ImageVersion).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) image_arn: std::option::Option<std::string::String>,
        pub(crate) image_version_arn: std::option::Option<std::string::String>,
        pub(crate) image_version_status: std::option::Option<crate::model::ImageVersionStatus>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) version: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>When the version was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the version was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When a create or delete operation fails, the reason for the failure.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>When a create or delete operation fails, the reason for the failure.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The ARN of the image the version is based on.</p>
        pub fn image_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the image the version is based on.</p>
        pub fn set_image_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_arn = input;
            self
        }
        /// <p>The ARN of the version.</p>
        pub fn image_version_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_version_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the version.</p>
        pub fn set_image_version_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.image_version_arn = input;
            self
        }
        /// <p>The status of the version.</p>
        pub fn image_version_status(mut self, input: crate::model::ImageVersionStatus) -> Self {
            self.image_version_status = Some(input);
            self
        }
        /// <p>The status of the version.</p>
        pub fn set_image_version_status(
            mut self,
            input: std::option::Option<crate::model::ImageVersionStatus>,
        ) -> Self {
            self.image_version_status = input;
            self
        }
        /// <p>When the version was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the version was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The version number.</p>
        pub fn version(mut self, input: i32) -> Self {
            self.version = Some(input);
            self
        }
        /// <p>The version number.</p>
        pub fn set_version(mut self, input: std::option::Option<i32>) -> Self {
            self.version = input;
            self
        }
        /// Consumes the builder and constructs a [`ImageVersion`](crate::model::ImageVersion).
        pub fn build(self) -> crate::model::ImageVersion {
            crate::model::ImageVersion {
                creation_time: self.creation_time,
                failure_reason: self.failure_reason,
                image_arn: self.image_arn,
                image_version_arn: self.image_version_arn,
                image_version_status: self.image_version_status,
                last_modified_time: self.last_modified_time,
                version: self.version,
            }
        }
    }
}
impl ImageVersion {
    /// Creates a new builder-style object to manufacture [`ImageVersion`](crate::model::ImageVersion).
    pub fn builder() -> crate::model::image_version::Builder {
        crate::model::image_version::Builder::default()
    }
}

/// When writing a match expression against `ImageVersionStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let imageversionstatus = unimplemented!();
/// match imageversionstatus {
///     ImageVersionStatus::Created => { /* ... */ },
///     ImageVersionStatus::CreateFailed => { /* ... */ },
///     ImageVersionStatus::Creating => { /* ... */ },
///     ImageVersionStatus::DeleteFailed => { /* ... */ },
///     ImageVersionStatus::Deleting => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `imageversionstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ImageVersionStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ImageVersionStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ImageVersionStatus::NewFeature` is defined.
/// Specifically, when `imageversionstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ImageVersionStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ImageVersionStatus {
    #[allow(missing_docs)] // documentation missing in model
    Created,
    #[allow(missing_docs)] // documentation missing in model
    CreateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ImageVersionStatus {
    fn from(s: &str) -> Self {
        match s {
            "CREATED" => ImageVersionStatus::Created,
            "CREATE_FAILED" => ImageVersionStatus::CreateFailed,
            "CREATING" => ImageVersionStatus::Creating,
            "DELETE_FAILED" => ImageVersionStatus::DeleteFailed,
            "DELETING" => ImageVersionStatus::Deleting,
            other => {
                ImageVersionStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ImageVersionStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ImageVersionStatus::from(s))
    }
}
impl ImageVersionStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ImageVersionStatus::Created => "CREATED",
            ImageVersionStatus::CreateFailed => "CREATE_FAILED",
            ImageVersionStatus::Creating => "CREATING",
            ImageVersionStatus::DeleteFailed => "DELETE_FAILED",
            ImageVersionStatus::Deleting => "DELETING",
            ImageVersionStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CREATED",
            "CREATE_FAILED",
            "CREATING",
            "DELETE_FAILED",
            "DELETING",
        ]
    }
}
impl AsRef<str> for ImageVersionStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ImageVersionSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let imageversionsortorder = unimplemented!();
/// match imageversionsortorder {
///     ImageVersionSortOrder::Ascending => { /* ... */ },
///     ImageVersionSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `imageversionsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ImageVersionSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ImageVersionSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ImageVersionSortOrder::NewFeature` is defined.
/// Specifically, when `imageversionsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ImageVersionSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ImageVersionSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ImageVersionSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "ASCENDING" => ImageVersionSortOrder::Ascending,
            "DESCENDING" => ImageVersionSortOrder::Descending,
            other => {
                ImageVersionSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ImageVersionSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ImageVersionSortOrder::from(s))
    }
}
impl ImageVersionSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ImageVersionSortOrder::Ascending => "ASCENDING",
            ImageVersionSortOrder::Descending => "DESCENDING",
            ImageVersionSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ASCENDING", "DESCENDING"]
    }
}
impl AsRef<str> for ImageVersionSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ImageVersionSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let imageversionsortby = unimplemented!();
/// match imageversionsortby {
///     ImageVersionSortBy::CreationTime => { /* ... */ },
///     ImageVersionSortBy::LastModifiedTime => { /* ... */ },
///     ImageVersionSortBy::Version => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `imageversionsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ImageVersionSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ImageVersionSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ImageVersionSortBy::NewFeature` is defined.
/// Specifically, when `imageversionsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ImageVersionSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ImageVersionSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Version,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ImageVersionSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CREATION_TIME" => ImageVersionSortBy::CreationTime,
            "LAST_MODIFIED_TIME" => ImageVersionSortBy::LastModifiedTime,
            "VERSION" => ImageVersionSortBy::Version,
            other => {
                ImageVersionSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ImageVersionSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ImageVersionSortBy::from(s))
    }
}
impl ImageVersionSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ImageVersionSortBy::CreationTime => "CREATION_TIME",
            ImageVersionSortBy::LastModifiedTime => "LAST_MODIFIED_TIME",
            ImageVersionSortBy::Version => "VERSION",
            ImageVersionSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CREATION_TIME", "LAST_MODIFIED_TIME", "VERSION"]
    }
}
impl AsRef<str> for ImageVersionSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A SageMaker image. A SageMaker image represents a set of container images that are derived from a common base container image. Each of these container images is represented by a SageMaker <code>ImageVersion</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Image {
    /// <p>When the image was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The description of the image.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The name of the image as displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>When a create, update, or delete operation fails, the reason for the failure.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The ARN of the image.</p>
    #[doc(hidden)]
    pub image_arn: std::option::Option<std::string::String>,
    /// <p>The name of the image.</p>
    #[doc(hidden)]
    pub image_name: std::option::Option<std::string::String>,
    /// <p>The status of the image.</p>
    #[doc(hidden)]
    pub image_status: std::option::Option<crate::model::ImageStatus>,
    /// <p>When the image was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl Image {
    /// <p>When the image was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The description of the image.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The name of the image as displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>When a create, update, or delete operation fails, the reason for the failure.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The ARN of the image.</p>
    pub fn image_arn(&self) -> std::option::Option<&str> {
        self.image_arn.as_deref()
    }
    /// <p>The name of the image.</p>
    pub fn image_name(&self) -> std::option::Option<&str> {
        self.image_name.as_deref()
    }
    /// <p>The status of the image.</p>
    pub fn image_status(&self) -> std::option::Option<&crate::model::ImageStatus> {
        self.image_status.as_ref()
    }
    /// <p>When the image was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`Image`](crate::model::Image).
pub mod image {

    /// A builder for [`Image`](crate::model::Image).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) image_arn: std::option::Option<std::string::String>,
        pub(crate) image_name: std::option::Option<std::string::String>,
        pub(crate) image_status: std::option::Option<crate::model::ImageStatus>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>When the image was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the image was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The description of the image.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>The description of the image.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>The name of the image as displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the image as displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>When a create, update, or delete operation fails, the reason for the failure.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>When a create, update, or delete operation fails, the reason for the failure.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The ARN of the image.</p>
        pub fn image_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the image.</p>
        pub fn set_image_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_arn = input;
            self
        }
        /// <p>The name of the image.</p>
        pub fn image_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_name = Some(input.into());
            self
        }
        /// <p>The name of the image.</p>
        pub fn set_image_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_name = input;
            self
        }
        /// <p>The status of the image.</p>
        pub fn image_status(mut self, input: crate::model::ImageStatus) -> Self {
            self.image_status = Some(input);
            self
        }
        /// <p>The status of the image.</p>
        pub fn set_image_status(
            mut self,
            input: std::option::Option<crate::model::ImageStatus>,
        ) -> Self {
            self.image_status = input;
            self
        }
        /// <p>When the image was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the image was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`Image`](crate::model::Image).
        pub fn build(self) -> crate::model::Image {
            crate::model::Image {
                creation_time: self.creation_time,
                description: self.description,
                display_name: self.display_name,
                failure_reason: self.failure_reason,
                image_arn: self.image_arn,
                image_name: self.image_name,
                image_status: self.image_status,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl Image {
    /// Creates a new builder-style object to manufacture [`Image`](crate::model::Image).
    pub fn builder() -> crate::model::image::Builder {
        crate::model::image::Builder::default()
    }
}

/// When writing a match expression against `ImageStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let imagestatus = unimplemented!();
/// match imagestatus {
///     ImageStatus::Created => { /* ... */ },
///     ImageStatus::CreateFailed => { /* ... */ },
///     ImageStatus::Creating => { /* ... */ },
///     ImageStatus::DeleteFailed => { /* ... */ },
///     ImageStatus::Deleting => { /* ... */ },
///     ImageStatus::UpdateFailed => { /* ... */ },
///     ImageStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `imagestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ImageStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ImageStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ImageStatus::NewFeature` is defined.
/// Specifically, when `imagestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ImageStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ImageStatus {
    #[allow(missing_docs)] // documentation missing in model
    Created,
    #[allow(missing_docs)] // documentation missing in model
    CreateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    UpdateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ImageStatus {
    fn from(s: &str) -> Self {
        match s {
            "CREATED" => ImageStatus::Created,
            "CREATE_FAILED" => ImageStatus::CreateFailed,
            "CREATING" => ImageStatus::Creating,
            "DELETE_FAILED" => ImageStatus::DeleteFailed,
            "DELETING" => ImageStatus::Deleting,
            "UPDATE_FAILED" => ImageStatus::UpdateFailed,
            "UPDATING" => ImageStatus::Updating,
            other => ImageStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ImageStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ImageStatus::from(s))
    }
}
impl ImageStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ImageStatus::Created => "CREATED",
            ImageStatus::CreateFailed => "CREATE_FAILED",
            ImageStatus::Creating => "CREATING",
            ImageStatus::DeleteFailed => "DELETE_FAILED",
            ImageStatus::Deleting => "DELETING",
            ImageStatus::UpdateFailed => "UPDATE_FAILED",
            ImageStatus::Updating => "UPDATING",
            ImageStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CREATED",
            "CREATE_FAILED",
            "CREATING",
            "DELETE_FAILED",
            "DELETING",
            "UPDATE_FAILED",
            "UPDATING",
        ]
    }
}
impl AsRef<str> for ImageStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ImageSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let imagesortorder = unimplemented!();
/// match imagesortorder {
///     ImageSortOrder::Ascending => { /* ... */ },
///     ImageSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `imagesortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ImageSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ImageSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ImageSortOrder::NewFeature` is defined.
/// Specifically, when `imagesortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ImageSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ImageSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ImageSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "ASCENDING" => ImageSortOrder::Ascending,
            "DESCENDING" => ImageSortOrder::Descending,
            other => ImageSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ImageSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ImageSortOrder::from(s))
    }
}
impl ImageSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ImageSortOrder::Ascending => "ASCENDING",
            ImageSortOrder::Descending => "DESCENDING",
            ImageSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ASCENDING", "DESCENDING"]
    }
}
impl AsRef<str> for ImageSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ImageSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let imagesortby = unimplemented!();
/// match imagesortby {
///     ImageSortBy::CreationTime => { /* ... */ },
///     ImageSortBy::ImageName => { /* ... */ },
///     ImageSortBy::LastModifiedTime => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `imagesortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ImageSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ImageSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ImageSortBy::NewFeature` is defined.
/// Specifically, when `imagesortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ImageSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ImageSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    ImageName,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ImageSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CREATION_TIME" => ImageSortBy::CreationTime,
            "IMAGE_NAME" => ImageSortBy::ImageName,
            "LAST_MODIFIED_TIME" => ImageSortBy::LastModifiedTime,
            other => ImageSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ImageSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ImageSortBy::from(s))
    }
}
impl ImageSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ImageSortBy::CreationTime => "CREATION_TIME",
            ImageSortBy::ImageName => "IMAGE_NAME",
            ImageSortBy::LastModifiedTime => "LAST_MODIFIED_TIME",
            ImageSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CREATION_TIME", "IMAGE_NAME", "LAST_MODIFIED_TIME"]
    }
}
impl AsRef<str> for ImageSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about a hyperparameter tuning job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterTuningJobSummary {
    /// <p>The name of the tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_arn: std::option::Option<std::string::String>,
    /// <p>The status of the tuning job.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_job_status:
        std::option::Option<crate::model::HyperParameterTuningJobStatus>,
    /// <p>Specifies the search strategy hyperparameter tuning uses to choose which hyperparameters to evaluate at each iteration.</p>
    #[doc(hidden)]
    pub strategy: std::option::Option<crate::model::HyperParameterTuningJobStrategyType>,
    /// <p>The date and time that the tuning job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the tuning job ended.</p>
    #[doc(hidden)]
    pub hyper_parameter_tuning_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the tuning job was modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The <code>TrainingJobStatusCounters</code> object that specifies the numbers of training jobs, categorized by status, that this tuning job launched.</p>
    #[doc(hidden)]
    pub training_job_status_counters: std::option::Option<crate::model::TrainingJobStatusCounters>,
    /// <p>The <code>ObjectiveStatusCounters</code> object that specifies the numbers of training jobs, categorized by objective metric status, that this tuning job launched.</p>
    #[doc(hidden)]
    pub objective_status_counters: std::option::Option<crate::model::ObjectiveStatusCounters>,
    /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training jobs and parallel training jobs allowed for this tuning job.</p>
    #[doc(hidden)]
    pub resource_limits: std::option::Option<crate::model::ResourceLimits>,
}
impl HyperParameterTuningJobSummary {
    /// <p>The name of the tuning job.</p>
    pub fn hyper_parameter_tuning_job_name(&self) -> std::option::Option<&str> {
        self.hyper_parameter_tuning_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the tuning job.</p>
    pub fn hyper_parameter_tuning_job_arn(&self) -> std::option::Option<&str> {
        self.hyper_parameter_tuning_job_arn.as_deref()
    }
    /// <p>The status of the tuning job.</p>
    pub fn hyper_parameter_tuning_job_status(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobStatus> {
        self.hyper_parameter_tuning_job_status.as_ref()
    }
    /// <p>Specifies the search strategy hyperparameter tuning uses to choose which hyperparameters to evaluate at each iteration.</p>
    pub fn strategy(
        &self,
    ) -> std::option::Option<&crate::model::HyperParameterTuningJobStrategyType> {
        self.strategy.as_ref()
    }
    /// <p>The date and time that the tuning job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The date and time that the tuning job ended.</p>
    pub fn hyper_parameter_tuning_end_time(
        &self,
    ) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.hyper_parameter_tuning_end_time.as_ref()
    }
    /// <p>The date and time that the tuning job was modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The <code>TrainingJobStatusCounters</code> object that specifies the numbers of training jobs, categorized by status, that this tuning job launched.</p>
    pub fn training_job_status_counters(
        &self,
    ) -> std::option::Option<&crate::model::TrainingJobStatusCounters> {
        self.training_job_status_counters.as_ref()
    }
    /// <p>The <code>ObjectiveStatusCounters</code> object that specifies the numbers of training jobs, categorized by objective metric status, that this tuning job launched.</p>
    pub fn objective_status_counters(
        &self,
    ) -> std::option::Option<&crate::model::ObjectiveStatusCounters> {
        self.objective_status_counters.as_ref()
    }
    /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training jobs and parallel training jobs allowed for this tuning job.</p>
    pub fn resource_limits(&self) -> std::option::Option<&crate::model::ResourceLimits> {
        self.resource_limits.as_ref()
    }
}
/// See [`HyperParameterTuningJobSummary`](crate::model::HyperParameterTuningJobSummary).
pub mod hyper_parameter_tuning_job_summary {

    /// A builder for [`HyperParameterTuningJobSummary`](crate::model::HyperParameterTuningJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) hyper_parameter_tuning_job_name: std::option::Option<std::string::String>,
        pub(crate) hyper_parameter_tuning_job_arn: std::option::Option<std::string::String>,
        pub(crate) hyper_parameter_tuning_job_status:
            std::option::Option<crate::model::HyperParameterTuningJobStatus>,
        pub(crate) strategy: std::option::Option<crate::model::HyperParameterTuningJobStrategyType>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) hyper_parameter_tuning_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) training_job_status_counters:
            std::option::Option<crate::model::TrainingJobStatusCounters>,
        pub(crate) objective_status_counters:
            std::option::Option<crate::model::ObjectiveStatusCounters>,
        pub(crate) resource_limits: std::option::Option<crate::model::ResourceLimits>,
    }
    impl Builder {
        /// <p>The name of the tuning job.</p>
        pub fn hyper_parameter_tuning_job_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_name = Some(input.into());
            self
        }
        /// <p>The name of the tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the tuning job.</p>
        pub fn hyper_parameter_tuning_job_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hyper_parameter_tuning_job_arn = input;
            self
        }
        /// <p>The status of the tuning job.</p>
        pub fn hyper_parameter_tuning_job_status(
            mut self,
            input: crate::model::HyperParameterTuningJobStatus,
        ) -> Self {
            self.hyper_parameter_tuning_job_status = Some(input);
            self
        }
        /// <p>The status of the tuning job.</p>
        pub fn set_hyper_parameter_tuning_job_status(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobStatus>,
        ) -> Self {
            self.hyper_parameter_tuning_job_status = input;
            self
        }
        /// <p>Specifies the search strategy hyperparameter tuning uses to choose which hyperparameters to evaluate at each iteration.</p>
        pub fn strategy(
            mut self,
            input: crate::model::HyperParameterTuningJobStrategyType,
        ) -> Self {
            self.strategy = Some(input);
            self
        }
        /// <p>Specifies the search strategy hyperparameter tuning uses to choose which hyperparameters to evaluate at each iteration.</p>
        pub fn set_strategy(
            mut self,
            input: std::option::Option<crate::model::HyperParameterTuningJobStrategyType>,
        ) -> Self {
            self.strategy = input;
            self
        }
        /// <p>The date and time that the tuning job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the tuning job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The date and time that the tuning job ended.</p>
        pub fn hyper_parameter_tuning_end_time(
            mut self,
            input: aws_smithy_types::DateTime,
        ) -> Self {
            self.hyper_parameter_tuning_end_time = Some(input);
            self
        }
        /// <p>The date and time that the tuning job ended.</p>
        pub fn set_hyper_parameter_tuning_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.hyper_parameter_tuning_end_time = input;
            self
        }
        /// <p>The date and time that the tuning job was modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The date and time that the tuning job was modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The <code>TrainingJobStatusCounters</code> object that specifies the numbers of training jobs, categorized by status, that this tuning job launched.</p>
        pub fn training_job_status_counters(
            mut self,
            input: crate::model::TrainingJobStatusCounters,
        ) -> Self {
            self.training_job_status_counters = Some(input);
            self
        }
        /// <p>The <code>TrainingJobStatusCounters</code> object that specifies the numbers of training jobs, categorized by status, that this tuning job launched.</p>
        pub fn set_training_job_status_counters(
            mut self,
            input: std::option::Option<crate::model::TrainingJobStatusCounters>,
        ) -> Self {
            self.training_job_status_counters = input;
            self
        }
        /// <p>The <code>ObjectiveStatusCounters</code> object that specifies the numbers of training jobs, categorized by objective metric status, that this tuning job launched.</p>
        pub fn objective_status_counters(
            mut self,
            input: crate::model::ObjectiveStatusCounters,
        ) -> Self {
            self.objective_status_counters = Some(input);
            self
        }
        /// <p>The <code>ObjectiveStatusCounters</code> object that specifies the numbers of training jobs, categorized by objective metric status, that this tuning job launched.</p>
        pub fn set_objective_status_counters(
            mut self,
            input: std::option::Option<crate::model::ObjectiveStatusCounters>,
        ) -> Self {
            self.objective_status_counters = input;
            self
        }
        /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training jobs and parallel training jobs allowed for this tuning job.</p>
        pub fn resource_limits(mut self, input: crate::model::ResourceLimits) -> Self {
            self.resource_limits = Some(input);
            self
        }
        /// <p>The <code>ResourceLimits</code> object that specifies the maximum number of training jobs and parallel training jobs allowed for this tuning job.</p>
        pub fn set_resource_limits(
            mut self,
            input: std::option::Option<crate::model::ResourceLimits>,
        ) -> Self {
            self.resource_limits = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterTuningJobSummary`](crate::model::HyperParameterTuningJobSummary).
        pub fn build(self) -> crate::model::HyperParameterTuningJobSummary {
            crate::model::HyperParameterTuningJobSummary {
                hyper_parameter_tuning_job_name: self.hyper_parameter_tuning_job_name,
                hyper_parameter_tuning_job_arn: self.hyper_parameter_tuning_job_arn,
                hyper_parameter_tuning_job_status: self.hyper_parameter_tuning_job_status,
                strategy: self.strategy,
                creation_time: self.creation_time,
                hyper_parameter_tuning_end_time: self.hyper_parameter_tuning_end_time,
                last_modified_time: self.last_modified_time,
                training_job_status_counters: self.training_job_status_counters,
                objective_status_counters: self.objective_status_counters,
                resource_limits: self.resource_limits,
            }
        }
    }
}
impl HyperParameterTuningJobSummary {
    /// Creates a new builder-style object to manufacture [`HyperParameterTuningJobSummary`](crate::model::HyperParameterTuningJobSummary).
    pub fn builder() -> crate::model::hyper_parameter_tuning_job_summary::Builder {
        crate::model::hyper_parameter_tuning_job_summary::Builder::default()
    }
}

/// When writing a match expression against `HyperParameterTuningJobSortByOptions`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hyperparametertuningjobsortbyoptions = unimplemented!();
/// match hyperparametertuningjobsortbyoptions {
///     HyperParameterTuningJobSortByOptions::CreationTime => { /* ... */ },
///     HyperParameterTuningJobSortByOptions::Name => { /* ... */ },
///     HyperParameterTuningJobSortByOptions::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hyperparametertuningjobsortbyoptions` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HyperParameterTuningJobSortByOptions::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HyperParameterTuningJobSortByOptions::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HyperParameterTuningJobSortByOptions::NewFeature` is defined.
/// Specifically, when `hyperparametertuningjobsortbyoptions` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HyperParameterTuningJobSortByOptions::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HyperParameterTuningJobSortByOptions {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HyperParameterTuningJobSortByOptions {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => HyperParameterTuningJobSortByOptions::CreationTime,
            "Name" => HyperParameterTuningJobSortByOptions::Name,
            "Status" => HyperParameterTuningJobSortByOptions::Status,
            other => HyperParameterTuningJobSortByOptions::Unknown(
                crate::types::UnknownVariantValue(other.to_owned()),
            ),
        }
    }
}
impl std::str::FromStr for HyperParameterTuningJobSortByOptions {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HyperParameterTuningJobSortByOptions::from(s))
    }
}
impl HyperParameterTuningJobSortByOptions {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HyperParameterTuningJobSortByOptions::CreationTime => "CreationTime",
            HyperParameterTuningJobSortByOptions::Name => "Name",
            HyperParameterTuningJobSortByOptions::Status => "Status",
            HyperParameterTuningJobSortByOptions::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for HyperParameterTuningJobSortByOptions {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Container for human task user interface information.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HumanTaskUiSummary {
    /// <p>The name of the human task user interface.</p>
    #[doc(hidden)]
    pub human_task_ui_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
    #[doc(hidden)]
    pub human_task_ui_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp when SageMaker created the human task user interface.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl HumanTaskUiSummary {
    /// <p>The name of the human task user interface.</p>
    pub fn human_task_ui_name(&self) -> std::option::Option<&str> {
        self.human_task_ui_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
    pub fn human_task_ui_arn(&self) -> std::option::Option<&str> {
        self.human_task_ui_arn.as_deref()
    }
    /// <p>A timestamp when SageMaker created the human task user interface.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
}
/// See [`HumanTaskUiSummary`](crate::model::HumanTaskUiSummary).
pub mod human_task_ui_summary {

    /// A builder for [`HumanTaskUiSummary`](crate::model::HumanTaskUiSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) human_task_ui_name: std::option::Option<std::string::String>,
        pub(crate) human_task_ui_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the human task user interface.</p>
        pub fn human_task_ui_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.human_task_ui_name = Some(input.into());
            self
        }
        /// <p>The name of the human task user interface.</p>
        pub fn set_human_task_ui_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.human_task_ui_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
        pub fn human_task_ui_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.human_task_ui_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
        pub fn set_human_task_ui_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.human_task_ui_arn = input;
            self
        }
        /// <p>A timestamp when SageMaker created the human task user interface.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp when SageMaker created the human task user interface.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// Consumes the builder and constructs a [`HumanTaskUiSummary`](crate::model::HumanTaskUiSummary).
        pub fn build(self) -> crate::model::HumanTaskUiSummary {
            crate::model::HumanTaskUiSummary {
                human_task_ui_name: self.human_task_ui_name,
                human_task_ui_arn: self.human_task_ui_arn,
                creation_time: self.creation_time,
            }
        }
    }
}
impl HumanTaskUiSummary {
    /// Creates a new builder-style object to manufacture [`HumanTaskUiSummary`](crate::model::HumanTaskUiSummary).
    pub fn builder() -> crate::model::human_task_ui_summary::Builder {
        crate::model::human_task_ui_summary::Builder::default()
    }
}

/// <p>Information about a hub.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HubInfo {
    /// <p>The name of the hub.</p>
    #[doc(hidden)]
    pub hub_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the hub.</p>
    #[doc(hidden)]
    pub hub_arn: std::option::Option<std::string::String>,
    /// <p>The display name of the hub.</p>
    #[doc(hidden)]
    pub hub_display_name: std::option::Option<std::string::String>,
    /// <p>A description of the hub.</p>
    #[doc(hidden)]
    pub hub_description: std::option::Option<std::string::String>,
    /// <p>The searchable keywords for the hub.</p>
    #[doc(hidden)]
    pub hub_search_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The status of the hub.</p>
    #[doc(hidden)]
    pub hub_status: std::option::Option<crate::model::HubStatus>,
    /// <p>The date and time that the hub was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the hub was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl HubInfo {
    /// <p>The name of the hub.</p>
    pub fn hub_name(&self) -> std::option::Option<&str> {
        self.hub_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the hub.</p>
    pub fn hub_arn(&self) -> std::option::Option<&str> {
        self.hub_arn.as_deref()
    }
    /// <p>The display name of the hub.</p>
    pub fn hub_display_name(&self) -> std::option::Option<&str> {
        self.hub_display_name.as_deref()
    }
    /// <p>A description of the hub.</p>
    pub fn hub_description(&self) -> std::option::Option<&str> {
        self.hub_description.as_deref()
    }
    /// <p>The searchable keywords for the hub.</p>
    pub fn hub_search_keywords(&self) -> std::option::Option<&[std::string::String]> {
        self.hub_search_keywords.as_deref()
    }
    /// <p>The status of the hub.</p>
    pub fn hub_status(&self) -> std::option::Option<&crate::model::HubStatus> {
        self.hub_status.as_ref()
    }
    /// <p>The date and time that the hub was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The date and time that the hub was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`HubInfo`](crate::model::HubInfo).
pub mod hub_info {

    /// A builder for [`HubInfo`](crate::model::HubInfo).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) hub_name: std::option::Option<std::string::String>,
        pub(crate) hub_arn: std::option::Option<std::string::String>,
        pub(crate) hub_display_name: std::option::Option<std::string::String>,
        pub(crate) hub_description: std::option::Option<std::string::String>,
        pub(crate) hub_search_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) hub_status: std::option::Option<crate::model::HubStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the hub.</p>
        pub fn hub_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_name = Some(input.into());
            self
        }
        /// <p>The name of the hub.</p>
        pub fn set_hub_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.hub_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the hub.</p>
        pub fn hub_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the hub.</p>
        pub fn set_hub_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.hub_arn = input;
            self
        }
        /// <p>The display name of the hub.</p>
        pub fn hub_display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the hub.</p>
        pub fn set_hub_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_display_name = input;
            self
        }
        /// <p>A description of the hub.</p>
        pub fn hub_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_description = Some(input.into());
            self
        }
        /// <p>A description of the hub.</p>
        pub fn set_hub_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_description = input;
            self
        }
        /// Appends an item to `hub_search_keywords`.
        ///
        /// To override the contents of this collection use [`set_hub_search_keywords`](Self::set_hub_search_keywords).
        ///
        /// <p>The searchable keywords for the hub.</p>
        pub fn hub_search_keywords(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.hub_search_keywords.unwrap_or_default();
            v.push(input.into());
            self.hub_search_keywords = Some(v);
            self
        }
        /// <p>The searchable keywords for the hub.</p>
        pub fn set_hub_search_keywords(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.hub_search_keywords = input;
            self
        }
        /// <p>The status of the hub.</p>
        pub fn hub_status(mut self, input: crate::model::HubStatus) -> Self {
            self.hub_status = Some(input);
            self
        }
        /// <p>The status of the hub.</p>
        pub fn set_hub_status(
            mut self,
            input: std::option::Option<crate::model::HubStatus>,
        ) -> Self {
            self.hub_status = input;
            self
        }
        /// <p>The date and time that the hub was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the hub was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The date and time that the hub was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The date and time that the hub was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`HubInfo`](crate::model::HubInfo).
        pub fn build(self) -> crate::model::HubInfo {
            crate::model::HubInfo {
                hub_name: self.hub_name,
                hub_arn: self.hub_arn,
                hub_display_name: self.hub_display_name,
                hub_description: self.hub_description,
                hub_search_keywords: self.hub_search_keywords,
                hub_status: self.hub_status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl HubInfo {
    /// Creates a new builder-style object to manufacture [`HubInfo`](crate::model::HubInfo).
    pub fn builder() -> crate::model::hub_info::Builder {
        crate::model::hub_info::Builder::default()
    }
}

/// When writing a match expression against `HubStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hubstatus = unimplemented!();
/// match hubstatus {
///     HubStatus::CreateFailed => { /* ... */ },
///     HubStatus::Creating => { /* ... */ },
///     HubStatus::DeleteFailed => { /* ... */ },
///     HubStatus::Deleting => { /* ... */ },
///     HubStatus::InService => { /* ... */ },
///     HubStatus::UpdateFailed => { /* ... */ },
///     HubStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hubstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HubStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HubStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HubStatus::NewFeature` is defined.
/// Specifically, when `hubstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HubStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HubStatus {
    #[allow(missing_docs)] // documentation missing in model
    CreateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    UpdateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HubStatus {
    fn from(s: &str) -> Self {
        match s {
            "CreateFailed" => HubStatus::CreateFailed,
            "Creating" => HubStatus::Creating,
            "DeleteFailed" => HubStatus::DeleteFailed,
            "Deleting" => HubStatus::Deleting,
            "InService" => HubStatus::InService,
            "UpdateFailed" => HubStatus::UpdateFailed,
            "Updating" => HubStatus::Updating,
            other => HubStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for HubStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HubStatus::from(s))
    }
}
impl HubStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HubStatus::CreateFailed => "CreateFailed",
            HubStatus::Creating => "Creating",
            HubStatus::DeleteFailed => "DeleteFailed",
            HubStatus::Deleting => "Deleting",
            HubStatus::InService => "InService",
            HubStatus::UpdateFailed => "UpdateFailed",
            HubStatus::Updating => "Updating",
            HubStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CreateFailed",
            "Creating",
            "DeleteFailed",
            "Deleting",
            "InService",
            "UpdateFailed",
            "Updating",
        ]
    }
}
impl AsRef<str> for HubStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `HubSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hubsortby = unimplemented!();
/// match hubsortby {
///     HubSortBy::AccountIdOwner => { /* ... */ },
///     HubSortBy::CreationTime => { /* ... */ },
///     HubSortBy::HubName => { /* ... */ },
///     HubSortBy::HubStatus => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hubsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HubSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HubSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HubSortBy::NewFeature` is defined.
/// Specifically, when `hubsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HubSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HubSortBy {
    #[allow(missing_docs)] // documentation missing in model
    AccountIdOwner,
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    HubName,
    #[allow(missing_docs)] // documentation missing in model
    HubStatus,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HubSortBy {
    fn from(s: &str) -> Self {
        match s {
            "AccountIdOwner" => HubSortBy::AccountIdOwner,
            "CreationTime" => HubSortBy::CreationTime,
            "HubName" => HubSortBy::HubName,
            "HubStatus" => HubSortBy::HubStatus,
            other => HubSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for HubSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HubSortBy::from(s))
    }
}
impl HubSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HubSortBy::AccountIdOwner => "AccountIdOwner",
            HubSortBy::CreationTime => "CreationTime",
            HubSortBy::HubName => "HubName",
            HubSortBy::HubStatus => "HubStatus",
            HubSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["AccountIdOwner", "CreationTime", "HubName", "HubStatus"]
    }
}
impl AsRef<str> for HubSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Information about hub content.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HubContentInfo {
    /// <p>The name of the hub content.</p>
    #[doc(hidden)]
    pub hub_content_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the hub content.</p>
    #[doc(hidden)]
    pub hub_content_arn: std::option::Option<std::string::String>,
    /// <p>The version of the hub content.</p>
    #[doc(hidden)]
    pub hub_content_version: std::option::Option<std::string::String>,
    /// <p>The type of hub content.</p>
    #[doc(hidden)]
    pub hub_content_type: std::option::Option<crate::model::HubContentType>,
    /// <p>The version of the hub content document schema.</p>
    #[doc(hidden)]
    pub document_schema_version: std::option::Option<std::string::String>,
    /// <p>The display name of the hub content.</p>
    #[doc(hidden)]
    pub hub_content_display_name: std::option::Option<std::string::String>,
    /// <p>A description of the hub content.</p>
    #[doc(hidden)]
    pub hub_content_description: std::option::Option<std::string::String>,
    /// <p>The searchable keywords for the hub content.</p>
    #[doc(hidden)]
    pub hub_content_search_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The status of the hub content.</p>
    #[doc(hidden)]
    pub hub_content_status: std::option::Option<crate::model::HubContentStatus>,
    /// <p>The date and time that the hub content was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl HubContentInfo {
    /// <p>The name of the hub content.</p>
    pub fn hub_content_name(&self) -> std::option::Option<&str> {
        self.hub_content_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the hub content.</p>
    pub fn hub_content_arn(&self) -> std::option::Option<&str> {
        self.hub_content_arn.as_deref()
    }
    /// <p>The version of the hub content.</p>
    pub fn hub_content_version(&self) -> std::option::Option<&str> {
        self.hub_content_version.as_deref()
    }
    /// <p>The type of hub content.</p>
    pub fn hub_content_type(&self) -> std::option::Option<&crate::model::HubContentType> {
        self.hub_content_type.as_ref()
    }
    /// <p>The version of the hub content document schema.</p>
    pub fn document_schema_version(&self) -> std::option::Option<&str> {
        self.document_schema_version.as_deref()
    }
    /// <p>The display name of the hub content.</p>
    pub fn hub_content_display_name(&self) -> std::option::Option<&str> {
        self.hub_content_display_name.as_deref()
    }
    /// <p>A description of the hub content.</p>
    pub fn hub_content_description(&self) -> std::option::Option<&str> {
        self.hub_content_description.as_deref()
    }
    /// <p>The searchable keywords for the hub content.</p>
    pub fn hub_content_search_keywords(&self) -> std::option::Option<&[std::string::String]> {
        self.hub_content_search_keywords.as_deref()
    }
    /// <p>The status of the hub content.</p>
    pub fn hub_content_status(&self) -> std::option::Option<&crate::model::HubContentStatus> {
        self.hub_content_status.as_ref()
    }
    /// <p>The date and time that the hub content was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
}
/// See [`HubContentInfo`](crate::model::HubContentInfo).
pub mod hub_content_info {

    /// A builder for [`HubContentInfo`](crate::model::HubContentInfo).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) hub_content_name: std::option::Option<std::string::String>,
        pub(crate) hub_content_arn: std::option::Option<std::string::String>,
        pub(crate) hub_content_version: std::option::Option<std::string::String>,
        pub(crate) hub_content_type: std::option::Option<crate::model::HubContentType>,
        pub(crate) document_schema_version: std::option::Option<std::string::String>,
        pub(crate) hub_content_display_name: std::option::Option<std::string::String>,
        pub(crate) hub_content_description: std::option::Option<std::string::String>,
        pub(crate) hub_content_search_keywords:
            std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) hub_content_status: std::option::Option<crate::model::HubContentStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the hub content.</p>
        pub fn hub_content_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_content_name = Some(input.into());
            self
        }
        /// <p>The name of the hub content.</p>
        pub fn set_hub_content_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_content_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the hub content.</p>
        pub fn hub_content_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_content_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the hub content.</p>
        pub fn set_hub_content_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_content_arn = input;
            self
        }
        /// <p>The version of the hub content.</p>
        pub fn hub_content_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_content_version = Some(input.into());
            self
        }
        /// <p>The version of the hub content.</p>
        pub fn set_hub_content_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_content_version = input;
            self
        }
        /// <p>The type of hub content.</p>
        pub fn hub_content_type(mut self, input: crate::model::HubContentType) -> Self {
            self.hub_content_type = Some(input);
            self
        }
        /// <p>The type of hub content.</p>
        pub fn set_hub_content_type(
            mut self,
            input: std::option::Option<crate::model::HubContentType>,
        ) -> Self {
            self.hub_content_type = input;
            self
        }
        /// <p>The version of the hub content document schema.</p>
        pub fn document_schema_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.document_schema_version = Some(input.into());
            self
        }
        /// <p>The version of the hub content document schema.</p>
        pub fn set_document_schema_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.document_schema_version = input;
            self
        }
        /// <p>The display name of the hub content.</p>
        pub fn hub_content_display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_content_display_name = Some(input.into());
            self
        }
        /// <p>The display name of the hub content.</p>
        pub fn set_hub_content_display_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_content_display_name = input;
            self
        }
        /// <p>A description of the hub content.</p>
        pub fn hub_content_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.hub_content_description = Some(input.into());
            self
        }
        /// <p>A description of the hub content.</p>
        pub fn set_hub_content_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.hub_content_description = input;
            self
        }
        /// Appends an item to `hub_content_search_keywords`.
        ///
        /// To override the contents of this collection use [`set_hub_content_search_keywords`](Self::set_hub_content_search_keywords).
        ///
        /// <p>The searchable keywords for the hub content.</p>
        pub fn hub_content_search_keywords(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            let mut v = self.hub_content_search_keywords.unwrap_or_default();
            v.push(input.into());
            self.hub_content_search_keywords = Some(v);
            self
        }
        /// <p>The searchable keywords for the hub content.</p>
        pub fn set_hub_content_search_keywords(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.hub_content_search_keywords = input;
            self
        }
        /// <p>The status of the hub content.</p>
        pub fn hub_content_status(mut self, input: crate::model::HubContentStatus) -> Self {
            self.hub_content_status = Some(input);
            self
        }
        /// <p>The status of the hub content.</p>
        pub fn set_hub_content_status(
            mut self,
            input: std::option::Option<crate::model::HubContentStatus>,
        ) -> Self {
            self.hub_content_status = input;
            self
        }
        /// <p>The date and time that the hub content was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the hub content was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// Consumes the builder and constructs a [`HubContentInfo`](crate::model::HubContentInfo).
        pub fn build(self) -> crate::model::HubContentInfo {
            crate::model::HubContentInfo {
                hub_content_name: self.hub_content_name,
                hub_content_arn: self.hub_content_arn,
                hub_content_version: self.hub_content_version,
                hub_content_type: self.hub_content_type,
                document_schema_version: self.document_schema_version,
                hub_content_display_name: self.hub_content_display_name,
                hub_content_description: self.hub_content_description,
                hub_content_search_keywords: self.hub_content_search_keywords,
                hub_content_status: self.hub_content_status,
                creation_time: self.creation_time,
            }
        }
    }
}
impl HubContentInfo {
    /// Creates a new builder-style object to manufacture [`HubContentInfo`](crate::model::HubContentInfo).
    pub fn builder() -> crate::model::hub_content_info::Builder {
        crate::model::hub_content_info::Builder::default()
    }
}

/// When writing a match expression against `HubContentStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hubcontentstatus = unimplemented!();
/// match hubcontentstatus {
///     HubContentStatus::Available => { /* ... */ },
///     HubContentStatus::DeleteFailed => { /* ... */ },
///     HubContentStatus::Deleting => { /* ... */ },
///     HubContentStatus::ImportFailed => { /* ... */ },
///     HubContentStatus::Importing => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hubcontentstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HubContentStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HubContentStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HubContentStatus::NewFeature` is defined.
/// Specifically, when `hubcontentstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HubContentStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HubContentStatus {
    #[allow(missing_docs)] // documentation missing in model
    Available,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    ImportFailed,
    #[allow(missing_docs)] // documentation missing in model
    Importing,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HubContentStatus {
    fn from(s: &str) -> Self {
        match s {
            "Available" => HubContentStatus::Available,
            "DeleteFailed" => HubContentStatus::DeleteFailed,
            "Deleting" => HubContentStatus::Deleting,
            "ImportFailed" => HubContentStatus::ImportFailed,
            "Importing" => HubContentStatus::Importing,
            other => HubContentStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for HubContentStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HubContentStatus::from(s))
    }
}
impl HubContentStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HubContentStatus::Available => "Available",
            HubContentStatus::DeleteFailed => "DeleteFailed",
            HubContentStatus::Deleting => "Deleting",
            HubContentStatus::ImportFailed => "ImportFailed",
            HubContentStatus::Importing => "Importing",
            HubContentStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Available",
            "DeleteFailed",
            "Deleting",
            "ImportFailed",
            "Importing",
        ]
    }
}
impl AsRef<str> for HubContentStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `HubContentType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hubcontenttype = unimplemented!();
/// match hubcontenttype {
///     HubContentType::Model => { /* ... */ },
///     HubContentType::Notebook => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hubcontenttype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HubContentType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HubContentType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HubContentType::NewFeature` is defined.
/// Specifically, when `hubcontenttype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HubContentType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HubContentType {
    #[allow(missing_docs)] // documentation missing in model
    Model,
    #[allow(missing_docs)] // documentation missing in model
    Notebook,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HubContentType {
    fn from(s: &str) -> Self {
        match s {
            "Model" => HubContentType::Model,
            "Notebook" => HubContentType::Notebook,
            other => HubContentType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for HubContentType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HubContentType::from(s))
    }
}
impl HubContentType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HubContentType::Model => "Model",
            HubContentType::Notebook => "Notebook",
            HubContentType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Model", "Notebook"]
    }
}
impl AsRef<str> for HubContentType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `HubContentSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let hubcontentsortby = unimplemented!();
/// match hubcontentsortby {
///     HubContentSortBy::CreationTime => { /* ... */ },
///     HubContentSortBy::HubContentName => { /* ... */ },
///     HubContentSortBy::HubContentStatus => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `hubcontentsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HubContentSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HubContentSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HubContentSortBy::NewFeature` is defined.
/// Specifically, when `hubcontentsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HubContentSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HubContentSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    HubContentName,
    #[allow(missing_docs)] // documentation missing in model
    HubContentStatus,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HubContentSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => HubContentSortBy::CreationTime,
            "HubContentName" => HubContentSortBy::HubContentName,
            "HubContentStatus" => HubContentSortBy::HubContentStatus,
            other => HubContentSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for HubContentSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HubContentSortBy::from(s))
    }
}
impl HubContentSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HubContentSortBy::CreationTime => "CreationTime",
            HubContentSortBy::HubContentName => "HubContentName",
            HubContentSortBy::HubContentStatus => "HubContentStatus",
            HubContentSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "HubContentName", "HubContentStatus"]
    }
}
impl AsRef<str> for HubContentSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains summary information about the flow definition.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FlowDefinitionSummary {
    /// <p>The name of the flow definition.</p>
    #[doc(hidden)]
    pub flow_definition_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the flow definition.</p>
    #[doc(hidden)]
    pub flow_definition_arn: std::option::Option<std::string::String>,
    /// <p>The status of the flow definition. Valid values:</p>
    #[doc(hidden)]
    pub flow_definition_status: std::option::Option<crate::model::FlowDefinitionStatus>,
    /// <p>The timestamp when SageMaker created the flow definition.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The reason why the flow definition creation failed. A failure reason is returned only when the flow definition status is <code>Failed</code>.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl FlowDefinitionSummary {
    /// <p>The name of the flow definition.</p>
    pub fn flow_definition_name(&self) -> std::option::Option<&str> {
        self.flow_definition_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the flow definition.</p>
    pub fn flow_definition_arn(&self) -> std::option::Option<&str> {
        self.flow_definition_arn.as_deref()
    }
    /// <p>The status of the flow definition. Valid values:</p>
    pub fn flow_definition_status(
        &self,
    ) -> std::option::Option<&crate::model::FlowDefinitionStatus> {
        self.flow_definition_status.as_ref()
    }
    /// <p>The timestamp when SageMaker created the flow definition.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The reason why the flow definition creation failed. A failure reason is returned only when the flow definition status is <code>Failed</code>.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`FlowDefinitionSummary`](crate::model::FlowDefinitionSummary).
pub mod flow_definition_summary {

    /// A builder for [`FlowDefinitionSummary`](crate::model::FlowDefinitionSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) flow_definition_name: std::option::Option<std::string::String>,
        pub(crate) flow_definition_arn: std::option::Option<std::string::String>,
        pub(crate) flow_definition_status: std::option::Option<crate::model::FlowDefinitionStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the flow definition.</p>
        pub fn flow_definition_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.flow_definition_name = Some(input.into());
            self
        }
        /// <p>The name of the flow definition.</p>
        pub fn set_flow_definition_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.flow_definition_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the flow definition.</p>
        pub fn flow_definition_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.flow_definition_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the flow definition.</p>
        pub fn set_flow_definition_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.flow_definition_arn = input;
            self
        }
        /// <p>The status of the flow definition. Valid values:</p>
        pub fn flow_definition_status(mut self, input: crate::model::FlowDefinitionStatus) -> Self {
            self.flow_definition_status = Some(input);
            self
        }
        /// <p>The status of the flow definition. Valid values:</p>
        pub fn set_flow_definition_status(
            mut self,
            input: std::option::Option<crate::model::FlowDefinitionStatus>,
        ) -> Self {
            self.flow_definition_status = input;
            self
        }
        /// <p>The timestamp when SageMaker created the flow definition.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The timestamp when SageMaker created the flow definition.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The reason why the flow definition creation failed. A failure reason is returned only when the flow definition status is <code>Failed</code>.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The reason why the flow definition creation failed. A failure reason is returned only when the flow definition status is <code>Failed</code>.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`FlowDefinitionSummary`](crate::model::FlowDefinitionSummary).
        pub fn build(self) -> crate::model::FlowDefinitionSummary {
            crate::model::FlowDefinitionSummary {
                flow_definition_name: self.flow_definition_name,
                flow_definition_arn: self.flow_definition_arn,
                flow_definition_status: self.flow_definition_status,
                creation_time: self.creation_time,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl FlowDefinitionSummary {
    /// Creates a new builder-style object to manufacture [`FlowDefinitionSummary`](crate::model::FlowDefinitionSummary).
    pub fn builder() -> crate::model::flow_definition_summary::Builder {
        crate::model::flow_definition_summary::Builder::default()
    }
}

/// When writing a match expression against `FlowDefinitionStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let flowdefinitionstatus = unimplemented!();
/// match flowdefinitionstatus {
///     FlowDefinitionStatus::Active => { /* ... */ },
///     FlowDefinitionStatus::Deleting => { /* ... */ },
///     FlowDefinitionStatus::Failed => { /* ... */ },
///     FlowDefinitionStatus::Initializing => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `flowdefinitionstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FlowDefinitionStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FlowDefinitionStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FlowDefinitionStatus::NewFeature` is defined.
/// Specifically, when `flowdefinitionstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FlowDefinitionStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FlowDefinitionStatus {
    #[allow(missing_docs)] // documentation missing in model
    Active,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Initializing,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FlowDefinitionStatus {
    fn from(s: &str) -> Self {
        match s {
            "Active" => FlowDefinitionStatus::Active,
            "Deleting" => FlowDefinitionStatus::Deleting,
            "Failed" => FlowDefinitionStatus::Failed,
            "Initializing" => FlowDefinitionStatus::Initializing,
            other => {
                FlowDefinitionStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for FlowDefinitionStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FlowDefinitionStatus::from(s))
    }
}
impl FlowDefinitionStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FlowDefinitionStatus::Active => "Active",
            FlowDefinitionStatus::Deleting => "Deleting",
            FlowDefinitionStatus::Failed => "Failed",
            FlowDefinitionStatus::Initializing => "Initializing",
            FlowDefinitionStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Active", "Deleting", "Failed", "Initializing"]
    }
}
impl AsRef<str> for FlowDefinitionStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The name, Arn, <code>CreationTime</code>, <code>FeatureGroup</code> values, <code>LastUpdatedTime</code> and <code>EnableOnlineStorage</code> status of a <code>FeatureGroup</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FeatureGroupSummary {
    /// <p>The name of <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub feature_group_name: std::option::Option<std::string::String>,
    /// <p>Unique identifier for the <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub feature_group_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp indicating the time of creation time of the <code>FeatureGroup</code>.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of a FeatureGroup. The status can be any of the following: <code>Creating</code>, <code>Created</code>, <code>CreateFail</code>, <code>Deleting</code> or <code>DetailFail</code>. </p>
    #[doc(hidden)]
    pub feature_group_status: std::option::Option<crate::model::FeatureGroupStatus>,
    /// <p>Notifies you if replicating data into the <code>OfflineStore</code> has failed. Returns either: <code>Active</code> or <code>Blocked</code>.</p>
    #[doc(hidden)]
    pub offline_store_status: std::option::Option<crate::model::OfflineStoreStatus>,
}
impl FeatureGroupSummary {
    /// <p>The name of <code>FeatureGroup</code>.</p>
    pub fn feature_group_name(&self) -> std::option::Option<&str> {
        self.feature_group_name.as_deref()
    }
    /// <p>Unique identifier for the <code>FeatureGroup</code>.</p>
    pub fn feature_group_arn(&self) -> std::option::Option<&str> {
        self.feature_group_arn.as_deref()
    }
    /// <p>A timestamp indicating the time of creation time of the <code>FeatureGroup</code>.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The status of a FeatureGroup. The status can be any of the following: <code>Creating</code>, <code>Created</code>, <code>CreateFail</code>, <code>Deleting</code> or <code>DetailFail</code>. </p>
    pub fn feature_group_status(&self) -> std::option::Option<&crate::model::FeatureGroupStatus> {
        self.feature_group_status.as_ref()
    }
    /// <p>Notifies you if replicating data into the <code>OfflineStore</code> has failed. Returns either: <code>Active</code> or <code>Blocked</code>.</p>
    pub fn offline_store_status(&self) -> std::option::Option<&crate::model::OfflineStoreStatus> {
        self.offline_store_status.as_ref()
    }
}
/// See [`FeatureGroupSummary`](crate::model::FeatureGroupSummary).
pub mod feature_group_summary {

    /// A builder for [`FeatureGroupSummary`](crate::model::FeatureGroupSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) feature_group_name: std::option::Option<std::string::String>,
        pub(crate) feature_group_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) feature_group_status: std::option::Option<crate::model::FeatureGroupStatus>,
        pub(crate) offline_store_status: std::option::Option<crate::model::OfflineStoreStatus>,
    }
    impl Builder {
        /// <p>The name of <code>FeatureGroup</code>.</p>
        pub fn feature_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_name = Some(input.into());
            self
        }
        /// <p>The name of <code>FeatureGroup</code>.</p>
        pub fn set_feature_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_name = input;
            self
        }
        /// <p>Unique identifier for the <code>FeatureGroup</code>.</p>
        pub fn feature_group_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.feature_group_arn = Some(input.into());
            self
        }
        /// <p>Unique identifier for the <code>FeatureGroup</code>.</p>
        pub fn set_feature_group_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_group_arn = input;
            self
        }
        /// <p>A timestamp indicating the time of creation time of the <code>FeatureGroup</code>.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp indicating the time of creation time of the <code>FeatureGroup</code>.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The status of a FeatureGroup. The status can be any of the following: <code>Creating</code>, <code>Created</code>, <code>CreateFail</code>, <code>Deleting</code> or <code>DetailFail</code>. </p>
        pub fn feature_group_status(mut self, input: crate::model::FeatureGroupStatus) -> Self {
            self.feature_group_status = Some(input);
            self
        }
        /// <p>The status of a FeatureGroup. The status can be any of the following: <code>Creating</code>, <code>Created</code>, <code>CreateFail</code>, <code>Deleting</code> or <code>DetailFail</code>. </p>
        pub fn set_feature_group_status(
            mut self,
            input: std::option::Option<crate::model::FeatureGroupStatus>,
        ) -> Self {
            self.feature_group_status = input;
            self
        }
        /// <p>Notifies you if replicating data into the <code>OfflineStore</code> has failed. Returns either: <code>Active</code> or <code>Blocked</code>.</p>
        pub fn offline_store_status(mut self, input: crate::model::OfflineStoreStatus) -> Self {
            self.offline_store_status = Some(input);
            self
        }
        /// <p>Notifies you if replicating data into the <code>OfflineStore</code> has failed. Returns either: <code>Active</code> or <code>Blocked</code>.</p>
        pub fn set_offline_store_status(
            mut self,
            input: std::option::Option<crate::model::OfflineStoreStatus>,
        ) -> Self {
            self.offline_store_status = input;
            self
        }
        /// Consumes the builder and constructs a [`FeatureGroupSummary`](crate::model::FeatureGroupSummary).
        pub fn build(self) -> crate::model::FeatureGroupSummary {
            crate::model::FeatureGroupSummary {
                feature_group_name: self.feature_group_name,
                feature_group_arn: self.feature_group_arn,
                creation_time: self.creation_time,
                feature_group_status: self.feature_group_status,
                offline_store_status: self.offline_store_status,
            }
        }
    }
}
impl FeatureGroupSummary {
    /// Creates a new builder-style object to manufacture [`FeatureGroupSummary`](crate::model::FeatureGroupSummary).
    pub fn builder() -> crate::model::feature_group_summary::Builder {
        crate::model::feature_group_summary::Builder::default()
    }
}

/// When writing a match expression against `FeatureGroupSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let featuregroupsortby = unimplemented!();
/// match featuregroupsortby {
///     FeatureGroupSortBy::CreationTime => { /* ... */ },
///     FeatureGroupSortBy::FeatureGroupStatus => { /* ... */ },
///     FeatureGroupSortBy::Name => { /* ... */ },
///     FeatureGroupSortBy::OfflineStoreStatus => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `featuregroupsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FeatureGroupSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FeatureGroupSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FeatureGroupSortBy::NewFeature` is defined.
/// Specifically, when `featuregroupsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FeatureGroupSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FeatureGroupSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    FeatureGroupStatus,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    OfflineStoreStatus,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FeatureGroupSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => FeatureGroupSortBy::CreationTime,
            "FeatureGroupStatus" => FeatureGroupSortBy::FeatureGroupStatus,
            "Name" => FeatureGroupSortBy::Name,
            "OfflineStoreStatus" => FeatureGroupSortBy::OfflineStoreStatus,
            other => {
                FeatureGroupSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for FeatureGroupSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FeatureGroupSortBy::from(s))
    }
}
impl FeatureGroupSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FeatureGroupSortBy::CreationTime => "CreationTime",
            FeatureGroupSortBy::FeatureGroupStatus => "FeatureGroupStatus",
            FeatureGroupSortBy::Name => "Name",
            FeatureGroupSortBy::OfflineStoreStatus => "OfflineStoreStatus",
            FeatureGroupSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CreationTime",
            "FeatureGroupStatus",
            "Name",
            "OfflineStoreStatus",
        ]
    }
}
impl AsRef<str> for FeatureGroupSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `FeatureGroupSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let featuregroupsortorder = unimplemented!();
/// match featuregroupsortorder {
///     FeatureGroupSortOrder::Ascending => { /* ... */ },
///     FeatureGroupSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `featuregroupsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FeatureGroupSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FeatureGroupSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FeatureGroupSortOrder::NewFeature` is defined.
/// Specifically, when `featuregroupsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FeatureGroupSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FeatureGroupSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FeatureGroupSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => FeatureGroupSortOrder::Ascending,
            "Descending" => FeatureGroupSortOrder::Descending,
            other => {
                FeatureGroupSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for FeatureGroupSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FeatureGroupSortOrder::from(s))
    }
}
impl FeatureGroupSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FeatureGroupSortOrder::Ascending => "Ascending",
            FeatureGroupSortOrder::Descending => "Descending",
            FeatureGroupSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for FeatureGroupSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of the properties of an experiment. To get the complete set of properties, call the <code>DescribeExperiment</code> API and provide the <code>ExperimentName</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ExperimentSummary {
    /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
    #[doc(hidden)]
    pub experiment_arn: std::option::Option<std::string::String>,
    /// <p>The name of the experiment.</p>
    #[doc(hidden)]
    pub experiment_name: std::option::Option<std::string::String>,
    /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
    #[doc(hidden)]
    pub display_name: std::option::Option<std::string::String>,
    /// <p>The source of the experiment.</p>
    #[doc(hidden)]
    pub experiment_source: std::option::Option<crate::model::ExperimentSource>,
    /// <p>When the experiment was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the experiment was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ExperimentSummary {
    /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
    pub fn experiment_arn(&self) -> std::option::Option<&str> {
        self.experiment_arn.as_deref()
    }
    /// <p>The name of the experiment.</p>
    pub fn experiment_name(&self) -> std::option::Option<&str> {
        self.experiment_name.as_deref()
    }
    /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
    pub fn display_name(&self) -> std::option::Option<&str> {
        self.display_name.as_deref()
    }
    /// <p>The source of the experiment.</p>
    pub fn experiment_source(&self) -> std::option::Option<&crate::model::ExperimentSource> {
        self.experiment_source.as_ref()
    }
    /// <p>When the experiment was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When the experiment was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ExperimentSummary`](crate::model::ExperimentSummary).
pub mod experiment_summary {

    /// A builder for [`ExperimentSummary`](crate::model::ExperimentSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) experiment_arn: std::option::Option<std::string::String>,
        pub(crate) experiment_name: std::option::Option<std::string::String>,
        pub(crate) display_name: std::option::Option<std::string::String>,
        pub(crate) experiment_source: std::option::Option<crate::model::ExperimentSource>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
        pub fn experiment_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the experiment.</p>
        pub fn set_experiment_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_arn = input;
            self
        }
        /// <p>The name of the experiment.</p>
        pub fn experiment_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.experiment_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment.</p>
        pub fn set_experiment_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.experiment_name = input;
            self
        }
        /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
        pub fn display_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.display_name = Some(input.into());
            self
        }
        /// <p>The name of the experiment as displayed. If <code>DisplayName</code> isn't specified, <code>ExperimentName</code> is displayed.</p>
        pub fn set_display_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.display_name = input;
            self
        }
        /// <p>The source of the experiment.</p>
        pub fn experiment_source(mut self, input: crate::model::ExperimentSource) -> Self {
            self.experiment_source = Some(input);
            self
        }
        /// <p>The source of the experiment.</p>
        pub fn set_experiment_source(
            mut self,
            input: std::option::Option<crate::model::ExperimentSource>,
        ) -> Self {
            self.experiment_source = input;
            self
        }
        /// <p>When the experiment was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the experiment was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When the experiment was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the experiment was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ExperimentSummary`](crate::model::ExperimentSummary).
        pub fn build(self) -> crate::model::ExperimentSummary {
            crate::model::ExperimentSummary {
                experiment_arn: self.experiment_arn,
                experiment_name: self.experiment_name,
                display_name: self.display_name,
                experiment_source: self.experiment_source,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ExperimentSummary {
    /// Creates a new builder-style object to manufacture [`ExperimentSummary`](crate::model::ExperimentSummary).
    pub fn builder() -> crate::model::experiment_summary::Builder {
        crate::model::experiment_summary::Builder::default()
    }
}

/// When writing a match expression against `SortExperimentsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortexperimentsby = unimplemented!();
/// match sortexperimentsby {
///     SortExperimentsBy::CreationTime => { /* ... */ },
///     SortExperimentsBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortexperimentsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortExperimentsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortExperimentsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortExperimentsBy::NewFeature` is defined.
/// Specifically, when `sortexperimentsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortExperimentsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortExperimentsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortExperimentsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortExperimentsBy::CreationTime,
            "Name" => SortExperimentsBy::Name,
            other => {
                SortExperimentsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for SortExperimentsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortExperimentsBy::from(s))
    }
}
impl SortExperimentsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortExperimentsBy::CreationTime => "CreationTime",
            SortExperimentsBy::Name => "Name",
            SortExperimentsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortExperimentsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information for an endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointSummary {
    /// <p>The name of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the endpoint was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>A timestamp that shows when the endpoint was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the endpoint.</p>
    /// <ul>
    /// <li> <p> <code>OutOfService</code>: Endpoint is not available to take incoming requests.</p> </li>
    /// <li> <p> <code>Creating</code>: <code>CreateEndpoint</code> is executing.</p> </li>
    /// <li> <p> <code>Updating</code>: <code>UpdateEndpoint</code> or <code>UpdateEndpointWeightsAndCapacities</code> is executing.</p> </li>
    /// <li> <p> <code>SystemUpdating</code>: Endpoint is undergoing maintenance and cannot be updated or deleted or re-scaled until it has completed. This maintenance operation does not change any customer-specified values such as VPC config, KMS encryption, model, instance type, or instance count.</p> </li>
    /// <li> <p> <code>RollingBack</code>: Endpoint fails to scale up or down or change its variant weight and is in the process of rolling back to its previous configuration. Once the rollback completes, endpoint returns to an <code>InService</code> status. This transitional status only applies to an endpoint that has autoscaling enabled and is undergoing variant weight or capacity changes as part of an <code>UpdateEndpointWeightsAndCapacities</code> call or when the <code>UpdateEndpointWeightsAndCapacities</code> operation is called explicitly.</p> </li>
    /// <li> <p> <code>InService</code>: Endpoint is available to process incoming requests.</p> </li>
    /// <li> <p> <code>Deleting</code>: <code>DeleteEndpoint</code> is executing.</p> </li>
    /// <li> <p> <code>Failed</code>: Endpoint could not be created, updated, or re-scaled. Use <code>DescribeEndpointOutput$FailureReason</code> for information about the failure. <code>DeleteEndpoint</code> is the only operation that can be performed on a failed endpoint.</p> </li>
    /// </ul>
    /// <p>To get a list of endpoints with a specified status, use the <code>ListEndpointsInput$StatusEquals</code> filter.</p>
    #[doc(hidden)]
    pub endpoint_status: std::option::Option<crate::model::EndpointStatus>,
}
impl EndpointSummary {
    /// <p>The name of the endpoint.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
    pub fn endpoint_arn(&self) -> std::option::Option<&str> {
        self.endpoint_arn.as_deref()
    }
    /// <p>A timestamp that shows when the endpoint was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>A timestamp that shows when the endpoint was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the endpoint.</p>
    /// <ul>
    /// <li> <p> <code>OutOfService</code>: Endpoint is not available to take incoming requests.</p> </li>
    /// <li> <p> <code>Creating</code>: <code>CreateEndpoint</code> is executing.</p> </li>
    /// <li> <p> <code>Updating</code>: <code>UpdateEndpoint</code> or <code>UpdateEndpointWeightsAndCapacities</code> is executing.</p> </li>
    /// <li> <p> <code>SystemUpdating</code>: Endpoint is undergoing maintenance and cannot be updated or deleted or re-scaled until it has completed. This maintenance operation does not change any customer-specified values such as VPC config, KMS encryption, model, instance type, or instance count.</p> </li>
    /// <li> <p> <code>RollingBack</code>: Endpoint fails to scale up or down or change its variant weight and is in the process of rolling back to its previous configuration. Once the rollback completes, endpoint returns to an <code>InService</code> status. This transitional status only applies to an endpoint that has autoscaling enabled and is undergoing variant weight or capacity changes as part of an <code>UpdateEndpointWeightsAndCapacities</code> call or when the <code>UpdateEndpointWeightsAndCapacities</code> operation is called explicitly.</p> </li>
    /// <li> <p> <code>InService</code>: Endpoint is available to process incoming requests.</p> </li>
    /// <li> <p> <code>Deleting</code>: <code>DeleteEndpoint</code> is executing.</p> </li>
    /// <li> <p> <code>Failed</code>: Endpoint could not be created, updated, or re-scaled. Use <code>DescribeEndpointOutput$FailureReason</code> for information about the failure. <code>DeleteEndpoint</code> is the only operation that can be performed on a failed endpoint.</p> </li>
    /// </ul>
    /// <p>To get a list of endpoints with a specified status, use the <code>ListEndpointsInput$StatusEquals</code> filter.</p>
    pub fn endpoint_status(&self) -> std::option::Option<&crate::model::EndpointStatus> {
        self.endpoint_status.as_ref()
    }
}
/// See [`EndpointSummary`](crate::model::EndpointSummary).
pub mod endpoint_summary {

    /// A builder for [`EndpointSummary`](crate::model::EndpointSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) endpoint_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) endpoint_status: std::option::Option<crate::model::EndpointStatus>,
    }
    impl Builder {
        /// <p>The name of the endpoint.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
        pub fn endpoint_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint.</p>
        pub fn set_endpoint_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.endpoint_arn = input;
            self
        }
        /// <p>A timestamp that shows when the endpoint was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the endpoint was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>A timestamp that shows when the endpoint was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the endpoint was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the endpoint.</p>
        /// <ul>
        /// <li> <p> <code>OutOfService</code>: Endpoint is not available to take incoming requests.</p> </li>
        /// <li> <p> <code>Creating</code>: <code>CreateEndpoint</code> is executing.</p> </li>
        /// <li> <p> <code>Updating</code>: <code>UpdateEndpoint</code> or <code>UpdateEndpointWeightsAndCapacities</code> is executing.</p> </li>
        /// <li> <p> <code>SystemUpdating</code>: Endpoint is undergoing maintenance and cannot be updated or deleted or re-scaled until it has completed. This maintenance operation does not change any customer-specified values such as VPC config, KMS encryption, model, instance type, or instance count.</p> </li>
        /// <li> <p> <code>RollingBack</code>: Endpoint fails to scale up or down or change its variant weight and is in the process of rolling back to its previous configuration. Once the rollback completes, endpoint returns to an <code>InService</code> status. This transitional status only applies to an endpoint that has autoscaling enabled and is undergoing variant weight or capacity changes as part of an <code>UpdateEndpointWeightsAndCapacities</code> call or when the <code>UpdateEndpointWeightsAndCapacities</code> operation is called explicitly.</p> </li>
        /// <li> <p> <code>InService</code>: Endpoint is available to process incoming requests.</p> </li>
        /// <li> <p> <code>Deleting</code>: <code>DeleteEndpoint</code> is executing.</p> </li>
        /// <li> <p> <code>Failed</code>: Endpoint could not be created, updated, or re-scaled. Use <code>DescribeEndpointOutput$FailureReason</code> for information about the failure. <code>DeleteEndpoint</code> is the only operation that can be performed on a failed endpoint.</p> </li>
        /// </ul>
        /// <p>To get a list of endpoints with a specified status, use the <code>ListEndpointsInput$StatusEquals</code> filter.</p>
        pub fn endpoint_status(mut self, input: crate::model::EndpointStatus) -> Self {
            self.endpoint_status = Some(input);
            self
        }
        /// <p>The status of the endpoint.</p>
        /// <ul>
        /// <li> <p> <code>OutOfService</code>: Endpoint is not available to take incoming requests.</p> </li>
        /// <li> <p> <code>Creating</code>: <code>CreateEndpoint</code> is executing.</p> </li>
        /// <li> <p> <code>Updating</code>: <code>UpdateEndpoint</code> or <code>UpdateEndpointWeightsAndCapacities</code> is executing.</p> </li>
        /// <li> <p> <code>SystemUpdating</code>: Endpoint is undergoing maintenance and cannot be updated or deleted or re-scaled until it has completed. This maintenance operation does not change any customer-specified values such as VPC config, KMS encryption, model, instance type, or instance count.</p> </li>
        /// <li> <p> <code>RollingBack</code>: Endpoint fails to scale up or down or change its variant weight and is in the process of rolling back to its previous configuration. Once the rollback completes, endpoint returns to an <code>InService</code> status. This transitional status only applies to an endpoint that has autoscaling enabled and is undergoing variant weight or capacity changes as part of an <code>UpdateEndpointWeightsAndCapacities</code> call or when the <code>UpdateEndpointWeightsAndCapacities</code> operation is called explicitly.</p> </li>
        /// <li> <p> <code>InService</code>: Endpoint is available to process incoming requests.</p> </li>
        /// <li> <p> <code>Deleting</code>: <code>DeleteEndpoint</code> is executing.</p> </li>
        /// <li> <p> <code>Failed</code>: Endpoint could not be created, updated, or re-scaled. Use <code>DescribeEndpointOutput$FailureReason</code> for information about the failure. <code>DeleteEndpoint</code> is the only operation that can be performed on a failed endpoint.</p> </li>
        /// </ul>
        /// <p>To get a list of endpoints with a specified status, use the <code>ListEndpointsInput$StatusEquals</code> filter.</p>
        pub fn set_endpoint_status(
            mut self,
            input: std::option::Option<crate::model::EndpointStatus>,
        ) -> Self {
            self.endpoint_status = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointSummary`](crate::model::EndpointSummary).
        pub fn build(self) -> crate::model::EndpointSummary {
            crate::model::EndpointSummary {
                endpoint_name: self.endpoint_name,
                endpoint_arn: self.endpoint_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                endpoint_status: self.endpoint_status,
            }
        }
    }
}
impl EndpointSummary {
    /// Creates a new builder-style object to manufacture [`EndpointSummary`](crate::model::EndpointSummary).
    pub fn builder() -> crate::model::endpoint_summary::Builder {
        crate::model::endpoint_summary::Builder::default()
    }
}

/// When writing a match expression against `EndpointSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let endpointsortkey = unimplemented!();
/// match endpointsortkey {
///     EndpointSortKey::CreationTime => { /* ... */ },
///     EndpointSortKey::Name => { /* ... */ },
///     EndpointSortKey::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `endpointsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `EndpointSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `EndpointSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `EndpointSortKey::NewFeature` is defined.
/// Specifically, when `endpointsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `EndpointSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum EndpointSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for EndpointSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => EndpointSortKey::CreationTime,
            "Name" => EndpointSortKey::Name,
            "Status" => EndpointSortKey::Status,
            other => EndpointSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for EndpointSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(EndpointSortKey::from(s))
    }
}
impl EndpointSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            EndpointSortKey::CreationTime => "CreationTime",
            EndpointSortKey::Name => "Name",
            EndpointSortKey::Status => "Status",
            EndpointSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for EndpointSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information for an endpoint configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointConfigSummary {
    /// <p>The name of the endpoint configuration.</p>
    #[doc(hidden)]
    pub endpoint_config_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the endpoint configuration.</p>
    #[doc(hidden)]
    pub endpoint_config_arn: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the endpoint configuration was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl EndpointConfigSummary {
    /// <p>The name of the endpoint configuration.</p>
    pub fn endpoint_config_name(&self) -> std::option::Option<&str> {
        self.endpoint_config_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the endpoint configuration.</p>
    pub fn endpoint_config_arn(&self) -> std::option::Option<&str> {
        self.endpoint_config_arn.as_deref()
    }
    /// <p>A timestamp that shows when the endpoint configuration was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
}
/// See [`EndpointConfigSummary`](crate::model::EndpointConfigSummary).
pub mod endpoint_config_summary {

    /// A builder for [`EndpointConfigSummary`](crate::model::EndpointConfigSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_config_name: std::option::Option<std::string::String>,
        pub(crate) endpoint_config_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the endpoint configuration.</p>
        pub fn endpoint_config_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_config_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint configuration.</p>
        pub fn set_endpoint_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_config_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint configuration.</p>
        pub fn endpoint_config_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_config_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the endpoint configuration.</p>
        pub fn set_endpoint_config_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_config_arn = input;
            self
        }
        /// <p>A timestamp that shows when the endpoint configuration was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the endpoint configuration was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointConfigSummary`](crate::model::EndpointConfigSummary).
        pub fn build(self) -> crate::model::EndpointConfigSummary {
            crate::model::EndpointConfigSummary {
                endpoint_config_name: self.endpoint_config_name,
                endpoint_config_arn: self.endpoint_config_arn,
                creation_time: self.creation_time,
            }
        }
    }
}
impl EndpointConfigSummary {
    /// Creates a new builder-style object to manufacture [`EndpointConfigSummary`](crate::model::EndpointConfigSummary).
    pub fn builder() -> crate::model::endpoint_config_summary::Builder {
        crate::model::endpoint_config_summary::Builder::default()
    }
}

/// When writing a match expression against `EndpointConfigSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let endpointconfigsortkey = unimplemented!();
/// match endpointconfigsortkey {
///     EndpointConfigSortKey::CreationTime => { /* ... */ },
///     EndpointConfigSortKey::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `endpointconfigsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `EndpointConfigSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `EndpointConfigSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `EndpointConfigSortKey::NewFeature` is defined.
/// Specifically, when `endpointconfigsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `EndpointConfigSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum EndpointConfigSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for EndpointConfigSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => EndpointConfigSortKey::CreationTime,
            "Name" => EndpointConfigSortKey::Name,
            other => {
                EndpointConfigSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for EndpointConfigSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(EndpointConfigSortKey::from(s))
    }
}
impl EndpointConfigSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            EndpointConfigSortKey::CreationTime => "CreationTime",
            EndpointConfigSortKey::Name => "Name",
            EndpointConfigSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for EndpointConfigSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summary of edge packaging job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgePackagingJobSummary {
    /// <p>The Amazon Resource Name (ARN) of the edge packaging job.</p>
    #[doc(hidden)]
    pub edge_packaging_job_arn: std::option::Option<std::string::String>,
    /// <p>The name of the edge packaging job.</p>
    #[doc(hidden)]
    pub edge_packaging_job_name: std::option::Option<std::string::String>,
    /// <p>The status of the edge packaging job.</p>
    #[doc(hidden)]
    pub edge_packaging_job_status: std::option::Option<crate::model::EdgePackagingJobStatus>,
    /// <p>The name of the SageMaker Neo compilation job.</p>
    #[doc(hidden)]
    pub compilation_job_name: std::option::Option<std::string::String>,
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The version of the model.</p>
    #[doc(hidden)]
    pub model_version: std::option::Option<std::string::String>,
    /// <p>The timestamp of when the job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The timestamp of when the edge packaging job was last updated.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl EdgePackagingJobSummary {
    /// <p>The Amazon Resource Name (ARN) of the edge packaging job.</p>
    pub fn edge_packaging_job_arn(&self) -> std::option::Option<&str> {
        self.edge_packaging_job_arn.as_deref()
    }
    /// <p>The name of the edge packaging job.</p>
    pub fn edge_packaging_job_name(&self) -> std::option::Option<&str> {
        self.edge_packaging_job_name.as_deref()
    }
    /// <p>The status of the edge packaging job.</p>
    pub fn edge_packaging_job_status(
        &self,
    ) -> std::option::Option<&crate::model::EdgePackagingJobStatus> {
        self.edge_packaging_job_status.as_ref()
    }
    /// <p>The name of the SageMaker Neo compilation job.</p>
    pub fn compilation_job_name(&self) -> std::option::Option<&str> {
        self.compilation_job_name.as_deref()
    }
    /// <p>The name of the model.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The version of the model.</p>
    pub fn model_version(&self) -> std::option::Option<&str> {
        self.model_version.as_deref()
    }
    /// <p>The timestamp of when the job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The timestamp of when the edge packaging job was last updated.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`EdgePackagingJobSummary`](crate::model::EdgePackagingJobSummary).
pub mod edge_packaging_job_summary {

    /// A builder for [`EdgePackagingJobSummary`](crate::model::EdgePackagingJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) edge_packaging_job_arn: std::option::Option<std::string::String>,
        pub(crate) edge_packaging_job_name: std::option::Option<std::string::String>,
        pub(crate) edge_packaging_job_status:
            std::option::Option<crate::model::EdgePackagingJobStatus>,
        pub(crate) compilation_job_name: std::option::Option<std::string::String>,
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) model_version: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the edge packaging job.</p>
        pub fn edge_packaging_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_packaging_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the edge packaging job.</p>
        pub fn set_edge_packaging_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_packaging_job_arn = input;
            self
        }
        /// <p>The name of the edge packaging job.</p>
        pub fn edge_packaging_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_packaging_job_name = Some(input.into());
            self
        }
        /// <p>The name of the edge packaging job.</p>
        pub fn set_edge_packaging_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_packaging_job_name = input;
            self
        }
        /// <p>The status of the edge packaging job.</p>
        pub fn edge_packaging_job_status(
            mut self,
            input: crate::model::EdgePackagingJobStatus,
        ) -> Self {
            self.edge_packaging_job_status = Some(input);
            self
        }
        /// <p>The status of the edge packaging job.</p>
        pub fn set_edge_packaging_job_status(
            mut self,
            input: std::option::Option<crate::model::EdgePackagingJobStatus>,
        ) -> Self {
            self.edge_packaging_job_status = input;
            self
        }
        /// <p>The name of the SageMaker Neo compilation job.</p>
        pub fn compilation_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.compilation_job_name = Some(input.into());
            self
        }
        /// <p>The name of the SageMaker Neo compilation job.</p>
        pub fn set_compilation_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.compilation_job_name = input;
            self
        }
        /// <p>The name of the model.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The version of the model.</p>
        pub fn model_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_version = Some(input.into());
            self
        }
        /// <p>The version of the model.</p>
        pub fn set_model_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_version = input;
            self
        }
        /// <p>The timestamp of when the job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The timestamp of when the job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The timestamp of when the edge packaging job was last updated.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The timestamp of when the edge packaging job was last updated.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgePackagingJobSummary`](crate::model::EdgePackagingJobSummary).
        pub fn build(self) -> crate::model::EdgePackagingJobSummary {
            crate::model::EdgePackagingJobSummary {
                edge_packaging_job_arn: self.edge_packaging_job_arn,
                edge_packaging_job_name: self.edge_packaging_job_name,
                edge_packaging_job_status: self.edge_packaging_job_status,
                compilation_job_name: self.compilation_job_name,
                model_name: self.model_name,
                model_version: self.model_version,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl EdgePackagingJobSummary {
    /// Creates a new builder-style object to manufacture [`EdgePackagingJobSummary`](crate::model::EdgePackagingJobSummary).
    pub fn builder() -> crate::model::edge_packaging_job_summary::Builder {
        crate::model::edge_packaging_job_summary::Builder::default()
    }
}

/// When writing a match expression against `EdgePackagingJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let edgepackagingjobstatus = unimplemented!();
/// match edgepackagingjobstatus {
///     EdgePackagingJobStatus::Completed => { /* ... */ },
///     EdgePackagingJobStatus::Failed => { /* ... */ },
///     EdgePackagingJobStatus::InProgress => { /* ... */ },
///     EdgePackagingJobStatus::Starting => { /* ... */ },
///     EdgePackagingJobStatus::Stopped => { /* ... */ },
///     EdgePackagingJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `edgepackagingjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `EdgePackagingJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `EdgePackagingJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `EdgePackagingJobStatus::NewFeature` is defined.
/// Specifically, when `edgepackagingjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `EdgePackagingJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum EdgePackagingJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for EdgePackagingJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "COMPLETED" => EdgePackagingJobStatus::Completed,
            "FAILED" => EdgePackagingJobStatus::Failed,
            "INPROGRESS" => EdgePackagingJobStatus::InProgress,
            "STARTING" => EdgePackagingJobStatus::Starting,
            "STOPPED" => EdgePackagingJobStatus::Stopped,
            "STOPPING" => EdgePackagingJobStatus::Stopping,
            other => {
                EdgePackagingJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for EdgePackagingJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(EdgePackagingJobStatus::from(s))
    }
}
impl EdgePackagingJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            EdgePackagingJobStatus::Completed => "COMPLETED",
            EdgePackagingJobStatus::Failed => "FAILED",
            EdgePackagingJobStatus::InProgress => "INPROGRESS",
            EdgePackagingJobStatus::Starting => "STARTING",
            EdgePackagingJobStatus::Stopped => "STOPPED",
            EdgePackagingJobStatus::Stopping => "STOPPING",
            EdgePackagingJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "COMPLETED",
            "FAILED",
            "INPROGRESS",
            "STARTING",
            "STOPPED",
            "STOPPING",
        ]
    }
}
impl AsRef<str> for EdgePackagingJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ListEdgePackagingJobsSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listedgepackagingjobssortby = unimplemented!();
/// match listedgepackagingjobssortby {
///     ListEdgePackagingJobsSortBy::CreationTime => { /* ... */ },
///     ListEdgePackagingJobsSortBy::LastModifiedTime => { /* ... */ },
///     ListEdgePackagingJobsSortBy::ModelName => { /* ... */ },
///     ListEdgePackagingJobsSortBy::Name => { /* ... */ },
///     ListEdgePackagingJobsSortBy::EdgePackagingJobStatus => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listedgepackagingjobssortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListEdgePackagingJobsSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListEdgePackagingJobsSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListEdgePackagingJobsSortBy::NewFeature` is defined.
/// Specifically, when `listedgepackagingjobssortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListEdgePackagingJobsSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListEdgePackagingJobsSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    ModelName,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    EdgePackagingJobStatus,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListEdgePackagingJobsSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CREATION_TIME" => ListEdgePackagingJobsSortBy::CreationTime,
            "LAST_MODIFIED_TIME" => ListEdgePackagingJobsSortBy::LastModifiedTime,
            "MODEL_NAME" => ListEdgePackagingJobsSortBy::ModelName,
            "NAME" => ListEdgePackagingJobsSortBy::Name,
            "STATUS" => ListEdgePackagingJobsSortBy::EdgePackagingJobStatus,
            other => ListEdgePackagingJobsSortBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ListEdgePackagingJobsSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListEdgePackagingJobsSortBy::from(s))
    }
}
impl ListEdgePackagingJobsSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListEdgePackagingJobsSortBy::CreationTime => "CREATION_TIME",
            ListEdgePackagingJobsSortBy::LastModifiedTime => "LAST_MODIFIED_TIME",
            ListEdgePackagingJobsSortBy::ModelName => "MODEL_NAME",
            ListEdgePackagingJobsSortBy::Name => "NAME",
            ListEdgePackagingJobsSortBy::EdgePackagingJobStatus => "STATUS",
            ListEdgePackagingJobsSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CREATION_TIME",
            "LAST_MODIFIED_TIME",
            "MODEL_NAME",
            "NAME",
            "STATUS",
        ]
    }
}
impl AsRef<str> for ListEdgePackagingJobsSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information summarizing an edge deployment plan.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeDeploymentPlanSummary {
    /// <p>The ARN of the edge deployment plan.</p>
    #[doc(hidden)]
    pub edge_deployment_plan_arn: std::option::Option<std::string::String>,
    /// <p>The name of the edge deployment plan.</p>
    #[doc(hidden)]
    pub edge_deployment_plan_name: std::option::Option<std::string::String>,
    /// <p>The name of the device fleet used for the deployment. </p>
    #[doc(hidden)]
    pub device_fleet_name: std::option::Option<std::string::String>,
    /// <p>The number of edge devices with the successful deployment.</p>
    #[doc(hidden)]
    pub edge_deployment_success: i32,
    /// <p>The number of edge devices yet to pick up the deployment, or in progress.</p>
    #[doc(hidden)]
    pub edge_deployment_pending: i32,
    /// <p>The number of edge devices that failed the deployment.</p>
    #[doc(hidden)]
    pub edge_deployment_failed: i32,
    /// <p>The time when the edge deployment plan was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time when the edge deployment plan was last updated.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl EdgeDeploymentPlanSummary {
    /// <p>The ARN of the edge deployment plan.</p>
    pub fn edge_deployment_plan_arn(&self) -> std::option::Option<&str> {
        self.edge_deployment_plan_arn.as_deref()
    }
    /// <p>The name of the edge deployment plan.</p>
    pub fn edge_deployment_plan_name(&self) -> std::option::Option<&str> {
        self.edge_deployment_plan_name.as_deref()
    }
    /// <p>The name of the device fleet used for the deployment. </p>
    pub fn device_fleet_name(&self) -> std::option::Option<&str> {
        self.device_fleet_name.as_deref()
    }
    /// <p>The number of edge devices with the successful deployment.</p>
    pub fn edge_deployment_success(&self) -> i32 {
        self.edge_deployment_success
    }
    /// <p>The number of edge devices yet to pick up the deployment, or in progress.</p>
    pub fn edge_deployment_pending(&self) -> i32 {
        self.edge_deployment_pending
    }
    /// <p>The number of edge devices that failed the deployment.</p>
    pub fn edge_deployment_failed(&self) -> i32 {
        self.edge_deployment_failed
    }
    /// <p>The time when the edge deployment plan was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time when the edge deployment plan was last updated.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`EdgeDeploymentPlanSummary`](crate::model::EdgeDeploymentPlanSummary).
pub mod edge_deployment_plan_summary {

    /// A builder for [`EdgeDeploymentPlanSummary`](crate::model::EdgeDeploymentPlanSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) edge_deployment_plan_arn: std::option::Option<std::string::String>,
        pub(crate) edge_deployment_plan_name: std::option::Option<std::string::String>,
        pub(crate) device_fleet_name: std::option::Option<std::string::String>,
        pub(crate) edge_deployment_success: std::option::Option<i32>,
        pub(crate) edge_deployment_pending: std::option::Option<i32>,
        pub(crate) edge_deployment_failed: std::option::Option<i32>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The ARN of the edge deployment plan.</p>
        pub fn edge_deployment_plan_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_deployment_plan_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the edge deployment plan.</p>
        pub fn set_edge_deployment_plan_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_deployment_plan_arn = input;
            self
        }
        /// <p>The name of the edge deployment plan.</p>
        pub fn edge_deployment_plan_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_deployment_plan_name = Some(input.into());
            self
        }
        /// <p>The name of the edge deployment plan.</p>
        pub fn set_edge_deployment_plan_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_deployment_plan_name = input;
            self
        }
        /// <p>The name of the device fleet used for the deployment. </p>
        pub fn device_fleet_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_fleet_name = Some(input.into());
            self
        }
        /// <p>The name of the device fleet used for the deployment. </p>
        pub fn set_device_fleet_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_fleet_name = input;
            self
        }
        /// <p>The number of edge devices with the successful deployment.</p>
        pub fn edge_deployment_success(mut self, input: i32) -> Self {
            self.edge_deployment_success = Some(input);
            self
        }
        /// <p>The number of edge devices with the successful deployment.</p>
        pub fn set_edge_deployment_success(mut self, input: std::option::Option<i32>) -> Self {
            self.edge_deployment_success = input;
            self
        }
        /// <p>The number of edge devices yet to pick up the deployment, or in progress.</p>
        pub fn edge_deployment_pending(mut self, input: i32) -> Self {
            self.edge_deployment_pending = Some(input);
            self
        }
        /// <p>The number of edge devices yet to pick up the deployment, or in progress.</p>
        pub fn set_edge_deployment_pending(mut self, input: std::option::Option<i32>) -> Self {
            self.edge_deployment_pending = input;
            self
        }
        /// <p>The number of edge devices that failed the deployment.</p>
        pub fn edge_deployment_failed(mut self, input: i32) -> Self {
            self.edge_deployment_failed = Some(input);
            self
        }
        /// <p>The number of edge devices that failed the deployment.</p>
        pub fn set_edge_deployment_failed(mut self, input: std::option::Option<i32>) -> Self {
            self.edge_deployment_failed = input;
            self
        }
        /// <p>The time when the edge deployment plan was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time when the edge deployment plan was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time when the edge deployment plan was last updated.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time when the edge deployment plan was last updated.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeDeploymentPlanSummary`](crate::model::EdgeDeploymentPlanSummary).
        pub fn build(self) -> crate::model::EdgeDeploymentPlanSummary {
            crate::model::EdgeDeploymentPlanSummary {
                edge_deployment_plan_arn: self.edge_deployment_plan_arn,
                edge_deployment_plan_name: self.edge_deployment_plan_name,
                device_fleet_name: self.device_fleet_name,
                edge_deployment_success: self.edge_deployment_success.unwrap_or_default(),
                edge_deployment_pending: self.edge_deployment_pending.unwrap_or_default(),
                edge_deployment_failed: self.edge_deployment_failed.unwrap_or_default(),
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl EdgeDeploymentPlanSummary {
    /// Creates a new builder-style object to manufacture [`EdgeDeploymentPlanSummary`](crate::model::EdgeDeploymentPlanSummary).
    pub fn builder() -> crate::model::edge_deployment_plan_summary::Builder {
        crate::model::edge_deployment_plan_summary::Builder::default()
    }
}

/// When writing a match expression against `ListEdgeDeploymentPlansSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listedgedeploymentplanssortby = unimplemented!();
/// match listedgedeploymentplanssortby {
///     ListEdgeDeploymentPlansSortBy::CreationTime => { /* ... */ },
///     ListEdgeDeploymentPlansSortBy::DeviceFleetName => { /* ... */ },
///     ListEdgeDeploymentPlansSortBy::LastModifiedTime => { /* ... */ },
///     ListEdgeDeploymentPlansSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listedgedeploymentplanssortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListEdgeDeploymentPlansSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListEdgeDeploymentPlansSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListEdgeDeploymentPlansSortBy::NewFeature` is defined.
/// Specifically, when `listedgedeploymentplanssortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListEdgeDeploymentPlansSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListEdgeDeploymentPlansSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    DeviceFleetName,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListEdgeDeploymentPlansSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CREATION_TIME" => ListEdgeDeploymentPlansSortBy::CreationTime,
            "DEVICE_FLEET_NAME" => ListEdgeDeploymentPlansSortBy::DeviceFleetName,
            "LAST_MODIFIED_TIME" => ListEdgeDeploymentPlansSortBy::LastModifiedTime,
            "NAME" => ListEdgeDeploymentPlansSortBy::Name,
            other => ListEdgeDeploymentPlansSortBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ListEdgeDeploymentPlansSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListEdgeDeploymentPlansSortBy::from(s))
    }
}
impl ListEdgeDeploymentPlansSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListEdgeDeploymentPlansSortBy::CreationTime => "CREATION_TIME",
            ListEdgeDeploymentPlansSortBy::DeviceFleetName => "DEVICE_FLEET_NAME",
            ListEdgeDeploymentPlansSortBy::LastModifiedTime => "LAST_MODIFIED_TIME",
            ListEdgeDeploymentPlansSortBy::Name => "NAME",
            ListEdgeDeploymentPlansSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CREATION_TIME",
            "DEVICE_FLEET_NAME",
            "LAST_MODIFIED_TIME",
            "NAME",
        ]
    }
}
impl AsRef<str> for ListEdgeDeploymentPlansSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The domain's details.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DomainDetails {
    /// <p>The domain's Amazon Resource Name (ARN).</p>
    #[doc(hidden)]
    pub domain_arn: std::option::Option<std::string::String>,
    /// <p>The domain ID.</p>
    #[doc(hidden)]
    pub domain_id: std::option::Option<std::string::String>,
    /// <p>The domain name.</p>
    #[doc(hidden)]
    pub domain_name: std::option::Option<std::string::String>,
    /// <p>The status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::DomainStatus>,
    /// <p>The creation time.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last modified time.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The domain's URL.</p>
    #[doc(hidden)]
    pub url: std::option::Option<std::string::String>,
}
impl DomainDetails {
    /// <p>The domain's Amazon Resource Name (ARN).</p>
    pub fn domain_arn(&self) -> std::option::Option<&str> {
        self.domain_arn.as_deref()
    }
    /// <p>The domain ID.</p>
    pub fn domain_id(&self) -> std::option::Option<&str> {
        self.domain_id.as_deref()
    }
    /// <p>The domain name.</p>
    pub fn domain_name(&self) -> std::option::Option<&str> {
        self.domain_name.as_deref()
    }
    /// <p>The status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::DomainStatus> {
        self.status.as_ref()
    }
    /// <p>The creation time.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The last modified time.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The domain's URL.</p>
    pub fn url(&self) -> std::option::Option<&str> {
        self.url.as_deref()
    }
}
/// See [`DomainDetails`](crate::model::DomainDetails).
pub mod domain_details {

    /// A builder for [`DomainDetails`](crate::model::DomainDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain_arn: std::option::Option<std::string::String>,
        pub(crate) domain_id: std::option::Option<std::string::String>,
        pub(crate) domain_name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::DomainStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) url: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The domain's Amazon Resource Name (ARN).</p>
        pub fn domain_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_arn = Some(input.into());
            self
        }
        /// <p>The domain's Amazon Resource Name (ARN).</p>
        pub fn set_domain_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_arn = input;
            self
        }
        /// <p>The domain ID.</p>
        pub fn domain_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_id = Some(input.into());
            self
        }
        /// <p>The domain ID.</p>
        pub fn set_domain_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_id = input;
            self
        }
        /// <p>The domain name.</p>
        pub fn domain_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_name = Some(input.into());
            self
        }
        /// <p>The domain name.</p>
        pub fn set_domain_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_name = input;
            self
        }
        /// <p>The status.</p>
        pub fn status(mut self, input: crate::model::DomainStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::DomainStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>The creation time.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The last modified time.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last modified time.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The domain's URL.</p>
        pub fn url(mut self, input: impl Into<std::string::String>) -> Self {
            self.url = Some(input.into());
            self
        }
        /// <p>The domain's URL.</p>
        pub fn set_url(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.url = input;
            self
        }
        /// Consumes the builder and constructs a [`DomainDetails`](crate::model::DomainDetails).
        pub fn build(self) -> crate::model::DomainDetails {
            crate::model::DomainDetails {
                domain_arn: self.domain_arn,
                domain_id: self.domain_id,
                domain_name: self.domain_name,
                status: self.status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                url: self.url,
            }
        }
    }
}
impl DomainDetails {
    /// Creates a new builder-style object to manufacture [`DomainDetails`](crate::model::DomainDetails).
    pub fn builder() -> crate::model::domain_details::Builder {
        crate::model::domain_details::Builder::default()
    }
}

/// When writing a match expression against `DomainStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let domainstatus = unimplemented!();
/// match domainstatus {
///     DomainStatus::DeleteFailed => { /* ... */ },
///     DomainStatus::Deleting => { /* ... */ },
///     DomainStatus::Failed => { /* ... */ },
///     DomainStatus::InService => { /* ... */ },
///     DomainStatus::Pending => { /* ... */ },
///     DomainStatus::UpdateFailed => { /* ... */ },
///     DomainStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `domainstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DomainStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DomainStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DomainStatus::NewFeature` is defined.
/// Specifically, when `domainstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DomainStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DomainStatus {
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    #[allow(missing_docs)] // documentation missing in model
    UpdateFailed,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DomainStatus {
    fn from(s: &str) -> Self {
        match s {
            "Delete_Failed" => DomainStatus::DeleteFailed,
            "Deleting" => DomainStatus::Deleting,
            "Failed" => DomainStatus::Failed,
            "InService" => DomainStatus::InService,
            "Pending" => DomainStatus::Pending,
            "Update_Failed" => DomainStatus::UpdateFailed,
            "Updating" => DomainStatus::Updating,
            other => DomainStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for DomainStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DomainStatus::from(s))
    }
}
impl DomainStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DomainStatus::DeleteFailed => "Delete_Failed",
            DomainStatus::Deleting => "Deleting",
            DomainStatus::Failed => "Failed",
            DomainStatus::InService => "InService",
            DomainStatus::Pending => "Pending",
            DomainStatus::UpdateFailed => "Update_Failed",
            DomainStatus::Updating => "Updating",
            DomainStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "Delete_Failed",
            "Deleting",
            "Failed",
            "InService",
            "Pending",
            "Update_Failed",
            "Updating",
        ]
    }
}
impl AsRef<str> for DomainStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summary of the device.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeviceSummary {
    /// <p>The unique identifier of the device.</p>
    #[doc(hidden)]
    pub device_name: std::option::Option<std::string::String>,
    /// <p>Amazon Resource Name (ARN) of the device.</p>
    #[doc(hidden)]
    pub device_arn: std::option::Option<std::string::String>,
    /// <p>A description of the device.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The name of the fleet the device belongs to.</p>
    #[doc(hidden)]
    pub device_fleet_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Internet of Things (IoT) object thing name associated with the device..</p>
    #[doc(hidden)]
    pub iot_thing_name: std::option::Option<std::string::String>,
    /// <p>The timestamp of the last registration or de-reregistration.</p>
    #[doc(hidden)]
    pub registration_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last heartbeat received from the device.</p>
    #[doc(hidden)]
    pub latest_heartbeat: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Models on the device.</p>
    #[doc(hidden)]
    pub models: std::option::Option<std::vec::Vec<crate::model::EdgeModelSummary>>,
    /// <p>Edge Manager agent version.</p>
    #[doc(hidden)]
    pub agent_version: std::option::Option<std::string::String>,
}
impl DeviceSummary {
    /// <p>The unique identifier of the device.</p>
    pub fn device_name(&self) -> std::option::Option<&str> {
        self.device_name.as_deref()
    }
    /// <p>Amazon Resource Name (ARN) of the device.</p>
    pub fn device_arn(&self) -> std::option::Option<&str> {
        self.device_arn.as_deref()
    }
    /// <p>A description of the device.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The name of the fleet the device belongs to.</p>
    pub fn device_fleet_name(&self) -> std::option::Option<&str> {
        self.device_fleet_name.as_deref()
    }
    /// <p>The Amazon Web Services Internet of Things (IoT) object thing name associated with the device..</p>
    pub fn iot_thing_name(&self) -> std::option::Option<&str> {
        self.iot_thing_name.as_deref()
    }
    /// <p>The timestamp of the last registration or de-reregistration.</p>
    pub fn registration_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.registration_time.as_ref()
    }
    /// <p>The last heartbeat received from the device.</p>
    pub fn latest_heartbeat(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.latest_heartbeat.as_ref()
    }
    /// <p>Models on the device.</p>
    pub fn models(&self) -> std::option::Option<&[crate::model::EdgeModelSummary]> {
        self.models.as_deref()
    }
    /// <p>Edge Manager agent version.</p>
    pub fn agent_version(&self) -> std::option::Option<&str> {
        self.agent_version.as_deref()
    }
}
/// See [`DeviceSummary`](crate::model::DeviceSummary).
pub mod device_summary {

    /// A builder for [`DeviceSummary`](crate::model::DeviceSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) device_name: std::option::Option<std::string::String>,
        pub(crate) device_arn: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) device_fleet_name: std::option::Option<std::string::String>,
        pub(crate) iot_thing_name: std::option::Option<std::string::String>,
        pub(crate) registration_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) latest_heartbeat: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) models: std::option::Option<std::vec::Vec<crate::model::EdgeModelSummary>>,
        pub(crate) agent_version: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The unique identifier of the device.</p>
        pub fn device_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_name = Some(input.into());
            self
        }
        /// <p>The unique identifier of the device.</p>
        pub fn set_device_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.device_name = input;
            self
        }
        /// <p>Amazon Resource Name (ARN) of the device.</p>
        pub fn device_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_arn = Some(input.into());
            self
        }
        /// <p>Amazon Resource Name (ARN) of the device.</p>
        pub fn set_device_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.device_arn = input;
            self
        }
        /// <p>A description of the device.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>A description of the device.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>The name of the fleet the device belongs to.</p>
        pub fn device_fleet_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_fleet_name = Some(input.into());
            self
        }
        /// <p>The name of the fleet the device belongs to.</p>
        pub fn set_device_fleet_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_fleet_name = input;
            self
        }
        /// <p>The Amazon Web Services Internet of Things (IoT) object thing name associated with the device..</p>
        pub fn iot_thing_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.iot_thing_name = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Internet of Things (IoT) object thing name associated with the device..</p>
        pub fn set_iot_thing_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.iot_thing_name = input;
            self
        }
        /// <p>The timestamp of the last registration or de-reregistration.</p>
        pub fn registration_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.registration_time = Some(input);
            self
        }
        /// <p>The timestamp of the last registration or de-reregistration.</p>
        pub fn set_registration_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.registration_time = input;
            self
        }
        /// <p>The last heartbeat received from the device.</p>
        pub fn latest_heartbeat(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.latest_heartbeat = Some(input);
            self
        }
        /// <p>The last heartbeat received from the device.</p>
        pub fn set_latest_heartbeat(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.latest_heartbeat = input;
            self
        }
        /// Appends an item to `models`.
        ///
        /// To override the contents of this collection use [`set_models`](Self::set_models).
        ///
        /// <p>Models on the device.</p>
        pub fn models(mut self, input: crate::model::EdgeModelSummary) -> Self {
            let mut v = self.models.unwrap_or_default();
            v.push(input);
            self.models = Some(v);
            self
        }
        /// <p>Models on the device.</p>
        pub fn set_models(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::EdgeModelSummary>>,
        ) -> Self {
            self.models = input;
            self
        }
        /// <p>Edge Manager agent version.</p>
        pub fn agent_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.agent_version = Some(input.into());
            self
        }
        /// <p>Edge Manager agent version.</p>
        pub fn set_agent_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.agent_version = input;
            self
        }
        /// Consumes the builder and constructs a [`DeviceSummary`](crate::model::DeviceSummary).
        pub fn build(self) -> crate::model::DeviceSummary {
            crate::model::DeviceSummary {
                device_name: self.device_name,
                device_arn: self.device_arn,
                description: self.description,
                device_fleet_name: self.device_fleet_name,
                iot_thing_name: self.iot_thing_name,
                registration_time: self.registration_time,
                latest_heartbeat: self.latest_heartbeat,
                models: self.models,
                agent_version: self.agent_version,
            }
        }
    }
}
impl DeviceSummary {
    /// Creates a new builder-style object to manufacture [`DeviceSummary`](crate::model::DeviceSummary).
    pub fn builder() -> crate::model::device_summary::Builder {
        crate::model::device_summary::Builder::default()
    }
}

/// <p>Summary of model on edge device.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeModelSummary {
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The version model.</p>
    #[doc(hidden)]
    pub model_version: std::option::Option<std::string::String>,
}
impl EdgeModelSummary {
    /// <p>The name of the model.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The version model.</p>
    pub fn model_version(&self) -> std::option::Option<&str> {
        self.model_version.as_deref()
    }
}
/// See [`EdgeModelSummary`](crate::model::EdgeModelSummary).
pub mod edge_model_summary {

    /// A builder for [`EdgeModelSummary`](crate::model::EdgeModelSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) model_version: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the model.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The version model.</p>
        pub fn model_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_version = Some(input.into());
            self
        }
        /// <p>The version model.</p>
        pub fn set_model_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_version = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeModelSummary`](crate::model::EdgeModelSummary).
        pub fn build(self) -> crate::model::EdgeModelSummary {
            crate::model::EdgeModelSummary {
                model_name: self.model_name,
                model_version: self.model_version,
            }
        }
    }
}
impl EdgeModelSummary {
    /// Creates a new builder-style object to manufacture [`EdgeModelSummary`](crate::model::EdgeModelSummary).
    pub fn builder() -> crate::model::edge_model_summary::Builder {
        crate::model::edge_model_summary::Builder::default()
    }
}

/// <p>Summary of the device fleet.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeviceFleetSummary {
    /// <p>Amazon Resource Name (ARN) of the device fleet.</p>
    #[doc(hidden)]
    pub device_fleet_arn: std::option::Option<std::string::String>,
    /// <p>Name of the device fleet.</p>
    #[doc(hidden)]
    pub device_fleet_name: std::option::Option<std::string::String>,
    /// <p>Timestamp of when the device fleet was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Timestamp of when the device fleet was last updated.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl DeviceFleetSummary {
    /// <p>Amazon Resource Name (ARN) of the device fleet.</p>
    pub fn device_fleet_arn(&self) -> std::option::Option<&str> {
        self.device_fleet_arn.as_deref()
    }
    /// <p>Name of the device fleet.</p>
    pub fn device_fleet_name(&self) -> std::option::Option<&str> {
        self.device_fleet_name.as_deref()
    }
    /// <p>Timestamp of when the device fleet was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Timestamp of when the device fleet was last updated.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`DeviceFleetSummary`](crate::model::DeviceFleetSummary).
pub mod device_fleet_summary {

    /// A builder for [`DeviceFleetSummary`](crate::model::DeviceFleetSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) device_fleet_arn: std::option::Option<std::string::String>,
        pub(crate) device_fleet_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>Amazon Resource Name (ARN) of the device fleet.</p>
        pub fn device_fleet_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_fleet_arn = Some(input.into());
            self
        }
        /// <p>Amazon Resource Name (ARN) of the device fleet.</p>
        pub fn set_device_fleet_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_fleet_arn = input;
            self
        }
        /// <p>Name of the device fleet.</p>
        pub fn device_fleet_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_fleet_name = Some(input.into());
            self
        }
        /// <p>Name of the device fleet.</p>
        pub fn set_device_fleet_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_fleet_name = input;
            self
        }
        /// <p>Timestamp of when the device fleet was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>Timestamp of when the device fleet was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Timestamp of when the device fleet was last updated.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>Timestamp of when the device fleet was last updated.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`DeviceFleetSummary`](crate::model::DeviceFleetSummary).
        pub fn build(self) -> crate::model::DeviceFleetSummary {
            crate::model::DeviceFleetSummary {
                device_fleet_arn: self.device_fleet_arn,
                device_fleet_name: self.device_fleet_name,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl DeviceFleetSummary {
    /// Creates a new builder-style object to manufacture [`DeviceFleetSummary`](crate::model::DeviceFleetSummary).
    pub fn builder() -> crate::model::device_fleet_summary::Builder {
        crate::model::device_fleet_summary::Builder::default()
    }
}

/// When writing a match expression against `ListDeviceFleetsSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listdevicefleetssortby = unimplemented!();
/// match listdevicefleetssortby {
///     ListDeviceFleetsSortBy::CreationTime => { /* ... */ },
///     ListDeviceFleetsSortBy::LastModifiedTime => { /* ... */ },
///     ListDeviceFleetsSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listdevicefleetssortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListDeviceFleetsSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListDeviceFleetsSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListDeviceFleetsSortBy::NewFeature` is defined.
/// Specifically, when `listdevicefleetssortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListDeviceFleetsSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListDeviceFleetsSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListDeviceFleetsSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CREATION_TIME" => ListDeviceFleetsSortBy::CreationTime,
            "LAST_MODIFIED_TIME" => ListDeviceFleetsSortBy::LastModifiedTime,
            "NAME" => ListDeviceFleetsSortBy::Name,
            other => {
                ListDeviceFleetsSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ListDeviceFleetsSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListDeviceFleetsSortBy::from(s))
    }
}
impl ListDeviceFleetsSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListDeviceFleetsSortBy::CreationTime => "CREATION_TIME",
            ListDeviceFleetsSortBy::LastModifiedTime => "LAST_MODIFIED_TIME",
            ListDeviceFleetsSortBy::Name => "NAME",
            ListDeviceFleetsSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CREATION_TIME", "LAST_MODIFIED_TIME", "NAME"]
    }
}
impl AsRef<str> for ListDeviceFleetsSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Lists a summary of the properties of a context. A context provides a logical grouping of other entities.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ContextSummary {
    /// <p>The Amazon Resource Name (ARN) of the context.</p>
    #[doc(hidden)]
    pub context_arn: std::option::Option<std::string::String>,
    /// <p>The name of the context.</p>
    #[doc(hidden)]
    pub context_name: std::option::Option<std::string::String>,
    /// <p>The source of the context.</p>
    #[doc(hidden)]
    pub source: std::option::Option<crate::model::ContextSource>,
    /// <p>The type of the context.</p>
    #[doc(hidden)]
    pub context_type: std::option::Option<std::string::String>,
    /// <p>When the context was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the context was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ContextSummary {
    /// <p>The Amazon Resource Name (ARN) of the context.</p>
    pub fn context_arn(&self) -> std::option::Option<&str> {
        self.context_arn.as_deref()
    }
    /// <p>The name of the context.</p>
    pub fn context_name(&self) -> std::option::Option<&str> {
        self.context_name.as_deref()
    }
    /// <p>The source of the context.</p>
    pub fn source(&self) -> std::option::Option<&crate::model::ContextSource> {
        self.source.as_ref()
    }
    /// <p>The type of the context.</p>
    pub fn context_type(&self) -> std::option::Option<&str> {
        self.context_type.as_deref()
    }
    /// <p>When the context was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When the context was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ContextSummary`](crate::model::ContextSummary).
pub mod context_summary {

    /// A builder for [`ContextSummary`](crate::model::ContextSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) context_arn: std::option::Option<std::string::String>,
        pub(crate) context_name: std::option::Option<std::string::String>,
        pub(crate) source: std::option::Option<crate::model::ContextSource>,
        pub(crate) context_type: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the context.</p>
        pub fn context_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.context_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the context.</p>
        pub fn set_context_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.context_arn = input;
            self
        }
        /// <p>The name of the context.</p>
        pub fn context_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.context_name = Some(input.into());
            self
        }
        /// <p>The name of the context.</p>
        pub fn set_context_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.context_name = input;
            self
        }
        /// <p>The source of the context.</p>
        pub fn source(mut self, input: crate::model::ContextSource) -> Self {
            self.source = Some(input);
            self
        }
        /// <p>The source of the context.</p>
        pub fn set_source(
            mut self,
            input: std::option::Option<crate::model::ContextSource>,
        ) -> Self {
            self.source = input;
            self
        }
        /// <p>The type of the context.</p>
        pub fn context_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.context_type = Some(input.into());
            self
        }
        /// <p>The type of the context.</p>
        pub fn set_context_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.context_type = input;
            self
        }
        /// <p>When the context was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the context was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When the context was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the context was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ContextSummary`](crate::model::ContextSummary).
        pub fn build(self) -> crate::model::ContextSummary {
            crate::model::ContextSummary {
                context_arn: self.context_arn,
                context_name: self.context_name,
                source: self.source,
                context_type: self.context_type,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ContextSummary {
    /// Creates a new builder-style object to manufacture [`ContextSummary`](crate::model::ContextSummary).
    pub fn builder() -> crate::model::context_summary::Builder {
        crate::model::context_summary::Builder::default()
    }
}

/// <p>A structure describing the source of a context.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ContextSource {
    /// <p>The URI of the source.</p>
    #[doc(hidden)]
    pub source_uri: std::option::Option<std::string::String>,
    /// <p>The type of the source.</p>
    #[doc(hidden)]
    pub source_type: std::option::Option<std::string::String>,
    /// <p>The ID of the source.</p>
    #[doc(hidden)]
    pub source_id: std::option::Option<std::string::String>,
}
impl ContextSource {
    /// <p>The URI of the source.</p>
    pub fn source_uri(&self) -> std::option::Option<&str> {
        self.source_uri.as_deref()
    }
    /// <p>The type of the source.</p>
    pub fn source_type(&self) -> std::option::Option<&str> {
        self.source_type.as_deref()
    }
    /// <p>The ID of the source.</p>
    pub fn source_id(&self) -> std::option::Option<&str> {
        self.source_id.as_deref()
    }
}
/// See [`ContextSource`](crate::model::ContextSource).
pub mod context_source {

    /// A builder for [`ContextSource`](crate::model::ContextSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_uri: std::option::Option<std::string::String>,
        pub(crate) source_type: std::option::Option<std::string::String>,
        pub(crate) source_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The URI of the source.</p>
        pub fn source_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_uri = Some(input.into());
            self
        }
        /// <p>The URI of the source.</p>
        pub fn set_source_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_uri = input;
            self
        }
        /// <p>The type of the source.</p>
        pub fn source_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_type = Some(input.into());
            self
        }
        /// <p>The type of the source.</p>
        pub fn set_source_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_type = input;
            self
        }
        /// <p>The ID of the source.</p>
        pub fn source_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_id = Some(input.into());
            self
        }
        /// <p>The ID of the source.</p>
        pub fn set_source_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_id = input;
            self
        }
        /// Consumes the builder and constructs a [`ContextSource`](crate::model::ContextSource).
        pub fn build(self) -> crate::model::ContextSource {
            crate::model::ContextSource {
                source_uri: self.source_uri,
                source_type: self.source_type,
                source_id: self.source_id,
            }
        }
    }
}
impl ContextSource {
    /// Creates a new builder-style object to manufacture [`ContextSource`](crate::model::ContextSource).
    pub fn builder() -> crate::model::context_source::Builder {
        crate::model::context_source::Builder::default()
    }
}

/// When writing a match expression against `SortContextsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortcontextsby = unimplemented!();
/// match sortcontextsby {
///     SortContextsBy::CreationTime => { /* ... */ },
///     SortContextsBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortcontextsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortContextsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortContextsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortContextsBy::NewFeature` is defined.
/// Specifically, when `sortcontextsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortContextsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortContextsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortContextsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortContextsBy::CreationTime,
            "Name" => SortContextsBy::Name,
            other => SortContextsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortContextsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortContextsBy::from(s))
    }
}
impl SortContextsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortContextsBy::CreationTime => "CreationTime",
            SortContextsBy::Name => "Name",
            SortContextsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortContextsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A summary of a model compilation job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CompilationJobSummary {
    /// <p>The name of the model compilation job that you want a summary for.</p>
    #[doc(hidden)]
    pub compilation_job_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the model compilation job.</p>
    #[doc(hidden)]
    pub compilation_job_arn: std::option::Option<std::string::String>,
    /// <p>The time when the model compilation job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time when the model compilation job started.</p>
    #[doc(hidden)]
    pub compilation_start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The time when the model compilation job completed.</p>
    #[doc(hidden)]
    pub compilation_end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The type of device that the model will run on after the compilation job has completed.</p>
    #[doc(hidden)]
    pub compilation_target_device: std::option::Option<crate::model::TargetDevice>,
    /// <p>The type of OS that the model will run on after the compilation job has completed.</p>
    #[doc(hidden)]
    pub compilation_target_platform_os: std::option::Option<crate::model::TargetPlatformOs>,
    /// <p>The type of architecture that the model will run on after the compilation job has completed.</p>
    #[doc(hidden)]
    pub compilation_target_platform_arch: std::option::Option<crate::model::TargetPlatformArch>,
    /// <p>The type of accelerator that the model will run on after the compilation job has completed.</p>
    #[doc(hidden)]
    pub compilation_target_platform_accelerator:
        std::option::Option<crate::model::TargetPlatformAccelerator>,
    /// <p>The time when the model compilation job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The status of the model compilation job.</p>
    #[doc(hidden)]
    pub compilation_job_status: std::option::Option<crate::model::CompilationJobStatus>,
}
impl CompilationJobSummary {
    /// <p>The name of the model compilation job that you want a summary for.</p>
    pub fn compilation_job_name(&self) -> std::option::Option<&str> {
        self.compilation_job_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the model compilation job.</p>
    pub fn compilation_job_arn(&self) -> std::option::Option<&str> {
        self.compilation_job_arn.as_deref()
    }
    /// <p>The time when the model compilation job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The time when the model compilation job started.</p>
    pub fn compilation_start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.compilation_start_time.as_ref()
    }
    /// <p>The time when the model compilation job completed.</p>
    pub fn compilation_end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.compilation_end_time.as_ref()
    }
    /// <p>The type of device that the model will run on after the compilation job has completed.</p>
    pub fn compilation_target_device(&self) -> std::option::Option<&crate::model::TargetDevice> {
        self.compilation_target_device.as_ref()
    }
    /// <p>The type of OS that the model will run on after the compilation job has completed.</p>
    pub fn compilation_target_platform_os(
        &self,
    ) -> std::option::Option<&crate::model::TargetPlatformOs> {
        self.compilation_target_platform_os.as_ref()
    }
    /// <p>The type of architecture that the model will run on after the compilation job has completed.</p>
    pub fn compilation_target_platform_arch(
        &self,
    ) -> std::option::Option<&crate::model::TargetPlatformArch> {
        self.compilation_target_platform_arch.as_ref()
    }
    /// <p>The type of accelerator that the model will run on after the compilation job has completed.</p>
    pub fn compilation_target_platform_accelerator(
        &self,
    ) -> std::option::Option<&crate::model::TargetPlatformAccelerator> {
        self.compilation_target_platform_accelerator.as_ref()
    }
    /// <p>The time when the model compilation job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The status of the model compilation job.</p>
    pub fn compilation_job_status(
        &self,
    ) -> std::option::Option<&crate::model::CompilationJobStatus> {
        self.compilation_job_status.as_ref()
    }
}
/// See [`CompilationJobSummary`](crate::model::CompilationJobSummary).
pub mod compilation_job_summary {

    /// A builder for [`CompilationJobSummary`](crate::model::CompilationJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) compilation_job_name: std::option::Option<std::string::String>,
        pub(crate) compilation_job_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) compilation_start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) compilation_end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) compilation_target_device: std::option::Option<crate::model::TargetDevice>,
        pub(crate) compilation_target_platform_os:
            std::option::Option<crate::model::TargetPlatformOs>,
        pub(crate) compilation_target_platform_arch:
            std::option::Option<crate::model::TargetPlatformArch>,
        pub(crate) compilation_target_platform_accelerator:
            std::option::Option<crate::model::TargetPlatformAccelerator>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) compilation_job_status: std::option::Option<crate::model::CompilationJobStatus>,
    }
    impl Builder {
        /// <p>The name of the model compilation job that you want a summary for.</p>
        pub fn compilation_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.compilation_job_name = Some(input.into());
            self
        }
        /// <p>The name of the model compilation job that you want a summary for.</p>
        pub fn set_compilation_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.compilation_job_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model compilation job.</p>
        pub fn compilation_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.compilation_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model compilation job.</p>
        pub fn set_compilation_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.compilation_job_arn = input;
            self
        }
        /// <p>The time when the model compilation job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The time when the model compilation job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The time when the model compilation job started.</p>
        pub fn compilation_start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.compilation_start_time = Some(input);
            self
        }
        /// <p>The time when the model compilation job started.</p>
        pub fn set_compilation_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.compilation_start_time = input;
            self
        }
        /// <p>The time when the model compilation job completed.</p>
        pub fn compilation_end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.compilation_end_time = Some(input);
            self
        }
        /// <p>The time when the model compilation job completed.</p>
        pub fn set_compilation_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.compilation_end_time = input;
            self
        }
        /// <p>The type of device that the model will run on after the compilation job has completed.</p>
        pub fn compilation_target_device(mut self, input: crate::model::TargetDevice) -> Self {
            self.compilation_target_device = Some(input);
            self
        }
        /// <p>The type of device that the model will run on after the compilation job has completed.</p>
        pub fn set_compilation_target_device(
            mut self,
            input: std::option::Option<crate::model::TargetDevice>,
        ) -> Self {
            self.compilation_target_device = input;
            self
        }
        /// <p>The type of OS that the model will run on after the compilation job has completed.</p>
        pub fn compilation_target_platform_os(
            mut self,
            input: crate::model::TargetPlatformOs,
        ) -> Self {
            self.compilation_target_platform_os = Some(input);
            self
        }
        /// <p>The type of OS that the model will run on after the compilation job has completed.</p>
        pub fn set_compilation_target_platform_os(
            mut self,
            input: std::option::Option<crate::model::TargetPlatformOs>,
        ) -> Self {
            self.compilation_target_platform_os = input;
            self
        }
        /// <p>The type of architecture that the model will run on after the compilation job has completed.</p>
        pub fn compilation_target_platform_arch(
            mut self,
            input: crate::model::TargetPlatformArch,
        ) -> Self {
            self.compilation_target_platform_arch = Some(input);
            self
        }
        /// <p>The type of architecture that the model will run on after the compilation job has completed.</p>
        pub fn set_compilation_target_platform_arch(
            mut self,
            input: std::option::Option<crate::model::TargetPlatformArch>,
        ) -> Self {
            self.compilation_target_platform_arch = input;
            self
        }
        /// <p>The type of accelerator that the model will run on after the compilation job has completed.</p>
        pub fn compilation_target_platform_accelerator(
            mut self,
            input: crate::model::TargetPlatformAccelerator,
        ) -> Self {
            self.compilation_target_platform_accelerator = Some(input);
            self
        }
        /// <p>The type of accelerator that the model will run on after the compilation job has completed.</p>
        pub fn set_compilation_target_platform_accelerator(
            mut self,
            input: std::option::Option<crate::model::TargetPlatformAccelerator>,
        ) -> Self {
            self.compilation_target_platform_accelerator = input;
            self
        }
        /// <p>The time when the model compilation job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The time when the model compilation job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The status of the model compilation job.</p>
        pub fn compilation_job_status(mut self, input: crate::model::CompilationJobStatus) -> Self {
            self.compilation_job_status = Some(input);
            self
        }
        /// <p>The status of the model compilation job.</p>
        pub fn set_compilation_job_status(
            mut self,
            input: std::option::Option<crate::model::CompilationJobStatus>,
        ) -> Self {
            self.compilation_job_status = input;
            self
        }
        /// Consumes the builder and constructs a [`CompilationJobSummary`](crate::model::CompilationJobSummary).
        pub fn build(self) -> crate::model::CompilationJobSummary {
            crate::model::CompilationJobSummary {
                compilation_job_name: self.compilation_job_name,
                compilation_job_arn: self.compilation_job_arn,
                creation_time: self.creation_time,
                compilation_start_time: self.compilation_start_time,
                compilation_end_time: self.compilation_end_time,
                compilation_target_device: self.compilation_target_device,
                compilation_target_platform_os: self.compilation_target_platform_os,
                compilation_target_platform_arch: self.compilation_target_platform_arch,
                compilation_target_platform_accelerator: self
                    .compilation_target_platform_accelerator,
                last_modified_time: self.last_modified_time,
                compilation_job_status: self.compilation_job_status,
            }
        }
    }
}
impl CompilationJobSummary {
    /// Creates a new builder-style object to manufacture [`CompilationJobSummary`](crate::model::CompilationJobSummary).
    pub fn builder() -> crate::model::compilation_job_summary::Builder {
        crate::model::compilation_job_summary::Builder::default()
    }
}

/// When writing a match expression against `CompilationJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let compilationjobstatus = unimplemented!();
/// match compilationjobstatus {
///     CompilationJobStatus::Completed => { /* ... */ },
///     CompilationJobStatus::Failed => { /* ... */ },
///     CompilationJobStatus::Inprogress => { /* ... */ },
///     CompilationJobStatus::Starting => { /* ... */ },
///     CompilationJobStatus::Stopped => { /* ... */ },
///     CompilationJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `compilationjobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CompilationJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CompilationJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CompilationJobStatus::NewFeature` is defined.
/// Specifically, when `compilationjobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CompilationJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CompilationJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    Inprogress,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CompilationJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "COMPLETED" => CompilationJobStatus::Completed,
            "FAILED" => CompilationJobStatus::Failed,
            "INPROGRESS" => CompilationJobStatus::Inprogress,
            "STARTING" => CompilationJobStatus::Starting,
            "STOPPED" => CompilationJobStatus::Stopped,
            "STOPPING" => CompilationJobStatus::Stopping,
            other => {
                CompilationJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for CompilationJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CompilationJobStatus::from(s))
    }
}
impl CompilationJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CompilationJobStatus::Completed => "COMPLETED",
            CompilationJobStatus::Failed => "FAILED",
            CompilationJobStatus::Inprogress => "INPROGRESS",
            CompilationJobStatus::Starting => "STARTING",
            CompilationJobStatus::Stopped => "STOPPED",
            CompilationJobStatus::Stopping => "STOPPING",
            CompilationJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "COMPLETED",
            "FAILED",
            "INPROGRESS",
            "STARTING",
            "STOPPED",
            "STOPPING",
        ]
    }
}
impl AsRef<str> for CompilationJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TargetPlatformAccelerator`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let targetplatformaccelerator = unimplemented!();
/// match targetplatformaccelerator {
///     TargetPlatformAccelerator::IntelGraphics => { /* ... */ },
///     TargetPlatformAccelerator::Mali => { /* ... */ },
///     TargetPlatformAccelerator::Nna => { /* ... */ },
///     TargetPlatformAccelerator::Nvidia => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `targetplatformaccelerator` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TargetPlatformAccelerator::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TargetPlatformAccelerator::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TargetPlatformAccelerator::NewFeature` is defined.
/// Specifically, when `targetplatformaccelerator` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TargetPlatformAccelerator::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TargetPlatformAccelerator {
    #[allow(missing_docs)] // documentation missing in model
    IntelGraphics,
    #[allow(missing_docs)] // documentation missing in model
    Mali,
    #[allow(missing_docs)] // documentation missing in model
    Nna,
    #[allow(missing_docs)] // documentation missing in model
    Nvidia,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TargetPlatformAccelerator {
    fn from(s: &str) -> Self {
        match s {
            "INTEL_GRAPHICS" => TargetPlatformAccelerator::IntelGraphics,
            "MALI" => TargetPlatformAccelerator::Mali,
            "NNA" => TargetPlatformAccelerator::Nna,
            "NVIDIA" => TargetPlatformAccelerator::Nvidia,
            other => TargetPlatformAccelerator::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for TargetPlatformAccelerator {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TargetPlatformAccelerator::from(s))
    }
}
impl TargetPlatformAccelerator {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TargetPlatformAccelerator::IntelGraphics => "INTEL_GRAPHICS",
            TargetPlatformAccelerator::Mali => "MALI",
            TargetPlatformAccelerator::Nna => "NNA",
            TargetPlatformAccelerator::Nvidia => "NVIDIA",
            TargetPlatformAccelerator::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["INTEL_GRAPHICS", "MALI", "NNA", "NVIDIA"]
    }
}
impl AsRef<str> for TargetPlatformAccelerator {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TargetPlatformArch`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let targetplatformarch = unimplemented!();
/// match targetplatformarch {
///     TargetPlatformArch::Arm64 => { /* ... */ },
///     TargetPlatformArch::ArmEabi => { /* ... */ },
///     TargetPlatformArch::ArmEabihf => { /* ... */ },
///     TargetPlatformArch::X86 => { /* ... */ },
///     TargetPlatformArch::X8664 => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `targetplatformarch` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TargetPlatformArch::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TargetPlatformArch::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TargetPlatformArch::NewFeature` is defined.
/// Specifically, when `targetplatformarch` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TargetPlatformArch::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TargetPlatformArch {
    #[allow(missing_docs)] // documentation missing in model
    Arm64,
    #[allow(missing_docs)] // documentation missing in model
    ArmEabi,
    #[allow(missing_docs)] // documentation missing in model
    ArmEabihf,
    #[allow(missing_docs)] // documentation missing in model
    X86,
    #[allow(missing_docs)] // documentation missing in model
    X8664,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TargetPlatformArch {
    fn from(s: &str) -> Self {
        match s {
            "ARM64" => TargetPlatformArch::Arm64,
            "ARM_EABI" => TargetPlatformArch::ArmEabi,
            "ARM_EABIHF" => TargetPlatformArch::ArmEabihf,
            "X86" => TargetPlatformArch::X86,
            "X86_64" => TargetPlatformArch::X8664,
            other => {
                TargetPlatformArch::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for TargetPlatformArch {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TargetPlatformArch::from(s))
    }
}
impl TargetPlatformArch {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TargetPlatformArch::Arm64 => "ARM64",
            TargetPlatformArch::ArmEabi => "ARM_EABI",
            TargetPlatformArch::ArmEabihf => "ARM_EABIHF",
            TargetPlatformArch::X86 => "X86",
            TargetPlatformArch::X8664 => "X86_64",
            TargetPlatformArch::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ARM64", "ARM_EABI", "ARM_EABIHF", "X86", "X86_64"]
    }
}
impl AsRef<str> for TargetPlatformArch {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TargetPlatformOs`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let targetplatformos = unimplemented!();
/// match targetplatformos {
///     TargetPlatformOs::Android => { /* ... */ },
///     TargetPlatformOs::Linux => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `targetplatformos` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TargetPlatformOs::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TargetPlatformOs::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TargetPlatformOs::NewFeature` is defined.
/// Specifically, when `targetplatformos` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TargetPlatformOs::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TargetPlatformOs {
    #[allow(missing_docs)] // documentation missing in model
    Android,
    #[allow(missing_docs)] // documentation missing in model
    Linux,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TargetPlatformOs {
    fn from(s: &str) -> Self {
        match s {
            "ANDROID" => TargetPlatformOs::Android,
            "LINUX" => TargetPlatformOs::Linux,
            other => TargetPlatformOs::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for TargetPlatformOs {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TargetPlatformOs::from(s))
    }
}
impl TargetPlatformOs {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TargetPlatformOs::Android => "ANDROID",
            TargetPlatformOs::Linux => "LINUX",
            TargetPlatformOs::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ANDROID", "LINUX"]
    }
}
impl AsRef<str> for TargetPlatformOs {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `TargetDevice`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let targetdevice = unimplemented!();
/// match targetdevice {
///     TargetDevice::Aisage => { /* ... */ },
///     TargetDevice::AmbaCv2 => { /* ... */ },
///     TargetDevice::AmbaCv22 => { /* ... */ },
///     TargetDevice::AmbaCv25 => { /* ... */ },
///     TargetDevice::Coreml => { /* ... */ },
///     TargetDevice::Deeplens => { /* ... */ },
///     TargetDevice::Imx8Mplus => { /* ... */ },
///     TargetDevice::Imx8Qm => { /* ... */ },
///     TargetDevice::JacintoTda4Vm => { /* ... */ },
///     TargetDevice::JetsonNano => { /* ... */ },
///     TargetDevice::JetsonTx1 => { /* ... */ },
///     TargetDevice::JetsonTx2 => { /* ... */ },
///     TargetDevice::JetsonXavier => { /* ... */ },
///     TargetDevice::Lambda => { /* ... */ },
///     TargetDevice::MlC4 => { /* ... */ },
///     TargetDevice::MlC5 => { /* ... */ },
///     TargetDevice::MlEia2 => { /* ... */ },
///     TargetDevice::MlG4Dn => { /* ... */ },
///     TargetDevice::MlInf1 => { /* ... */ },
///     TargetDevice::MlM4 => { /* ... */ },
///     TargetDevice::MlM5 => { /* ... */ },
///     TargetDevice::MlP2 => { /* ... */ },
///     TargetDevice::MlP3 => { /* ... */ },
///     TargetDevice::Qcs603 => { /* ... */ },
///     TargetDevice::Qcs605 => { /* ... */ },
///     TargetDevice::Rasp3B => { /* ... */ },
///     TargetDevice::Rk3288 => { /* ... */ },
///     TargetDevice::Rk3399 => { /* ... */ },
///     TargetDevice::SbeC => { /* ... */ },
///     TargetDevice::SitaraAm57X => { /* ... */ },
///     TargetDevice::X86Win32 => { /* ... */ },
///     TargetDevice::X86Win64 => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `targetdevice` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TargetDevice::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TargetDevice::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TargetDevice::NewFeature` is defined.
/// Specifically, when `targetdevice` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TargetDevice::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TargetDevice {
    #[allow(missing_docs)] // documentation missing in model
    Aisage,
    #[allow(missing_docs)] // documentation missing in model
    AmbaCv2,
    #[allow(missing_docs)] // documentation missing in model
    AmbaCv22,
    #[allow(missing_docs)] // documentation missing in model
    AmbaCv25,
    #[allow(missing_docs)] // documentation missing in model
    Coreml,
    #[allow(missing_docs)] // documentation missing in model
    Deeplens,
    #[allow(missing_docs)] // documentation missing in model
    Imx8Mplus,
    #[allow(missing_docs)] // documentation missing in model
    Imx8Qm,
    #[allow(missing_docs)] // documentation missing in model
    JacintoTda4Vm,
    #[allow(missing_docs)] // documentation missing in model
    JetsonNano,
    #[allow(missing_docs)] // documentation missing in model
    JetsonTx1,
    #[allow(missing_docs)] // documentation missing in model
    JetsonTx2,
    #[allow(missing_docs)] // documentation missing in model
    JetsonXavier,
    #[allow(missing_docs)] // documentation missing in model
    Lambda,
    #[allow(missing_docs)] // documentation missing in model
    MlC4,
    #[allow(missing_docs)] // documentation missing in model
    MlC5,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2,
    #[allow(missing_docs)] // documentation missing in model
    MlG4Dn,
    #[allow(missing_docs)] // documentation missing in model
    MlInf1,
    #[allow(missing_docs)] // documentation missing in model
    MlM4,
    #[allow(missing_docs)] // documentation missing in model
    MlM5,
    #[allow(missing_docs)] // documentation missing in model
    MlP2,
    #[allow(missing_docs)] // documentation missing in model
    MlP3,
    #[allow(missing_docs)] // documentation missing in model
    Qcs603,
    #[allow(missing_docs)] // documentation missing in model
    Qcs605,
    #[allow(missing_docs)] // documentation missing in model
    Rasp3B,
    #[allow(missing_docs)] // documentation missing in model
    Rk3288,
    #[allow(missing_docs)] // documentation missing in model
    Rk3399,
    #[allow(missing_docs)] // documentation missing in model
    SbeC,
    #[allow(missing_docs)] // documentation missing in model
    SitaraAm57X,
    #[allow(missing_docs)] // documentation missing in model
    X86Win32,
    #[allow(missing_docs)] // documentation missing in model
    X86Win64,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TargetDevice {
    fn from(s: &str) -> Self {
        match s {
            "aisage" => TargetDevice::Aisage,
            "amba_cv2" => TargetDevice::AmbaCv2,
            "amba_cv22" => TargetDevice::AmbaCv22,
            "amba_cv25" => TargetDevice::AmbaCv25,
            "coreml" => TargetDevice::Coreml,
            "deeplens" => TargetDevice::Deeplens,
            "imx8mplus" => TargetDevice::Imx8Mplus,
            "imx8qm" => TargetDevice::Imx8Qm,
            "jacinto_tda4vm" => TargetDevice::JacintoTda4Vm,
            "jetson_nano" => TargetDevice::JetsonNano,
            "jetson_tx1" => TargetDevice::JetsonTx1,
            "jetson_tx2" => TargetDevice::JetsonTx2,
            "jetson_xavier" => TargetDevice::JetsonXavier,
            "lambda" => TargetDevice::Lambda,
            "ml_c4" => TargetDevice::MlC4,
            "ml_c5" => TargetDevice::MlC5,
            "ml_eia2" => TargetDevice::MlEia2,
            "ml_g4dn" => TargetDevice::MlG4Dn,
            "ml_inf1" => TargetDevice::MlInf1,
            "ml_m4" => TargetDevice::MlM4,
            "ml_m5" => TargetDevice::MlM5,
            "ml_p2" => TargetDevice::MlP2,
            "ml_p3" => TargetDevice::MlP3,
            "qcs603" => TargetDevice::Qcs603,
            "qcs605" => TargetDevice::Qcs605,
            "rasp3b" => TargetDevice::Rasp3B,
            "rk3288" => TargetDevice::Rk3288,
            "rk3399" => TargetDevice::Rk3399,
            "sbe_c" => TargetDevice::SbeC,
            "sitara_am57x" => TargetDevice::SitaraAm57X,
            "x86_win32" => TargetDevice::X86Win32,
            "x86_win64" => TargetDevice::X86Win64,
            other => TargetDevice::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for TargetDevice {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TargetDevice::from(s))
    }
}
impl TargetDevice {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TargetDevice::Aisage => "aisage",
            TargetDevice::AmbaCv2 => "amba_cv2",
            TargetDevice::AmbaCv22 => "amba_cv22",
            TargetDevice::AmbaCv25 => "amba_cv25",
            TargetDevice::Coreml => "coreml",
            TargetDevice::Deeplens => "deeplens",
            TargetDevice::Imx8Mplus => "imx8mplus",
            TargetDevice::Imx8Qm => "imx8qm",
            TargetDevice::JacintoTda4Vm => "jacinto_tda4vm",
            TargetDevice::JetsonNano => "jetson_nano",
            TargetDevice::JetsonTx1 => "jetson_tx1",
            TargetDevice::JetsonTx2 => "jetson_tx2",
            TargetDevice::JetsonXavier => "jetson_xavier",
            TargetDevice::Lambda => "lambda",
            TargetDevice::MlC4 => "ml_c4",
            TargetDevice::MlC5 => "ml_c5",
            TargetDevice::MlEia2 => "ml_eia2",
            TargetDevice::MlG4Dn => "ml_g4dn",
            TargetDevice::MlInf1 => "ml_inf1",
            TargetDevice::MlM4 => "ml_m4",
            TargetDevice::MlM5 => "ml_m5",
            TargetDevice::MlP2 => "ml_p2",
            TargetDevice::MlP3 => "ml_p3",
            TargetDevice::Qcs603 => "qcs603",
            TargetDevice::Qcs605 => "qcs605",
            TargetDevice::Rasp3B => "rasp3b",
            TargetDevice::Rk3288 => "rk3288",
            TargetDevice::Rk3399 => "rk3399",
            TargetDevice::SbeC => "sbe_c",
            TargetDevice::SitaraAm57X => "sitara_am57x",
            TargetDevice::X86Win32 => "x86_win32",
            TargetDevice::X86Win64 => "x86_win64",
            TargetDevice::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "aisage",
            "amba_cv2",
            "amba_cv22",
            "amba_cv25",
            "coreml",
            "deeplens",
            "imx8mplus",
            "imx8qm",
            "jacinto_tda4vm",
            "jetson_nano",
            "jetson_tx1",
            "jetson_tx2",
            "jetson_xavier",
            "lambda",
            "ml_c4",
            "ml_c5",
            "ml_eia2",
            "ml_g4dn",
            "ml_inf1",
            "ml_m4",
            "ml_m5",
            "ml_p2",
            "ml_p3",
            "qcs603",
            "qcs605",
            "rasp3b",
            "rk3288",
            "rk3399",
            "sbe_c",
            "sitara_am57x",
            "x86_win32",
            "x86_win64",
        ]
    }
}
impl AsRef<str> for TargetDevice {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ListCompilationJobsSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let listcompilationjobssortby = unimplemented!();
/// match listcompilationjobssortby {
///     ListCompilationJobsSortBy::CreationTime => { /* ... */ },
///     ListCompilationJobsSortBy::Name => { /* ... */ },
///     ListCompilationJobsSortBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `listcompilationjobssortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ListCompilationJobsSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ListCompilationJobsSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ListCompilationJobsSortBy::NewFeature` is defined.
/// Specifically, when `listcompilationjobssortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ListCompilationJobsSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ListCompilationJobsSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ListCompilationJobsSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => ListCompilationJobsSortBy::CreationTime,
            "Name" => ListCompilationJobsSortBy::Name,
            "Status" => ListCompilationJobsSortBy::Status,
            other => ListCompilationJobsSortBy::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ListCompilationJobsSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ListCompilationJobsSortBy::from(s))
    }
}
impl ListCompilationJobsSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ListCompilationJobsSortBy::CreationTime => "CreationTime",
            ListCompilationJobsSortBy::Name => "Name",
            ListCompilationJobsSortBy::Status => "Status",
            ListCompilationJobsSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for ListCompilationJobsSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies summary information about a Git repository.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CodeRepositorySummary {
    /// <p>The name of the Git repository.</p>
    #[doc(hidden)]
    pub code_repository_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the Git repository.</p>
    #[doc(hidden)]
    pub code_repository_arn: std::option::Option<std::string::String>,
    /// <p>The date and time that the Git repository was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The date and time that the Git repository was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Configuration details for the Git repository, including the URL where it is located and the ARN of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the repository.</p>
    #[doc(hidden)]
    pub git_config: std::option::Option<crate::model::GitConfig>,
}
impl CodeRepositorySummary {
    /// <p>The name of the Git repository.</p>
    pub fn code_repository_name(&self) -> std::option::Option<&str> {
        self.code_repository_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the Git repository.</p>
    pub fn code_repository_arn(&self) -> std::option::Option<&str> {
        self.code_repository_arn.as_deref()
    }
    /// <p>The date and time that the Git repository was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The date and time that the Git repository was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>Configuration details for the Git repository, including the URL where it is located and the ARN of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the repository.</p>
    pub fn git_config(&self) -> std::option::Option<&crate::model::GitConfig> {
        self.git_config.as_ref()
    }
}
/// See [`CodeRepositorySummary`](crate::model::CodeRepositorySummary).
pub mod code_repository_summary {

    /// A builder for [`CodeRepositorySummary`](crate::model::CodeRepositorySummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) code_repository_name: std::option::Option<std::string::String>,
        pub(crate) code_repository_arn: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) git_config: std::option::Option<crate::model::GitConfig>,
    }
    impl Builder {
        /// <p>The name of the Git repository.</p>
        pub fn code_repository_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.code_repository_name = Some(input.into());
            self
        }
        /// <p>The name of the Git repository.</p>
        pub fn set_code_repository_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.code_repository_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Git repository.</p>
        pub fn code_repository_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.code_repository_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Git repository.</p>
        pub fn set_code_repository_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.code_repository_arn = input;
            self
        }
        /// <p>The date and time that the Git repository was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The date and time that the Git repository was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The date and time that the Git repository was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The date and time that the Git repository was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>Configuration details for the Git repository, including the URL where it is located and the ARN of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the repository.</p>
        pub fn git_config(mut self, input: crate::model::GitConfig) -> Self {
            self.git_config = Some(input);
            self
        }
        /// <p>Configuration details for the Git repository, including the URL where it is located and the ARN of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the repository.</p>
        pub fn set_git_config(
            mut self,
            input: std::option::Option<crate::model::GitConfig>,
        ) -> Self {
            self.git_config = input;
            self
        }
        /// Consumes the builder and constructs a [`CodeRepositorySummary`](crate::model::CodeRepositorySummary).
        pub fn build(self) -> crate::model::CodeRepositorySummary {
            crate::model::CodeRepositorySummary {
                code_repository_name: self.code_repository_name,
                code_repository_arn: self.code_repository_arn,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                git_config: self.git_config,
            }
        }
    }
}
impl CodeRepositorySummary {
    /// Creates a new builder-style object to manufacture [`CodeRepositorySummary`](crate::model::CodeRepositorySummary).
    pub fn builder() -> crate::model::code_repository_summary::Builder {
        crate::model::code_repository_summary::Builder::default()
    }
}

/// <p>Specifies configuration details for a Git repository in your Amazon Web Services account.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct GitConfig {
    /// <p>The URL where the Git repository is located.</p>
    #[doc(hidden)]
    pub repository_url: std::option::Option<std::string::String>,
    /// <p>The default branch for the Git repository.</p>
    #[doc(hidden)]
    pub branch: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
    /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
    #[doc(hidden)]
    pub secret_arn: std::option::Option<std::string::String>,
}
impl GitConfig {
    /// <p>The URL where the Git repository is located.</p>
    pub fn repository_url(&self) -> std::option::Option<&str> {
        self.repository_url.as_deref()
    }
    /// <p>The default branch for the Git repository.</p>
    pub fn branch(&self) -> std::option::Option<&str> {
        self.branch.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
    /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
    pub fn secret_arn(&self) -> std::option::Option<&str> {
        self.secret_arn.as_deref()
    }
}
/// See [`GitConfig`](crate::model::GitConfig).
pub mod git_config {

    /// A builder for [`GitConfig`](crate::model::GitConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) repository_url: std::option::Option<std::string::String>,
        pub(crate) branch: std::option::Option<std::string::String>,
        pub(crate) secret_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The URL where the Git repository is located.</p>
        pub fn repository_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.repository_url = Some(input.into());
            self
        }
        /// <p>The URL where the Git repository is located.</p>
        pub fn set_repository_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.repository_url = input;
            self
        }
        /// <p>The default branch for the Git repository.</p>
        pub fn branch(mut self, input: impl Into<std::string::String>) -> Self {
            self.branch = Some(input.into());
            self
        }
        /// <p>The default branch for the Git repository.</p>
        pub fn set_branch(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.branch = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
        /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
        pub fn secret_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.secret_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of <code>AWSCURRENT</code> and must be in the following format:</p>
        /// <p> <code>{"username": <i>UserName</i>, "password": <i>Password</i>}</code> </p>
        pub fn set_secret_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.secret_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`GitConfig`](crate::model::GitConfig).
        pub fn build(self) -> crate::model::GitConfig {
            crate::model::GitConfig {
                repository_url: self.repository_url,
                branch: self.branch,
                secret_arn: self.secret_arn,
            }
        }
    }
}
impl GitConfig {
    /// Creates a new builder-style object to manufacture [`GitConfig`](crate::model::GitConfig).
    pub fn builder() -> crate::model::git_config::Builder {
        crate::model::git_config::Builder::default()
    }
}

/// When writing a match expression against `CodeRepositorySortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let coderepositorysortorder = unimplemented!();
/// match coderepositorysortorder {
///     CodeRepositorySortOrder::Ascending => { /* ... */ },
///     CodeRepositorySortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `coderepositorysortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CodeRepositorySortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CodeRepositorySortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CodeRepositorySortOrder::NewFeature` is defined.
/// Specifically, when `coderepositorysortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CodeRepositorySortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CodeRepositorySortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CodeRepositorySortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => CodeRepositorySortOrder::Ascending,
            "Descending" => CodeRepositorySortOrder::Descending,
            other => CodeRepositorySortOrder::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for CodeRepositorySortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CodeRepositorySortOrder::from(s))
    }
}
impl CodeRepositorySortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CodeRepositorySortOrder::Ascending => "Ascending",
            CodeRepositorySortOrder::Descending => "Descending",
            CodeRepositorySortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for CodeRepositorySortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `CodeRepositorySortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let coderepositorysortby = unimplemented!();
/// match coderepositorysortby {
///     CodeRepositorySortBy::CreationTime => { /* ... */ },
///     CodeRepositorySortBy::LastModifiedTime => { /* ... */ },
///     CodeRepositorySortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `coderepositorysortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CodeRepositorySortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CodeRepositorySortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CodeRepositorySortBy::NewFeature` is defined.
/// Specifically, when `coderepositorysortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CodeRepositorySortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CodeRepositorySortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CodeRepositorySortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => CodeRepositorySortBy::CreationTime,
            "LastModifiedTime" => CodeRepositorySortBy::LastModifiedTime,
            "Name" => CodeRepositorySortBy::Name,
            other => {
                CodeRepositorySortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for CodeRepositorySortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CodeRepositorySortBy::from(s))
    }
}
impl CodeRepositorySortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CodeRepositorySortBy::CreationTime => "CreationTime",
            CodeRepositorySortBy::LastModifiedTime => "LastModifiedTime",
            CodeRepositorySortBy::Name => "Name",
            CodeRepositorySortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "LastModifiedTime", "Name"]
    }
}
impl AsRef<str> for CodeRepositorySortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Information about a candidate produced by an AutoML training job, including its status, steps, and other properties.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlCandidate {
    /// <p>The name of the candidate.</p>
    #[doc(hidden)]
    pub candidate_name: std::option::Option<std::string::String>,
    /// <p>The best candidate result from an AutoML training job.</p>
    #[doc(hidden)]
    pub final_auto_ml_job_objective_metric:
        std::option::Option<crate::model::FinalAutoMlJobObjectiveMetric>,
    /// <p>The objective's status.</p>
    #[doc(hidden)]
    pub objective_status: std::option::Option<crate::model::ObjectiveStatus>,
    /// <p>Information about the candidate's steps.</p>
    #[doc(hidden)]
    pub candidate_steps: std::option::Option<std::vec::Vec<crate::model::AutoMlCandidateStep>>,
    /// <p>The candidate's status.</p>
    #[doc(hidden)]
    pub candidate_status: std::option::Option<crate::model::CandidateStatus>,
    /// <p>Information about the inference container definitions.</p>
    #[doc(hidden)]
    pub inference_containers:
        std::option::Option<std::vec::Vec<crate::model::AutoMlContainerDefinition>>,
    /// <p>The creation time.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The end time.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The last modified time.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The failure reason.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The properties of an AutoML candidate job.</p>
    #[doc(hidden)]
    pub candidate_properties: std::option::Option<crate::model::CandidateProperties>,
}
impl AutoMlCandidate {
    /// <p>The name of the candidate.</p>
    pub fn candidate_name(&self) -> std::option::Option<&str> {
        self.candidate_name.as_deref()
    }
    /// <p>The best candidate result from an AutoML training job.</p>
    pub fn final_auto_ml_job_objective_metric(
        &self,
    ) -> std::option::Option<&crate::model::FinalAutoMlJobObjectiveMetric> {
        self.final_auto_ml_job_objective_metric.as_ref()
    }
    /// <p>The objective's status.</p>
    pub fn objective_status(&self) -> std::option::Option<&crate::model::ObjectiveStatus> {
        self.objective_status.as_ref()
    }
    /// <p>Information about the candidate's steps.</p>
    pub fn candidate_steps(&self) -> std::option::Option<&[crate::model::AutoMlCandidateStep]> {
        self.candidate_steps.as_deref()
    }
    /// <p>The candidate's status.</p>
    pub fn candidate_status(&self) -> std::option::Option<&crate::model::CandidateStatus> {
        self.candidate_status.as_ref()
    }
    /// <p>Information about the inference container definitions.</p>
    pub fn inference_containers(
        &self,
    ) -> std::option::Option<&[crate::model::AutoMlContainerDefinition]> {
        self.inference_containers.as_deref()
    }
    /// <p>The creation time.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The end time.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
    /// <p>The last modified time.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The failure reason.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The properties of an AutoML candidate job.</p>
    pub fn candidate_properties(&self) -> std::option::Option<&crate::model::CandidateProperties> {
        self.candidate_properties.as_ref()
    }
}
/// See [`AutoMlCandidate`](crate::model::AutoMlCandidate).
pub mod auto_ml_candidate {

    /// A builder for [`AutoMlCandidate`](crate::model::AutoMlCandidate).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) candidate_name: std::option::Option<std::string::String>,
        pub(crate) final_auto_ml_job_objective_metric:
            std::option::Option<crate::model::FinalAutoMlJobObjectiveMetric>,
        pub(crate) objective_status: std::option::Option<crate::model::ObjectiveStatus>,
        pub(crate) candidate_steps:
            std::option::Option<std::vec::Vec<crate::model::AutoMlCandidateStep>>,
        pub(crate) candidate_status: std::option::Option<crate::model::CandidateStatus>,
        pub(crate) inference_containers:
            std::option::Option<std::vec::Vec<crate::model::AutoMlContainerDefinition>>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) candidate_properties: std::option::Option<crate::model::CandidateProperties>,
    }
    impl Builder {
        /// <p>The name of the candidate.</p>
        pub fn candidate_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.candidate_name = Some(input.into());
            self
        }
        /// <p>The name of the candidate.</p>
        pub fn set_candidate_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.candidate_name = input;
            self
        }
        /// <p>The best candidate result from an AutoML training job.</p>
        pub fn final_auto_ml_job_objective_metric(
            mut self,
            input: crate::model::FinalAutoMlJobObjectiveMetric,
        ) -> Self {
            self.final_auto_ml_job_objective_metric = Some(input);
            self
        }
        /// <p>The best candidate result from an AutoML training job.</p>
        pub fn set_final_auto_ml_job_objective_metric(
            mut self,
            input: std::option::Option<crate::model::FinalAutoMlJobObjectiveMetric>,
        ) -> Self {
            self.final_auto_ml_job_objective_metric = input;
            self
        }
        /// <p>The objective's status.</p>
        pub fn objective_status(mut self, input: crate::model::ObjectiveStatus) -> Self {
            self.objective_status = Some(input);
            self
        }
        /// <p>The objective's status.</p>
        pub fn set_objective_status(
            mut self,
            input: std::option::Option<crate::model::ObjectiveStatus>,
        ) -> Self {
            self.objective_status = input;
            self
        }
        /// Appends an item to `candidate_steps`.
        ///
        /// To override the contents of this collection use [`set_candidate_steps`](Self::set_candidate_steps).
        ///
        /// <p>Information about the candidate's steps.</p>
        pub fn candidate_steps(mut self, input: crate::model::AutoMlCandidateStep) -> Self {
            let mut v = self.candidate_steps.unwrap_or_default();
            v.push(input);
            self.candidate_steps = Some(v);
            self
        }
        /// <p>Information about the candidate's steps.</p>
        pub fn set_candidate_steps(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::AutoMlCandidateStep>>,
        ) -> Self {
            self.candidate_steps = input;
            self
        }
        /// <p>The candidate's status.</p>
        pub fn candidate_status(mut self, input: crate::model::CandidateStatus) -> Self {
            self.candidate_status = Some(input);
            self
        }
        /// <p>The candidate's status.</p>
        pub fn set_candidate_status(
            mut self,
            input: std::option::Option<crate::model::CandidateStatus>,
        ) -> Self {
            self.candidate_status = input;
            self
        }
        /// Appends an item to `inference_containers`.
        ///
        /// To override the contents of this collection use [`set_inference_containers`](Self::set_inference_containers).
        ///
        /// <p>Information about the inference container definitions.</p>
        pub fn inference_containers(
            mut self,
            input: crate::model::AutoMlContainerDefinition,
        ) -> Self {
            let mut v = self.inference_containers.unwrap_or_default();
            v.push(input);
            self.inference_containers = Some(v);
            self
        }
        /// <p>Information about the inference container definitions.</p>
        pub fn set_inference_containers(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::AutoMlContainerDefinition>>,
        ) -> Self {
            self.inference_containers = input;
            self
        }
        /// <p>The creation time.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The end time.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>The end time.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// <p>The last modified time.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>The last modified time.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The failure reason.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The failure reason.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// <p>The properties of an AutoML candidate job.</p>
        pub fn candidate_properties(mut self, input: crate::model::CandidateProperties) -> Self {
            self.candidate_properties = Some(input);
            self
        }
        /// <p>The properties of an AutoML candidate job.</p>
        pub fn set_candidate_properties(
            mut self,
            input: std::option::Option<crate::model::CandidateProperties>,
        ) -> Self {
            self.candidate_properties = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlCandidate`](crate::model::AutoMlCandidate).
        pub fn build(self) -> crate::model::AutoMlCandidate {
            crate::model::AutoMlCandidate {
                candidate_name: self.candidate_name,
                final_auto_ml_job_objective_metric: self.final_auto_ml_job_objective_metric,
                objective_status: self.objective_status,
                candidate_steps: self.candidate_steps,
                candidate_status: self.candidate_status,
                inference_containers: self.inference_containers,
                creation_time: self.creation_time,
                end_time: self.end_time,
                last_modified_time: self.last_modified_time,
                failure_reason: self.failure_reason,
                candidate_properties: self.candidate_properties,
            }
        }
    }
}
impl AutoMlCandidate {
    /// Creates a new builder-style object to manufacture [`AutoMlCandidate`](crate::model::AutoMlCandidate).
    pub fn builder() -> crate::model::auto_ml_candidate::Builder {
        crate::model::auto_ml_candidate::Builder::default()
    }
}

/// <p>The properties of an AutoML candidate job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CandidateProperties {
    /// <p>The Amazon S3 prefix to the artifacts generated for an AutoML candidate.</p>
    #[doc(hidden)]
    pub candidate_artifact_locations: std::option::Option<crate::model::CandidateArtifactLocations>,
    /// <p>Information about the candidate metrics for an AutoML job.</p>
    #[doc(hidden)]
    pub candidate_metrics: std::option::Option<std::vec::Vec<crate::model::MetricDatum>>,
}
impl CandidateProperties {
    /// <p>The Amazon S3 prefix to the artifacts generated for an AutoML candidate.</p>
    pub fn candidate_artifact_locations(
        &self,
    ) -> std::option::Option<&crate::model::CandidateArtifactLocations> {
        self.candidate_artifact_locations.as_ref()
    }
    /// <p>Information about the candidate metrics for an AutoML job.</p>
    pub fn candidate_metrics(&self) -> std::option::Option<&[crate::model::MetricDatum]> {
        self.candidate_metrics.as_deref()
    }
}
/// See [`CandidateProperties`](crate::model::CandidateProperties).
pub mod candidate_properties {

    /// A builder for [`CandidateProperties`](crate::model::CandidateProperties).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) candidate_artifact_locations:
            std::option::Option<crate::model::CandidateArtifactLocations>,
        pub(crate) candidate_metrics: std::option::Option<std::vec::Vec<crate::model::MetricDatum>>,
    }
    impl Builder {
        /// <p>The Amazon S3 prefix to the artifacts generated for an AutoML candidate.</p>
        pub fn candidate_artifact_locations(
            mut self,
            input: crate::model::CandidateArtifactLocations,
        ) -> Self {
            self.candidate_artifact_locations = Some(input);
            self
        }
        /// <p>The Amazon S3 prefix to the artifacts generated for an AutoML candidate.</p>
        pub fn set_candidate_artifact_locations(
            mut self,
            input: std::option::Option<crate::model::CandidateArtifactLocations>,
        ) -> Self {
            self.candidate_artifact_locations = input;
            self
        }
        /// Appends an item to `candidate_metrics`.
        ///
        /// To override the contents of this collection use [`set_candidate_metrics`](Self::set_candidate_metrics).
        ///
        /// <p>Information about the candidate metrics for an AutoML job.</p>
        pub fn candidate_metrics(mut self, input: crate::model::MetricDatum) -> Self {
            let mut v = self.candidate_metrics.unwrap_or_default();
            v.push(input);
            self.candidate_metrics = Some(v);
            self
        }
        /// <p>Information about the candidate metrics for an AutoML job.</p>
        pub fn set_candidate_metrics(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MetricDatum>>,
        ) -> Self {
            self.candidate_metrics = input;
            self
        }
        /// Consumes the builder and constructs a [`CandidateProperties`](crate::model::CandidateProperties).
        pub fn build(self) -> crate::model::CandidateProperties {
            crate::model::CandidateProperties {
                candidate_artifact_locations: self.candidate_artifact_locations,
                candidate_metrics: self.candidate_metrics,
            }
        }
    }
}
impl CandidateProperties {
    /// Creates a new builder-style object to manufacture [`CandidateProperties`](crate::model::CandidateProperties).
    pub fn builder() -> crate::model::candidate_properties::Builder {
        crate::model::candidate_properties::Builder::default()
    }
}

/// <p>Information about the metric for a candidate produced by an AutoML job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MetricDatum {
    /// <p>The name of the metric.</p>
    #[doc(hidden)]
    pub metric_name: std::option::Option<crate::model::AutoMlMetricEnum>,
    /// <p>The value of the metric.</p>
    #[doc(hidden)]
    pub value: f32,
    /// <p>The dataset split from which the AutoML job produced the metric.</p>
    #[doc(hidden)]
    pub set: std::option::Option<crate::model::MetricSetSource>,
    /// <p>The name of the standard metric. </p> <note>
    /// <p>For definitions of the standard metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-metrics"> <code>Autopilot candidate metrics</code> </a>.</p>
    /// </note>
    #[doc(hidden)]
    pub standard_metric_name: std::option::Option<crate::model::AutoMlMetricExtendedEnum>,
}
impl MetricDatum {
    /// <p>The name of the metric.</p>
    pub fn metric_name(&self) -> std::option::Option<&crate::model::AutoMlMetricEnum> {
        self.metric_name.as_ref()
    }
    /// <p>The value of the metric.</p>
    pub fn value(&self) -> f32 {
        self.value
    }
    /// <p>The dataset split from which the AutoML job produced the metric.</p>
    pub fn set(&self) -> std::option::Option<&crate::model::MetricSetSource> {
        self.set.as_ref()
    }
    /// <p>The name of the standard metric. </p> <note>
    /// <p>For definitions of the standard metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-metrics"> <code>Autopilot candidate metrics</code> </a>.</p>
    /// </note>
    pub fn standard_metric_name(
        &self,
    ) -> std::option::Option<&crate::model::AutoMlMetricExtendedEnum> {
        self.standard_metric_name.as_ref()
    }
}
/// See [`MetricDatum`](crate::model::MetricDatum).
pub mod metric_datum {

    /// A builder for [`MetricDatum`](crate::model::MetricDatum).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metric_name: std::option::Option<crate::model::AutoMlMetricEnum>,
        pub(crate) value: std::option::Option<f32>,
        pub(crate) set: std::option::Option<crate::model::MetricSetSource>,
        pub(crate) standard_metric_name:
            std::option::Option<crate::model::AutoMlMetricExtendedEnum>,
    }
    impl Builder {
        /// <p>The name of the metric.</p>
        pub fn metric_name(mut self, input: crate::model::AutoMlMetricEnum) -> Self {
            self.metric_name = Some(input);
            self
        }
        /// <p>The name of the metric.</p>
        pub fn set_metric_name(
            mut self,
            input: std::option::Option<crate::model::AutoMlMetricEnum>,
        ) -> Self {
            self.metric_name = input;
            self
        }
        /// <p>The value of the metric.</p>
        pub fn value(mut self, input: f32) -> Self {
            self.value = Some(input);
            self
        }
        /// <p>The value of the metric.</p>
        pub fn set_value(mut self, input: std::option::Option<f32>) -> Self {
            self.value = input;
            self
        }
        /// <p>The dataset split from which the AutoML job produced the metric.</p>
        pub fn set(mut self, input: crate::model::MetricSetSource) -> Self {
            self.set = Some(input);
            self
        }
        /// <p>The dataset split from which the AutoML job produced the metric.</p>
        pub fn set_set(
            mut self,
            input: std::option::Option<crate::model::MetricSetSource>,
        ) -> Self {
            self.set = input;
            self
        }
        /// <p>The name of the standard metric. </p> <note>
        /// <p>For definitions of the standard metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-metrics"> <code>Autopilot candidate metrics</code> </a>.</p>
        /// </note>
        pub fn standard_metric_name(
            mut self,
            input: crate::model::AutoMlMetricExtendedEnum,
        ) -> Self {
            self.standard_metric_name = Some(input);
            self
        }
        /// <p>The name of the standard metric. </p> <note>
        /// <p>For definitions of the standard metrics, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-metrics"> <code>Autopilot candidate metrics</code> </a>.</p>
        /// </note>
        pub fn set_standard_metric_name(
            mut self,
            input: std::option::Option<crate::model::AutoMlMetricExtendedEnum>,
        ) -> Self {
            self.standard_metric_name = input;
            self
        }
        /// Consumes the builder and constructs a [`MetricDatum`](crate::model::MetricDatum).
        pub fn build(self) -> crate::model::MetricDatum {
            crate::model::MetricDatum {
                metric_name: self.metric_name,
                value: self.value.unwrap_or_default(),
                set: self.set,
                standard_metric_name: self.standard_metric_name,
            }
        }
    }
}
impl MetricDatum {
    /// Creates a new builder-style object to manufacture [`MetricDatum`](crate::model::MetricDatum).
    pub fn builder() -> crate::model::metric_datum::Builder {
        crate::model::metric_datum::Builder::default()
    }
}

/// When writing a match expression against `AutoMlMetricExtendedEnum`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automlmetricextendedenum = unimplemented!();
/// match automlmetricextendedenum {
///     AutoMlMetricExtendedEnum::Auc => { /* ... */ },
///     AutoMlMetricExtendedEnum::Accuracy => { /* ... */ },
///     AutoMlMetricExtendedEnum::BalancedAccuracy => { /* ... */ },
///     AutoMlMetricExtendedEnum::F1 => { /* ... */ },
///     AutoMlMetricExtendedEnum::F1Macro => { /* ... */ },
///     AutoMlMetricExtendedEnum::InferenceLatency => { /* ... */ },
///     AutoMlMetricExtendedEnum::LogLoss => { /* ... */ },
///     AutoMlMetricExtendedEnum::Mae => { /* ... */ },
///     AutoMlMetricExtendedEnum::Mse => { /* ... */ },
///     AutoMlMetricExtendedEnum::Precision => { /* ... */ },
///     AutoMlMetricExtendedEnum::PrecisionMacro => { /* ... */ },
///     AutoMlMetricExtendedEnum::R2 => { /* ... */ },
///     AutoMlMetricExtendedEnum::Rmse => { /* ... */ },
///     AutoMlMetricExtendedEnum::Recall => { /* ... */ },
///     AutoMlMetricExtendedEnum::RecallMacro => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automlmetricextendedenum` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlMetricExtendedEnum::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlMetricExtendedEnum::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlMetricExtendedEnum::NewFeature` is defined.
/// Specifically, when `automlmetricextendedenum` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlMetricExtendedEnum::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlMetricExtendedEnum {
    #[allow(missing_docs)] // documentation missing in model
    Auc,
    #[allow(missing_docs)] // documentation missing in model
    Accuracy,
    #[allow(missing_docs)] // documentation missing in model
    BalancedAccuracy,
    #[allow(missing_docs)] // documentation missing in model
    F1,
    #[allow(missing_docs)] // documentation missing in model
    F1Macro,
    #[allow(missing_docs)] // documentation missing in model
    InferenceLatency,
    #[allow(missing_docs)] // documentation missing in model
    LogLoss,
    #[allow(missing_docs)] // documentation missing in model
    Mae,
    #[allow(missing_docs)] // documentation missing in model
    Mse,
    #[allow(missing_docs)] // documentation missing in model
    Precision,
    #[allow(missing_docs)] // documentation missing in model
    PrecisionMacro,
    #[allow(missing_docs)] // documentation missing in model
    R2,
    #[allow(missing_docs)] // documentation missing in model
    Rmse,
    #[allow(missing_docs)] // documentation missing in model
    Recall,
    #[allow(missing_docs)] // documentation missing in model
    RecallMacro,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlMetricExtendedEnum {
    fn from(s: &str) -> Self {
        match s {
            "AUC" => AutoMlMetricExtendedEnum::Auc,
            "Accuracy" => AutoMlMetricExtendedEnum::Accuracy,
            "BalancedAccuracy" => AutoMlMetricExtendedEnum::BalancedAccuracy,
            "F1" => AutoMlMetricExtendedEnum::F1,
            "F1macro" => AutoMlMetricExtendedEnum::F1Macro,
            "InferenceLatency" => AutoMlMetricExtendedEnum::InferenceLatency,
            "LogLoss" => AutoMlMetricExtendedEnum::LogLoss,
            "MAE" => AutoMlMetricExtendedEnum::Mae,
            "MSE" => AutoMlMetricExtendedEnum::Mse,
            "Precision" => AutoMlMetricExtendedEnum::Precision,
            "PrecisionMacro" => AutoMlMetricExtendedEnum::PrecisionMacro,
            "R2" => AutoMlMetricExtendedEnum::R2,
            "RMSE" => AutoMlMetricExtendedEnum::Rmse,
            "Recall" => AutoMlMetricExtendedEnum::Recall,
            "RecallMacro" => AutoMlMetricExtendedEnum::RecallMacro,
            other => AutoMlMetricExtendedEnum::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for AutoMlMetricExtendedEnum {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlMetricExtendedEnum::from(s))
    }
}
impl AutoMlMetricExtendedEnum {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlMetricExtendedEnum::Auc => "AUC",
            AutoMlMetricExtendedEnum::Accuracy => "Accuracy",
            AutoMlMetricExtendedEnum::BalancedAccuracy => "BalancedAccuracy",
            AutoMlMetricExtendedEnum::F1 => "F1",
            AutoMlMetricExtendedEnum::F1Macro => "F1macro",
            AutoMlMetricExtendedEnum::InferenceLatency => "InferenceLatency",
            AutoMlMetricExtendedEnum::LogLoss => "LogLoss",
            AutoMlMetricExtendedEnum::Mae => "MAE",
            AutoMlMetricExtendedEnum::Mse => "MSE",
            AutoMlMetricExtendedEnum::Precision => "Precision",
            AutoMlMetricExtendedEnum::PrecisionMacro => "PrecisionMacro",
            AutoMlMetricExtendedEnum::R2 => "R2",
            AutoMlMetricExtendedEnum::Rmse => "RMSE",
            AutoMlMetricExtendedEnum::Recall => "Recall",
            AutoMlMetricExtendedEnum::RecallMacro => "RecallMacro",
            AutoMlMetricExtendedEnum::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "AUC",
            "Accuracy",
            "BalancedAccuracy",
            "F1",
            "F1macro",
            "InferenceLatency",
            "LogLoss",
            "MAE",
            "MSE",
            "Precision",
            "PrecisionMacro",
            "R2",
            "RMSE",
            "Recall",
            "RecallMacro",
        ]
    }
}
impl AsRef<str> for AutoMlMetricExtendedEnum {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `MetricSetSource`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let metricsetsource = unimplemented!();
/// match metricsetsource {
///     MetricSetSource::Test => { /* ... */ },
///     MetricSetSource::Train => { /* ... */ },
///     MetricSetSource::Validation => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `metricsetsource` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MetricSetSource::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MetricSetSource::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MetricSetSource::NewFeature` is defined.
/// Specifically, when `metricsetsource` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MetricSetSource::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MetricSetSource {
    #[allow(missing_docs)] // documentation missing in model
    Test,
    #[allow(missing_docs)] // documentation missing in model
    Train,
    #[allow(missing_docs)] // documentation missing in model
    Validation,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MetricSetSource {
    fn from(s: &str) -> Self {
        match s {
            "Test" => MetricSetSource::Test,
            "Train" => MetricSetSource::Train,
            "Validation" => MetricSetSource::Validation,
            other => MetricSetSource::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for MetricSetSource {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MetricSetSource::from(s))
    }
}
impl MetricSetSource {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MetricSetSource::Test => "Test",
            MetricSetSource::Train => "Train",
            MetricSetSource::Validation => "Validation",
            MetricSetSource::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Test", "Train", "Validation"]
    }
}
impl AsRef<str> for MetricSetSource {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AutoMlMetricEnum`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automlmetricenum = unimplemented!();
/// match automlmetricenum {
///     AutoMlMetricEnum::Auc => { /* ... */ },
///     AutoMlMetricEnum::Accuracy => { /* ... */ },
///     AutoMlMetricEnum::BalancedAccuracy => { /* ... */ },
///     AutoMlMetricEnum::F1 => { /* ... */ },
///     AutoMlMetricEnum::F1Macro => { /* ... */ },
///     AutoMlMetricEnum::Mae => { /* ... */ },
///     AutoMlMetricEnum::Mse => { /* ... */ },
///     AutoMlMetricEnum::Precision => { /* ... */ },
///     AutoMlMetricEnum::PrecisionMacro => { /* ... */ },
///     AutoMlMetricEnum::R2 => { /* ... */ },
///     AutoMlMetricEnum::Rmse => { /* ... */ },
///     AutoMlMetricEnum::Recall => { /* ... */ },
///     AutoMlMetricEnum::RecallMacro => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automlmetricenum` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlMetricEnum::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlMetricEnum::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlMetricEnum::NewFeature` is defined.
/// Specifically, when `automlmetricenum` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlMetricEnum::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlMetricEnum {
    #[allow(missing_docs)] // documentation missing in model
    Auc,
    #[allow(missing_docs)] // documentation missing in model
    Accuracy,
    #[allow(missing_docs)] // documentation missing in model
    BalancedAccuracy,
    #[allow(missing_docs)] // documentation missing in model
    F1,
    #[allow(missing_docs)] // documentation missing in model
    F1Macro,
    #[allow(missing_docs)] // documentation missing in model
    Mae,
    #[allow(missing_docs)] // documentation missing in model
    Mse,
    #[allow(missing_docs)] // documentation missing in model
    Precision,
    #[allow(missing_docs)] // documentation missing in model
    PrecisionMacro,
    #[allow(missing_docs)] // documentation missing in model
    R2,
    #[allow(missing_docs)] // documentation missing in model
    Rmse,
    #[allow(missing_docs)] // documentation missing in model
    Recall,
    #[allow(missing_docs)] // documentation missing in model
    RecallMacro,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlMetricEnum {
    fn from(s: &str) -> Self {
        match s {
            "AUC" => AutoMlMetricEnum::Auc,
            "Accuracy" => AutoMlMetricEnum::Accuracy,
            "BalancedAccuracy" => AutoMlMetricEnum::BalancedAccuracy,
            "F1" => AutoMlMetricEnum::F1,
            "F1macro" => AutoMlMetricEnum::F1Macro,
            "MAE" => AutoMlMetricEnum::Mae,
            "MSE" => AutoMlMetricEnum::Mse,
            "Precision" => AutoMlMetricEnum::Precision,
            "PrecisionMacro" => AutoMlMetricEnum::PrecisionMacro,
            "R2" => AutoMlMetricEnum::R2,
            "RMSE" => AutoMlMetricEnum::Rmse,
            "Recall" => AutoMlMetricEnum::Recall,
            "RecallMacro" => AutoMlMetricEnum::RecallMacro,
            other => AutoMlMetricEnum::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AutoMlMetricEnum {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlMetricEnum::from(s))
    }
}
impl AutoMlMetricEnum {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlMetricEnum::Auc => "AUC",
            AutoMlMetricEnum::Accuracy => "Accuracy",
            AutoMlMetricEnum::BalancedAccuracy => "BalancedAccuracy",
            AutoMlMetricEnum::F1 => "F1",
            AutoMlMetricEnum::F1Macro => "F1macro",
            AutoMlMetricEnum::Mae => "MAE",
            AutoMlMetricEnum::Mse => "MSE",
            AutoMlMetricEnum::Precision => "Precision",
            AutoMlMetricEnum::PrecisionMacro => "PrecisionMacro",
            AutoMlMetricEnum::R2 => "R2",
            AutoMlMetricEnum::Rmse => "RMSE",
            AutoMlMetricEnum::Recall => "Recall",
            AutoMlMetricEnum::RecallMacro => "RecallMacro",
            AutoMlMetricEnum::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "AUC",
            "Accuracy",
            "BalancedAccuracy",
            "F1",
            "F1macro",
            "MAE",
            "MSE",
            "Precision",
            "PrecisionMacro",
            "R2",
            "RMSE",
            "Recall",
            "RecallMacro",
        ]
    }
}
impl AsRef<str> for AutoMlMetricEnum {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The location of artifacts for an AutoML candidate job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CandidateArtifactLocations {
    /// <p>The Amazon S3 prefix to the explainability artifacts generated for the AutoML candidate.</p>
    #[doc(hidden)]
    pub explainability: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 prefix to the model insight artifacts generated for the AutoML candidate.</p>
    #[doc(hidden)]
    pub model_insights: std::option::Option<std::string::String>,
}
impl CandidateArtifactLocations {
    /// <p>The Amazon S3 prefix to the explainability artifacts generated for the AutoML candidate.</p>
    pub fn explainability(&self) -> std::option::Option<&str> {
        self.explainability.as_deref()
    }
    /// <p>The Amazon S3 prefix to the model insight artifacts generated for the AutoML candidate.</p>
    pub fn model_insights(&self) -> std::option::Option<&str> {
        self.model_insights.as_deref()
    }
}
/// See [`CandidateArtifactLocations`](crate::model::CandidateArtifactLocations).
pub mod candidate_artifact_locations {

    /// A builder for [`CandidateArtifactLocations`](crate::model::CandidateArtifactLocations).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) explainability: std::option::Option<std::string::String>,
        pub(crate) model_insights: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 prefix to the explainability artifacts generated for the AutoML candidate.</p>
        pub fn explainability(mut self, input: impl Into<std::string::String>) -> Self {
            self.explainability = Some(input.into());
            self
        }
        /// <p>The Amazon S3 prefix to the explainability artifacts generated for the AutoML candidate.</p>
        pub fn set_explainability(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.explainability = input;
            self
        }
        /// <p>The Amazon S3 prefix to the model insight artifacts generated for the AutoML candidate.</p>
        pub fn model_insights(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_insights = Some(input.into());
            self
        }
        /// <p>The Amazon S3 prefix to the model insight artifacts generated for the AutoML candidate.</p>
        pub fn set_model_insights(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_insights = input;
            self
        }
        /// Consumes the builder and constructs a [`CandidateArtifactLocations`](crate::model::CandidateArtifactLocations).
        pub fn build(self) -> crate::model::CandidateArtifactLocations {
            crate::model::CandidateArtifactLocations {
                explainability: self.explainability,
                model_insights: self.model_insights,
            }
        }
    }
}
impl CandidateArtifactLocations {
    /// Creates a new builder-style object to manufacture [`CandidateArtifactLocations`](crate::model::CandidateArtifactLocations).
    pub fn builder() -> crate::model::candidate_artifact_locations::Builder {
        crate::model::candidate_artifact_locations::Builder::default()
    }
}

/// <p>A list of container definitions that describe the different containers that make up an AutoML candidate. For more information, see .</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlContainerDefinition {
    /// <p>The Amazon Elastic Container Registry (Amazon ECR) path of the container. For more information, see .</p>
    #[doc(hidden)]
    pub image: std::option::Option<std::string::String>,
    /// <p>The location of the model artifacts. For more information, see .</p>
    #[doc(hidden)]
    pub model_data_url: std::option::Option<std::string::String>,
    /// <p>The environment variables to set in the container. For more information, see .</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl AutoMlContainerDefinition {
    /// <p>The Amazon Elastic Container Registry (Amazon ECR) path of the container. For more information, see .</p>
    pub fn image(&self) -> std::option::Option<&str> {
        self.image.as_deref()
    }
    /// <p>The location of the model artifacts. For more information, see .</p>
    pub fn model_data_url(&self) -> std::option::Option<&str> {
        self.model_data_url.as_deref()
    }
    /// <p>The environment variables to set in the container. For more information, see .</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
}
/// See [`AutoMlContainerDefinition`](crate::model::AutoMlContainerDefinition).
pub mod auto_ml_container_definition {

    /// A builder for [`AutoMlContainerDefinition`](crate::model::AutoMlContainerDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image: std::option::Option<std::string::String>,
        pub(crate) model_data_url: std::option::Option<std::string::String>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The Amazon Elastic Container Registry (Amazon ECR) path of the container. For more information, see .</p>
        pub fn image(mut self, input: impl Into<std::string::String>) -> Self {
            self.image = Some(input.into());
            self
        }
        /// <p>The Amazon Elastic Container Registry (Amazon ECR) path of the container. For more information, see .</p>
        pub fn set_image(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image = input;
            self
        }
        /// <p>The location of the model artifacts. For more information, see .</p>
        pub fn model_data_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_data_url = Some(input.into());
            self
        }
        /// <p>The location of the model artifacts. For more information, see .</p>
        pub fn set_model_data_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_data_url = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>The environment variables to set in the container. For more information, see .</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>The environment variables to set in the container. For more information, see .</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlContainerDefinition`](crate::model::AutoMlContainerDefinition).
        pub fn build(self) -> crate::model::AutoMlContainerDefinition {
            crate::model::AutoMlContainerDefinition {
                image: self.image,
                model_data_url: self.model_data_url,
                environment: self.environment,
            }
        }
    }
}
impl AutoMlContainerDefinition {
    /// Creates a new builder-style object to manufacture [`AutoMlContainerDefinition`](crate::model::AutoMlContainerDefinition).
    pub fn builder() -> crate::model::auto_ml_container_definition::Builder {
        crate::model::auto_ml_container_definition::Builder::default()
    }
}

/// When writing a match expression against `CandidateStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let candidatestatus = unimplemented!();
/// match candidatestatus {
///     CandidateStatus::Completed => { /* ... */ },
///     CandidateStatus::Failed => { /* ... */ },
///     CandidateStatus::InProgress => { /* ... */ },
///     CandidateStatus::Stopped => { /* ... */ },
///     CandidateStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `candidatestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CandidateStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CandidateStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CandidateStatus::NewFeature` is defined.
/// Specifically, when `candidatestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CandidateStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CandidateStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CandidateStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => CandidateStatus::Completed,
            "Failed" => CandidateStatus::Failed,
            "InProgress" => CandidateStatus::InProgress,
            "Stopped" => CandidateStatus::Stopped,
            "Stopping" => CandidateStatus::Stopping,
            other => CandidateStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for CandidateStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CandidateStatus::from(s))
    }
}
impl CandidateStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CandidateStatus::Completed => "Completed",
            CandidateStatus::Failed => "Failed",
            CandidateStatus::InProgress => "InProgress",
            CandidateStatus::Stopped => "Stopped",
            CandidateStatus::Stopping => "Stopping",
            CandidateStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for CandidateStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Information about the steps for a candidate and what step it is working on.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlCandidateStep {
    /// <p>Whether the candidate is at the transform, training, or processing step.</p>
    #[doc(hidden)]
    pub candidate_step_type: std::option::Option<crate::model::CandidateStepType>,
    /// <p>The ARN for the candidate's step.</p>
    #[doc(hidden)]
    pub candidate_step_arn: std::option::Option<std::string::String>,
    /// <p>The name for the candidate's step.</p>
    #[doc(hidden)]
    pub candidate_step_name: std::option::Option<std::string::String>,
}
impl AutoMlCandidateStep {
    /// <p>Whether the candidate is at the transform, training, or processing step.</p>
    pub fn candidate_step_type(&self) -> std::option::Option<&crate::model::CandidateStepType> {
        self.candidate_step_type.as_ref()
    }
    /// <p>The ARN for the candidate's step.</p>
    pub fn candidate_step_arn(&self) -> std::option::Option<&str> {
        self.candidate_step_arn.as_deref()
    }
    /// <p>The name for the candidate's step.</p>
    pub fn candidate_step_name(&self) -> std::option::Option<&str> {
        self.candidate_step_name.as_deref()
    }
}
/// See [`AutoMlCandidateStep`](crate::model::AutoMlCandidateStep).
pub mod auto_ml_candidate_step {

    /// A builder for [`AutoMlCandidateStep`](crate::model::AutoMlCandidateStep).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) candidate_step_type: std::option::Option<crate::model::CandidateStepType>,
        pub(crate) candidate_step_arn: std::option::Option<std::string::String>,
        pub(crate) candidate_step_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Whether the candidate is at the transform, training, or processing step.</p>
        pub fn candidate_step_type(mut self, input: crate::model::CandidateStepType) -> Self {
            self.candidate_step_type = Some(input);
            self
        }
        /// <p>Whether the candidate is at the transform, training, or processing step.</p>
        pub fn set_candidate_step_type(
            mut self,
            input: std::option::Option<crate::model::CandidateStepType>,
        ) -> Self {
            self.candidate_step_type = input;
            self
        }
        /// <p>The ARN for the candidate's step.</p>
        pub fn candidate_step_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.candidate_step_arn = Some(input.into());
            self
        }
        /// <p>The ARN for the candidate's step.</p>
        pub fn set_candidate_step_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.candidate_step_arn = input;
            self
        }
        /// <p>The name for the candidate's step.</p>
        pub fn candidate_step_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.candidate_step_name = Some(input.into());
            self
        }
        /// <p>The name for the candidate's step.</p>
        pub fn set_candidate_step_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.candidate_step_name = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlCandidateStep`](crate::model::AutoMlCandidateStep).
        pub fn build(self) -> crate::model::AutoMlCandidateStep {
            crate::model::AutoMlCandidateStep {
                candidate_step_type: self.candidate_step_type,
                candidate_step_arn: self.candidate_step_arn,
                candidate_step_name: self.candidate_step_name,
            }
        }
    }
}
impl AutoMlCandidateStep {
    /// Creates a new builder-style object to manufacture [`AutoMlCandidateStep`](crate::model::AutoMlCandidateStep).
    pub fn builder() -> crate::model::auto_ml_candidate_step::Builder {
        crate::model::auto_ml_candidate_step::Builder::default()
    }
}

/// When writing a match expression against `CandidateStepType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let candidatesteptype = unimplemented!();
/// match candidatesteptype {
///     CandidateStepType::Processing => { /* ... */ },
///     CandidateStepType::Training => { /* ... */ },
///     CandidateStepType::Transform => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `candidatesteptype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CandidateStepType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CandidateStepType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CandidateStepType::NewFeature` is defined.
/// Specifically, when `candidatesteptype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CandidateStepType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CandidateStepType {
    #[allow(missing_docs)] // documentation missing in model
    Processing,
    #[allow(missing_docs)] // documentation missing in model
    Training,
    #[allow(missing_docs)] // documentation missing in model
    Transform,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CandidateStepType {
    fn from(s: &str) -> Self {
        match s {
            "AWS::SageMaker::ProcessingJob" => CandidateStepType::Processing,
            "AWS::SageMaker::TrainingJob" => CandidateStepType::Training,
            "AWS::SageMaker::TransformJob" => CandidateStepType::Transform,
            other => {
                CandidateStepType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for CandidateStepType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CandidateStepType::from(s))
    }
}
impl CandidateStepType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CandidateStepType::Processing => "AWS::SageMaker::ProcessingJob",
            CandidateStepType::Training => "AWS::SageMaker::TrainingJob",
            CandidateStepType::Transform => "AWS::SageMaker::TransformJob",
            CandidateStepType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "AWS::SageMaker::ProcessingJob",
            "AWS::SageMaker::TrainingJob",
            "AWS::SageMaker::TransformJob",
        ]
    }
}
impl AsRef<str> for CandidateStepType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The best candidate result from an AutoML training job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FinalAutoMlJobObjectiveMetric {
    /// <p>The type of metric with the best result.</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::AutoMlJobObjectiveType>,
    /// <p>The name of the metric with the best result. For a description of the possible objective metrics, see <code>AutoMLJobObjective$MetricName</code>.</p>
    #[doc(hidden)]
    pub metric_name: std::option::Option<crate::model::AutoMlMetricEnum>,
    /// <p>The value of the metric with the best result.</p>
    #[doc(hidden)]
    pub value: f32,
}
impl FinalAutoMlJobObjectiveMetric {
    /// <p>The type of metric with the best result.</p>
    pub fn r#type(&self) -> std::option::Option<&crate::model::AutoMlJobObjectiveType> {
        self.r#type.as_ref()
    }
    /// <p>The name of the metric with the best result. For a description of the possible objective metrics, see <code>AutoMLJobObjective$MetricName</code>.</p>
    pub fn metric_name(&self) -> std::option::Option<&crate::model::AutoMlMetricEnum> {
        self.metric_name.as_ref()
    }
    /// <p>The value of the metric with the best result.</p>
    pub fn value(&self) -> f32 {
        self.value
    }
}
/// See [`FinalAutoMlJobObjectiveMetric`](crate::model::FinalAutoMlJobObjectiveMetric).
pub mod final_auto_ml_job_objective_metric {

    /// A builder for [`FinalAutoMlJobObjectiveMetric`](crate::model::FinalAutoMlJobObjectiveMetric).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r#type: std::option::Option<crate::model::AutoMlJobObjectiveType>,
        pub(crate) metric_name: std::option::Option<crate::model::AutoMlMetricEnum>,
        pub(crate) value: std::option::Option<f32>,
    }
    impl Builder {
        /// <p>The type of metric with the best result.</p>
        pub fn r#type(mut self, input: crate::model::AutoMlJobObjectiveType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>The type of metric with the best result.</p>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobObjectiveType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The name of the metric with the best result. For a description of the possible objective metrics, see <code>AutoMLJobObjective$MetricName</code>.</p>
        pub fn metric_name(mut self, input: crate::model::AutoMlMetricEnum) -> Self {
            self.metric_name = Some(input);
            self
        }
        /// <p>The name of the metric with the best result. For a description of the possible objective metrics, see <code>AutoMLJobObjective$MetricName</code>.</p>
        pub fn set_metric_name(
            mut self,
            input: std::option::Option<crate::model::AutoMlMetricEnum>,
        ) -> Self {
            self.metric_name = input;
            self
        }
        /// <p>The value of the metric with the best result.</p>
        pub fn value(mut self, input: f32) -> Self {
            self.value = Some(input);
            self
        }
        /// <p>The value of the metric with the best result.</p>
        pub fn set_value(mut self, input: std::option::Option<f32>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`FinalAutoMlJobObjectiveMetric`](crate::model::FinalAutoMlJobObjectiveMetric).
        pub fn build(self) -> crate::model::FinalAutoMlJobObjectiveMetric {
            crate::model::FinalAutoMlJobObjectiveMetric {
                r#type: self.r#type,
                metric_name: self.metric_name,
                value: self.value.unwrap_or_default(),
            }
        }
    }
}
impl FinalAutoMlJobObjectiveMetric {
    /// Creates a new builder-style object to manufacture [`FinalAutoMlJobObjectiveMetric`](crate::model::FinalAutoMlJobObjectiveMetric).
    pub fn builder() -> crate::model::final_auto_ml_job_objective_metric::Builder {
        crate::model::final_auto_ml_job_objective_metric::Builder::default()
    }
}

/// When writing a match expression against `AutoMlJobObjectiveType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automljobobjectivetype = unimplemented!();
/// match automljobobjectivetype {
///     AutoMlJobObjectiveType::Maximize => { /* ... */ },
///     AutoMlJobObjectiveType::Minimize => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automljobobjectivetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlJobObjectiveType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlJobObjectiveType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlJobObjectiveType::NewFeature` is defined.
/// Specifically, when `automljobobjectivetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlJobObjectiveType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlJobObjectiveType {
    #[allow(missing_docs)] // documentation missing in model
    Maximize,
    #[allow(missing_docs)] // documentation missing in model
    Minimize,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlJobObjectiveType {
    fn from(s: &str) -> Self {
        match s {
            "Maximize" => AutoMlJobObjectiveType::Maximize,
            "Minimize" => AutoMlJobObjectiveType::Minimize,
            other => {
                AutoMlJobObjectiveType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for AutoMlJobObjectiveType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlJobObjectiveType::from(s))
    }
}
impl AutoMlJobObjectiveType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlJobObjectiveType::Maximize => "Maximize",
            AutoMlJobObjectiveType::Minimize => "Minimize",
            AutoMlJobObjectiveType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Maximize", "Minimize"]
    }
}
impl AsRef<str> for AutoMlJobObjectiveType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `CandidateSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let candidatesortby = unimplemented!();
/// match candidatesortby {
///     CandidateSortBy::CreationTime => { /* ... */ },
///     CandidateSortBy::FinalObjectiveMetricValue => { /* ... */ },
///     CandidateSortBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `candidatesortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CandidateSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CandidateSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CandidateSortBy::NewFeature` is defined.
/// Specifically, when `candidatesortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CandidateSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CandidateSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    FinalObjectiveMetricValue,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CandidateSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => CandidateSortBy::CreationTime,
            "FinalObjectiveMetricValue" => CandidateSortBy::FinalObjectiveMetricValue,
            "Status" => CandidateSortBy::Status,
            other => CandidateSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for CandidateSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CandidateSortBy::from(s))
    }
}
impl CandidateSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CandidateSortBy::CreationTime => "CreationTime",
            CandidateSortBy::FinalObjectiveMetricValue => "FinalObjectiveMetricValue",
            CandidateSortBy::Status => "Status",
            CandidateSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "FinalObjectiveMetricValue", "Status"]
    }
}
impl AsRef<str> for CandidateSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AutoMlSortOrder`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automlsortorder = unimplemented!();
/// match automlsortorder {
///     AutoMlSortOrder::Ascending => { /* ... */ },
///     AutoMlSortOrder::Descending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automlsortorder` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlSortOrder::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlSortOrder::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlSortOrder::NewFeature` is defined.
/// Specifically, when `automlsortorder` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlSortOrder::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlSortOrder {
    #[allow(missing_docs)] // documentation missing in model
    Ascending,
    #[allow(missing_docs)] // documentation missing in model
    Descending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlSortOrder {
    fn from(s: &str) -> Self {
        match s {
            "Ascending" => AutoMlSortOrder::Ascending,
            "Descending" => AutoMlSortOrder::Descending,
            other => AutoMlSortOrder::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AutoMlSortOrder {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlSortOrder::from(s))
    }
}
impl AutoMlSortOrder {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlSortOrder::Ascending => "Ascending",
            AutoMlSortOrder::Descending => "Descending",
            AutoMlSortOrder::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Ascending", "Descending"]
    }
}
impl AsRef<str> for AutoMlSortOrder {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides a summary about an AutoML job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlJobSummary {
    /// <p>The name of the AutoML job you are requesting.</p>
    #[doc(hidden)]
    pub auto_ml_job_name: std::option::Option<std::string::String>,
    /// <p>The ARN of the AutoML job.</p>
    #[doc(hidden)]
    pub auto_ml_job_arn: std::option::Option<std::string::String>,
    /// <p>The status of the AutoML job.</p>
    #[doc(hidden)]
    pub auto_ml_job_status: std::option::Option<crate::model::AutoMlJobStatus>,
    /// <p>The secondary status of the AutoML job.</p>
    #[doc(hidden)]
    pub auto_ml_job_secondary_status: std::option::Option<crate::model::AutoMlJobSecondaryStatus>,
    /// <p>When the AutoML job was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The end time of an AutoML job.</p>
    #[doc(hidden)]
    pub end_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the AutoML job was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The failure reason of an AutoML job.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
    /// <p>The list of reasons for partial failures within an AutoML job.</p>
    #[doc(hidden)]
    pub partial_failure_reasons:
        std::option::Option<std::vec::Vec<crate::model::AutoMlPartialFailureReason>>,
}
impl AutoMlJobSummary {
    /// <p>The name of the AutoML job you are requesting.</p>
    pub fn auto_ml_job_name(&self) -> std::option::Option<&str> {
        self.auto_ml_job_name.as_deref()
    }
    /// <p>The ARN of the AutoML job.</p>
    pub fn auto_ml_job_arn(&self) -> std::option::Option<&str> {
        self.auto_ml_job_arn.as_deref()
    }
    /// <p>The status of the AutoML job.</p>
    pub fn auto_ml_job_status(&self) -> std::option::Option<&crate::model::AutoMlJobStatus> {
        self.auto_ml_job_status.as_ref()
    }
    /// <p>The secondary status of the AutoML job.</p>
    pub fn auto_ml_job_secondary_status(
        &self,
    ) -> std::option::Option<&crate::model::AutoMlJobSecondaryStatus> {
        self.auto_ml_job_secondary_status.as_ref()
    }
    /// <p>When the AutoML job was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The end time of an AutoML job.</p>
    pub fn end_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.end_time.as_ref()
    }
    /// <p>When the AutoML job was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The failure reason of an AutoML job.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
    /// <p>The list of reasons for partial failures within an AutoML job.</p>
    pub fn partial_failure_reasons(
        &self,
    ) -> std::option::Option<&[crate::model::AutoMlPartialFailureReason]> {
        self.partial_failure_reasons.as_deref()
    }
}
/// See [`AutoMlJobSummary`](crate::model::AutoMlJobSummary).
pub mod auto_ml_job_summary {

    /// A builder for [`AutoMlJobSummary`](crate::model::AutoMlJobSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) auto_ml_job_name: std::option::Option<std::string::String>,
        pub(crate) auto_ml_job_arn: std::option::Option<std::string::String>,
        pub(crate) auto_ml_job_status: std::option::Option<crate::model::AutoMlJobStatus>,
        pub(crate) auto_ml_job_secondary_status:
            std::option::Option<crate::model::AutoMlJobSecondaryStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) end_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
        pub(crate) partial_failure_reasons:
            std::option::Option<std::vec::Vec<crate::model::AutoMlPartialFailureReason>>,
    }
    impl Builder {
        /// <p>The name of the AutoML job you are requesting.</p>
        pub fn auto_ml_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.auto_ml_job_name = Some(input.into());
            self
        }
        /// <p>The name of the AutoML job you are requesting.</p>
        pub fn set_auto_ml_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.auto_ml_job_name = input;
            self
        }
        /// <p>The ARN of the AutoML job.</p>
        pub fn auto_ml_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.auto_ml_job_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the AutoML job.</p>
        pub fn set_auto_ml_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.auto_ml_job_arn = input;
            self
        }
        /// <p>The status of the AutoML job.</p>
        pub fn auto_ml_job_status(mut self, input: crate::model::AutoMlJobStatus) -> Self {
            self.auto_ml_job_status = Some(input);
            self
        }
        /// <p>The status of the AutoML job.</p>
        pub fn set_auto_ml_job_status(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobStatus>,
        ) -> Self {
            self.auto_ml_job_status = input;
            self
        }
        /// <p>The secondary status of the AutoML job.</p>
        pub fn auto_ml_job_secondary_status(
            mut self,
            input: crate::model::AutoMlJobSecondaryStatus,
        ) -> Self {
            self.auto_ml_job_secondary_status = Some(input);
            self
        }
        /// <p>The secondary status of the AutoML job.</p>
        pub fn set_auto_ml_job_secondary_status(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobSecondaryStatus>,
        ) -> Self {
            self.auto_ml_job_secondary_status = input;
            self
        }
        /// <p>When the AutoML job was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the AutoML job was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The end time of an AutoML job.</p>
        pub fn end_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.end_time = Some(input);
            self
        }
        /// <p>The end time of an AutoML job.</p>
        pub fn set_end_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.end_time = input;
            self
        }
        /// <p>When the AutoML job was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the AutoML job was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The failure reason of an AutoML job.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>The failure reason of an AutoML job.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Appends an item to `partial_failure_reasons`.
        ///
        /// To override the contents of this collection use [`set_partial_failure_reasons`](Self::set_partial_failure_reasons).
        ///
        /// <p>The list of reasons for partial failures within an AutoML job.</p>
        pub fn partial_failure_reasons(
            mut self,
            input: crate::model::AutoMlPartialFailureReason,
        ) -> Self {
            let mut v = self.partial_failure_reasons.unwrap_or_default();
            v.push(input);
            self.partial_failure_reasons = Some(v);
            self
        }
        /// <p>The list of reasons for partial failures within an AutoML job.</p>
        pub fn set_partial_failure_reasons(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::AutoMlPartialFailureReason>>,
        ) -> Self {
            self.partial_failure_reasons = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlJobSummary`](crate::model::AutoMlJobSummary).
        pub fn build(self) -> crate::model::AutoMlJobSummary {
            crate::model::AutoMlJobSummary {
                auto_ml_job_name: self.auto_ml_job_name,
                auto_ml_job_arn: self.auto_ml_job_arn,
                auto_ml_job_status: self.auto_ml_job_status,
                auto_ml_job_secondary_status: self.auto_ml_job_secondary_status,
                creation_time: self.creation_time,
                end_time: self.end_time,
                last_modified_time: self.last_modified_time,
                failure_reason: self.failure_reason,
                partial_failure_reasons: self.partial_failure_reasons,
            }
        }
    }
}
impl AutoMlJobSummary {
    /// Creates a new builder-style object to manufacture [`AutoMlJobSummary`](crate::model::AutoMlJobSummary).
    pub fn builder() -> crate::model::auto_ml_job_summary::Builder {
        crate::model::auto_ml_job_summary::Builder::default()
    }
}

/// <p>The reason for a partial failure of an AutoML job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlPartialFailureReason {
    /// <p>The message containing the reason for a partial failure of an AutoML job.</p>
    #[doc(hidden)]
    pub partial_failure_message: std::option::Option<std::string::String>,
}
impl AutoMlPartialFailureReason {
    /// <p>The message containing the reason for a partial failure of an AutoML job.</p>
    pub fn partial_failure_message(&self) -> std::option::Option<&str> {
        self.partial_failure_message.as_deref()
    }
}
/// See [`AutoMlPartialFailureReason`](crate::model::AutoMlPartialFailureReason).
pub mod auto_ml_partial_failure_reason {

    /// A builder for [`AutoMlPartialFailureReason`](crate::model::AutoMlPartialFailureReason).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) partial_failure_message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The message containing the reason for a partial failure of an AutoML job.</p>
        pub fn partial_failure_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.partial_failure_message = Some(input.into());
            self
        }
        /// <p>The message containing the reason for a partial failure of an AutoML job.</p>
        pub fn set_partial_failure_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.partial_failure_message = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlPartialFailureReason`](crate::model::AutoMlPartialFailureReason).
        pub fn build(self) -> crate::model::AutoMlPartialFailureReason {
            crate::model::AutoMlPartialFailureReason {
                partial_failure_message: self.partial_failure_message,
            }
        }
    }
}
impl AutoMlPartialFailureReason {
    /// Creates a new builder-style object to manufacture [`AutoMlPartialFailureReason`](crate::model::AutoMlPartialFailureReason).
    pub fn builder() -> crate::model::auto_ml_partial_failure_reason::Builder {
        crate::model::auto_ml_partial_failure_reason::Builder::default()
    }
}

/// When writing a match expression against `AutoMlJobSecondaryStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automljobsecondarystatus = unimplemented!();
/// match automljobsecondarystatus {
///     AutoMlJobSecondaryStatus::AnalyzingData => { /* ... */ },
///     AutoMlJobSecondaryStatus::CandidateDefinitionsGenerated => { /* ... */ },
///     AutoMlJobSecondaryStatus::Completed => { /* ... */ },
///     AutoMlJobSecondaryStatus::DeployingModel => { /* ... */ },
///     AutoMlJobSecondaryStatus::ExplainabilityError => { /* ... */ },
///     AutoMlJobSecondaryStatus::Failed => { /* ... */ },
///     AutoMlJobSecondaryStatus::FeatureEngineering => { /* ... */ },
///     AutoMlJobSecondaryStatus::GeneratingExplainabilityReport => { /* ... */ },
///     AutoMlJobSecondaryStatus::GeneratingModelInsightsReport => { /* ... */ },
///     AutoMlJobSecondaryStatus::MaxAutoMlJobRuntimeReached => { /* ... */ },
///     AutoMlJobSecondaryStatus::MaxCandidatesReached => { /* ... */ },
///     AutoMlJobSecondaryStatus::ModelDeploymentError => { /* ... */ },
///     AutoMlJobSecondaryStatus::ModelInsightsError => { /* ... */ },
///     AutoMlJobSecondaryStatus::ModelTuning => { /* ... */ },
///     AutoMlJobSecondaryStatus::Starting => { /* ... */ },
///     AutoMlJobSecondaryStatus::Stopped => { /* ... */ },
///     AutoMlJobSecondaryStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automljobsecondarystatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlJobSecondaryStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlJobSecondaryStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlJobSecondaryStatus::NewFeature` is defined.
/// Specifically, when `automljobsecondarystatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlJobSecondaryStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlJobSecondaryStatus {
    #[allow(missing_docs)] // documentation missing in model
    AnalyzingData,
    #[allow(missing_docs)] // documentation missing in model
    CandidateDefinitionsGenerated,
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    DeployingModel,
    #[allow(missing_docs)] // documentation missing in model
    ExplainabilityError,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    FeatureEngineering,
    #[allow(missing_docs)] // documentation missing in model
    GeneratingExplainabilityReport,
    #[allow(missing_docs)] // documentation missing in model
    GeneratingModelInsightsReport,
    #[allow(missing_docs)] // documentation missing in model
    MaxAutoMlJobRuntimeReached,
    #[allow(missing_docs)] // documentation missing in model
    MaxCandidatesReached,
    #[allow(missing_docs)] // documentation missing in model
    ModelDeploymentError,
    #[allow(missing_docs)] // documentation missing in model
    ModelInsightsError,
    #[allow(missing_docs)] // documentation missing in model
    ModelTuning,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlJobSecondaryStatus {
    fn from(s: &str) -> Self {
        match s {
            "AnalyzingData" => AutoMlJobSecondaryStatus::AnalyzingData,
            "CandidateDefinitionsGenerated" => {
                AutoMlJobSecondaryStatus::CandidateDefinitionsGenerated
            }
            "Completed" => AutoMlJobSecondaryStatus::Completed,
            "DeployingModel" => AutoMlJobSecondaryStatus::DeployingModel,
            "ExplainabilityError" => AutoMlJobSecondaryStatus::ExplainabilityError,
            "Failed" => AutoMlJobSecondaryStatus::Failed,
            "FeatureEngineering" => AutoMlJobSecondaryStatus::FeatureEngineering,
            "GeneratingExplainabilityReport" => {
                AutoMlJobSecondaryStatus::GeneratingExplainabilityReport
            }
            "GeneratingModelInsightsReport" => {
                AutoMlJobSecondaryStatus::GeneratingModelInsightsReport
            }
            "MaxAutoMLJobRuntimeReached" => AutoMlJobSecondaryStatus::MaxAutoMlJobRuntimeReached,
            "MaxCandidatesReached" => AutoMlJobSecondaryStatus::MaxCandidatesReached,
            "ModelDeploymentError" => AutoMlJobSecondaryStatus::ModelDeploymentError,
            "ModelInsightsError" => AutoMlJobSecondaryStatus::ModelInsightsError,
            "ModelTuning" => AutoMlJobSecondaryStatus::ModelTuning,
            "Starting" => AutoMlJobSecondaryStatus::Starting,
            "Stopped" => AutoMlJobSecondaryStatus::Stopped,
            "Stopping" => AutoMlJobSecondaryStatus::Stopping,
            other => AutoMlJobSecondaryStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for AutoMlJobSecondaryStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlJobSecondaryStatus::from(s))
    }
}
impl AutoMlJobSecondaryStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlJobSecondaryStatus::AnalyzingData => "AnalyzingData",
            AutoMlJobSecondaryStatus::CandidateDefinitionsGenerated => {
                "CandidateDefinitionsGenerated"
            }
            AutoMlJobSecondaryStatus::Completed => "Completed",
            AutoMlJobSecondaryStatus::DeployingModel => "DeployingModel",
            AutoMlJobSecondaryStatus::ExplainabilityError => "ExplainabilityError",
            AutoMlJobSecondaryStatus::Failed => "Failed",
            AutoMlJobSecondaryStatus::FeatureEngineering => "FeatureEngineering",
            AutoMlJobSecondaryStatus::GeneratingExplainabilityReport => {
                "GeneratingExplainabilityReport"
            }
            AutoMlJobSecondaryStatus::GeneratingModelInsightsReport => {
                "GeneratingModelInsightsReport"
            }
            AutoMlJobSecondaryStatus::MaxAutoMlJobRuntimeReached => "MaxAutoMLJobRuntimeReached",
            AutoMlJobSecondaryStatus::MaxCandidatesReached => "MaxCandidatesReached",
            AutoMlJobSecondaryStatus::ModelDeploymentError => "ModelDeploymentError",
            AutoMlJobSecondaryStatus::ModelInsightsError => "ModelInsightsError",
            AutoMlJobSecondaryStatus::ModelTuning => "ModelTuning",
            AutoMlJobSecondaryStatus::Starting => "Starting",
            AutoMlJobSecondaryStatus::Stopped => "Stopped",
            AutoMlJobSecondaryStatus::Stopping => "Stopping",
            AutoMlJobSecondaryStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "AnalyzingData",
            "CandidateDefinitionsGenerated",
            "Completed",
            "DeployingModel",
            "ExplainabilityError",
            "Failed",
            "FeatureEngineering",
            "GeneratingExplainabilityReport",
            "GeneratingModelInsightsReport",
            "MaxAutoMLJobRuntimeReached",
            "MaxCandidatesReached",
            "ModelDeploymentError",
            "ModelInsightsError",
            "ModelTuning",
            "Starting",
            "Stopped",
            "Stopping",
        ]
    }
}
impl AsRef<str> for AutoMlJobSecondaryStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AutoMlJobStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automljobstatus = unimplemented!();
/// match automljobstatus {
///     AutoMlJobStatus::Completed => { /* ... */ },
///     AutoMlJobStatus::Failed => { /* ... */ },
///     AutoMlJobStatus::InProgress => { /* ... */ },
///     AutoMlJobStatus::Stopped => { /* ... */ },
///     AutoMlJobStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automljobstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlJobStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlJobStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlJobStatus::NewFeature` is defined.
/// Specifically, when `automljobstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlJobStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlJobStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlJobStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => AutoMlJobStatus::Completed,
            "Failed" => AutoMlJobStatus::Failed,
            "InProgress" => AutoMlJobStatus::InProgress,
            "Stopped" => AutoMlJobStatus::Stopped,
            "Stopping" => AutoMlJobStatus::Stopping,
            other => AutoMlJobStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AutoMlJobStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlJobStatus::from(s))
    }
}
impl AutoMlJobStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlJobStatus::Completed => "Completed",
            AutoMlJobStatus::Failed => "Failed",
            AutoMlJobStatus::InProgress => "InProgress",
            AutoMlJobStatus::Stopped => "Stopped",
            AutoMlJobStatus::Stopping => "Stopping",
            AutoMlJobStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "Stopped", "Stopping"]
    }
}
impl AsRef<str> for AutoMlJobStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AutoMlSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automlsortby = unimplemented!();
/// match automlsortby {
///     AutoMlSortBy::CreationTime => { /* ... */ },
///     AutoMlSortBy::Name => { /* ... */ },
///     AutoMlSortBy::Status => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automlsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlSortBy::NewFeature` is defined.
/// Specifically, when `automlsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    #[allow(missing_docs)] // documentation missing in model
    Status,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => AutoMlSortBy::CreationTime,
            "Name" => AutoMlSortBy::Name,
            "Status" => AutoMlSortBy::Status,
            other => AutoMlSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AutoMlSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlSortBy::from(s))
    }
}
impl AutoMlSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlSortBy::CreationTime => "CreationTime",
            AutoMlSortBy::Name => "Name",
            AutoMlSortBy::Status => "Status",
            AutoMlSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name", "Status"]
    }
}
impl AsRef<str> for AutoMlSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Lists a summary of the properties of an association. An association is an entity that links other lineage or experiment entities. An example would be an association between a training job and a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AssociationSummary {
    /// <p>The ARN of the source.</p>
    #[doc(hidden)]
    pub source_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the destination.</p>
    #[doc(hidden)]
    pub destination_arn: std::option::Option<std::string::String>,
    /// <p>The source type.</p>
    #[doc(hidden)]
    pub source_type: std::option::Option<std::string::String>,
    /// <p>The destination type.</p>
    #[doc(hidden)]
    pub destination_type: std::option::Option<std::string::String>,
    /// <p>The type of the association.</p>
    #[doc(hidden)]
    pub association_type: std::option::Option<crate::model::AssociationEdgeType>,
    /// <p>The name of the source.</p>
    #[doc(hidden)]
    pub source_name: std::option::Option<std::string::String>,
    /// <p>The name of the destination.</p>
    #[doc(hidden)]
    pub destination_name: std::option::Option<std::string::String>,
    /// <p>When the association was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    #[doc(hidden)]
    pub created_by: std::option::Option<crate::model::UserContext>,
}
impl AssociationSummary {
    /// <p>The ARN of the source.</p>
    pub fn source_arn(&self) -> std::option::Option<&str> {
        self.source_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the destination.</p>
    pub fn destination_arn(&self) -> std::option::Option<&str> {
        self.destination_arn.as_deref()
    }
    /// <p>The source type.</p>
    pub fn source_type(&self) -> std::option::Option<&str> {
        self.source_type.as_deref()
    }
    /// <p>The destination type.</p>
    pub fn destination_type(&self) -> std::option::Option<&str> {
        self.destination_type.as_deref()
    }
    /// <p>The type of the association.</p>
    pub fn association_type(&self) -> std::option::Option<&crate::model::AssociationEdgeType> {
        self.association_type.as_ref()
    }
    /// <p>The name of the source.</p>
    pub fn source_name(&self) -> std::option::Option<&str> {
        self.source_name.as_deref()
    }
    /// <p>The name of the destination.</p>
    pub fn destination_name(&self) -> std::option::Option<&str> {
        self.destination_name.as_deref()
    }
    /// <p>When the association was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
    pub fn created_by(&self) -> std::option::Option<&crate::model::UserContext> {
        self.created_by.as_ref()
    }
}
/// See [`AssociationSummary`](crate::model::AssociationSummary).
pub mod association_summary {

    /// A builder for [`AssociationSummary`](crate::model::AssociationSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_arn: std::option::Option<std::string::String>,
        pub(crate) destination_arn: std::option::Option<std::string::String>,
        pub(crate) source_type: std::option::Option<std::string::String>,
        pub(crate) destination_type: std::option::Option<std::string::String>,
        pub(crate) association_type: std::option::Option<crate::model::AssociationEdgeType>,
        pub(crate) source_name: std::option::Option<std::string::String>,
        pub(crate) destination_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) created_by: std::option::Option<crate::model::UserContext>,
    }
    impl Builder {
        /// <p>The ARN of the source.</p>
        pub fn source_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the source.</p>
        pub fn set_source_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the destination.</p>
        pub fn destination_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the destination.</p>
        pub fn set_destination_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_arn = input;
            self
        }
        /// <p>The source type.</p>
        pub fn source_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_type = Some(input.into());
            self
        }
        /// <p>The source type.</p>
        pub fn set_source_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_type = input;
            self
        }
        /// <p>The destination type.</p>
        pub fn destination_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_type = Some(input.into());
            self
        }
        /// <p>The destination type.</p>
        pub fn set_destination_type(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_type = input;
            self
        }
        /// <p>The type of the association.</p>
        pub fn association_type(mut self, input: crate::model::AssociationEdgeType) -> Self {
            self.association_type = Some(input);
            self
        }
        /// <p>The type of the association.</p>
        pub fn set_association_type(
            mut self,
            input: std::option::Option<crate::model::AssociationEdgeType>,
        ) -> Self {
            self.association_type = input;
            self
        }
        /// <p>The name of the source.</p>
        pub fn source_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_name = Some(input.into());
            self
        }
        /// <p>The name of the source.</p>
        pub fn set_source_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_name = input;
            self
        }
        /// <p>The name of the destination.</p>
        pub fn destination_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_name = Some(input.into());
            self
        }
        /// <p>The name of the destination.</p>
        pub fn set_destination_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_name = input;
            self
        }
        /// <p>When the association was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the association was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn created_by(mut self, input: crate::model::UserContext) -> Self {
            self.created_by = Some(input);
            self
        }
        /// <p>Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.</p>
        pub fn set_created_by(
            mut self,
            input: std::option::Option<crate::model::UserContext>,
        ) -> Self {
            self.created_by = input;
            self
        }
        /// Consumes the builder and constructs a [`AssociationSummary`](crate::model::AssociationSummary).
        pub fn build(self) -> crate::model::AssociationSummary {
            crate::model::AssociationSummary {
                source_arn: self.source_arn,
                destination_arn: self.destination_arn,
                source_type: self.source_type,
                destination_type: self.destination_type,
                association_type: self.association_type,
                source_name: self.source_name,
                destination_name: self.destination_name,
                creation_time: self.creation_time,
                created_by: self.created_by,
            }
        }
    }
}
impl AssociationSummary {
    /// Creates a new builder-style object to manufacture [`AssociationSummary`](crate::model::AssociationSummary).
    pub fn builder() -> crate::model::association_summary::Builder {
        crate::model::association_summary::Builder::default()
    }
}

/// When writing a match expression against `SortAssociationsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortassociationsby = unimplemented!();
/// match sortassociationsby {
///     SortAssociationsBy::CreationTime => { /* ... */ },
///     SortAssociationsBy::DestinationArn => { /* ... */ },
///     SortAssociationsBy::DestinationType => { /* ... */ },
///     SortAssociationsBy::SourceArn => { /* ... */ },
///     SortAssociationsBy::SourceType => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortassociationsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortAssociationsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortAssociationsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortAssociationsBy::NewFeature` is defined.
/// Specifically, when `sortassociationsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortAssociationsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortAssociationsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    DestinationArn,
    #[allow(missing_docs)] // documentation missing in model
    DestinationType,
    #[allow(missing_docs)] // documentation missing in model
    SourceArn,
    #[allow(missing_docs)] // documentation missing in model
    SourceType,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortAssociationsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortAssociationsBy::CreationTime,
            "DestinationArn" => SortAssociationsBy::DestinationArn,
            "DestinationType" => SortAssociationsBy::DestinationType,
            "SourceArn" => SortAssociationsBy::SourceArn,
            "SourceType" => SortAssociationsBy::SourceType,
            other => {
                SortAssociationsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for SortAssociationsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortAssociationsBy::from(s))
    }
}
impl SortAssociationsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortAssociationsBy::CreationTime => "CreationTime",
            SortAssociationsBy::DestinationArn => "DestinationArn",
            SortAssociationsBy::DestinationType => "DestinationType",
            SortAssociationsBy::SourceArn => "SourceArn",
            SortAssociationsBy::SourceType => "SourceType",
            SortAssociationsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CreationTime",
            "DestinationArn",
            "DestinationType",
            "SourceArn",
            "SourceType",
        ]
    }
}
impl AsRef<str> for SortAssociationsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Lists a summary of the properties of an artifact. An artifact represents a URI addressable object or data. Some examples are a dataset and a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ArtifactSummary {
    /// <p>The Amazon Resource Name (ARN) of the artifact.</p>
    #[doc(hidden)]
    pub artifact_arn: std::option::Option<std::string::String>,
    /// <p>The name of the artifact.</p>
    #[doc(hidden)]
    pub artifact_name: std::option::Option<std::string::String>,
    /// <p>The source of the artifact.</p>
    #[doc(hidden)]
    pub source: std::option::Option<crate::model::ArtifactSource>,
    /// <p>The type of the artifact.</p>
    #[doc(hidden)]
    pub artifact_type: std::option::Option<std::string::String>,
    /// <p>When the artifact was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the artifact was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ArtifactSummary {
    /// <p>The Amazon Resource Name (ARN) of the artifact.</p>
    pub fn artifact_arn(&self) -> std::option::Option<&str> {
        self.artifact_arn.as_deref()
    }
    /// <p>The name of the artifact.</p>
    pub fn artifact_name(&self) -> std::option::Option<&str> {
        self.artifact_name.as_deref()
    }
    /// <p>The source of the artifact.</p>
    pub fn source(&self) -> std::option::Option<&crate::model::ArtifactSource> {
        self.source.as_ref()
    }
    /// <p>The type of the artifact.</p>
    pub fn artifact_type(&self) -> std::option::Option<&str> {
        self.artifact_type.as_deref()
    }
    /// <p>When the artifact was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When the artifact was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ArtifactSummary`](crate::model::ArtifactSummary).
pub mod artifact_summary {

    /// A builder for [`ArtifactSummary`](crate::model::ArtifactSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) artifact_arn: std::option::Option<std::string::String>,
        pub(crate) artifact_name: std::option::Option<std::string::String>,
        pub(crate) source: std::option::Option<crate::model::ArtifactSource>,
        pub(crate) artifact_type: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the artifact.</p>
        pub fn artifact_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.artifact_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the artifact.</p>
        pub fn set_artifact_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.artifact_arn = input;
            self
        }
        /// <p>The name of the artifact.</p>
        pub fn artifact_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.artifact_name = Some(input.into());
            self
        }
        /// <p>The name of the artifact.</p>
        pub fn set_artifact_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.artifact_name = input;
            self
        }
        /// <p>The source of the artifact.</p>
        pub fn source(mut self, input: crate::model::ArtifactSource) -> Self {
            self.source = Some(input);
            self
        }
        /// <p>The source of the artifact.</p>
        pub fn set_source(
            mut self,
            input: std::option::Option<crate::model::ArtifactSource>,
        ) -> Self {
            self.source = input;
            self
        }
        /// <p>The type of the artifact.</p>
        pub fn artifact_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.artifact_type = Some(input.into());
            self
        }
        /// <p>The type of the artifact.</p>
        pub fn set_artifact_type(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.artifact_type = input;
            self
        }
        /// <p>When the artifact was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the artifact was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When the artifact was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the artifact was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ArtifactSummary`](crate::model::ArtifactSummary).
        pub fn build(self) -> crate::model::ArtifactSummary {
            crate::model::ArtifactSummary {
                artifact_arn: self.artifact_arn,
                artifact_name: self.artifact_name,
                source: self.source,
                artifact_type: self.artifact_type,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ArtifactSummary {
    /// Creates a new builder-style object to manufacture [`ArtifactSummary`](crate::model::ArtifactSummary).
    pub fn builder() -> crate::model::artifact_summary::Builder {
        crate::model::artifact_summary::Builder::default()
    }
}

/// <p>A structure describing the source of an artifact.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ArtifactSource {
    /// <p>The URI of the source.</p>
    #[doc(hidden)]
    pub source_uri: std::option::Option<std::string::String>,
    /// <p>A list of source types.</p>
    #[doc(hidden)]
    pub source_types: std::option::Option<std::vec::Vec<crate::model::ArtifactSourceType>>,
}
impl ArtifactSource {
    /// <p>The URI of the source.</p>
    pub fn source_uri(&self) -> std::option::Option<&str> {
        self.source_uri.as_deref()
    }
    /// <p>A list of source types.</p>
    pub fn source_types(&self) -> std::option::Option<&[crate::model::ArtifactSourceType]> {
        self.source_types.as_deref()
    }
}
/// See [`ArtifactSource`](crate::model::ArtifactSource).
pub mod artifact_source {

    /// A builder for [`ArtifactSource`](crate::model::ArtifactSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_uri: std::option::Option<std::string::String>,
        pub(crate) source_types:
            std::option::Option<std::vec::Vec<crate::model::ArtifactSourceType>>,
    }
    impl Builder {
        /// <p>The URI of the source.</p>
        pub fn source_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_uri = Some(input.into());
            self
        }
        /// <p>The URI of the source.</p>
        pub fn set_source_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_uri = input;
            self
        }
        /// Appends an item to `source_types`.
        ///
        /// To override the contents of this collection use [`set_source_types`](Self::set_source_types).
        ///
        /// <p>A list of source types.</p>
        pub fn source_types(mut self, input: crate::model::ArtifactSourceType) -> Self {
            let mut v = self.source_types.unwrap_or_default();
            v.push(input);
            self.source_types = Some(v);
            self
        }
        /// <p>A list of source types.</p>
        pub fn set_source_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ArtifactSourceType>>,
        ) -> Self {
            self.source_types = input;
            self
        }
        /// Consumes the builder and constructs a [`ArtifactSource`](crate::model::ArtifactSource).
        pub fn build(self) -> crate::model::ArtifactSource {
            crate::model::ArtifactSource {
                source_uri: self.source_uri,
                source_types: self.source_types,
            }
        }
    }
}
impl ArtifactSource {
    /// Creates a new builder-style object to manufacture [`ArtifactSource`](crate::model::ArtifactSource).
    pub fn builder() -> crate::model::artifact_source::Builder {
        crate::model::artifact_source::Builder::default()
    }
}

/// <p>The ID and ID type of an artifact source.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ArtifactSourceType {
    /// <p>The type of ID.</p>
    #[doc(hidden)]
    pub source_id_type: std::option::Option<crate::model::ArtifactSourceIdType>,
    /// <p>The ID.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::string::String>,
}
impl ArtifactSourceType {
    /// <p>The type of ID.</p>
    pub fn source_id_type(&self) -> std::option::Option<&crate::model::ArtifactSourceIdType> {
        self.source_id_type.as_ref()
    }
    /// <p>The ID.</p>
    pub fn value(&self) -> std::option::Option<&str> {
        self.value.as_deref()
    }
}
/// See [`ArtifactSourceType`](crate::model::ArtifactSourceType).
pub mod artifact_source_type {

    /// A builder for [`ArtifactSourceType`](crate::model::ArtifactSourceType).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_id_type: std::option::Option<crate::model::ArtifactSourceIdType>,
        pub(crate) value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The type of ID.</p>
        pub fn source_id_type(mut self, input: crate::model::ArtifactSourceIdType) -> Self {
            self.source_id_type = Some(input);
            self
        }
        /// <p>The type of ID.</p>
        pub fn set_source_id_type(
            mut self,
            input: std::option::Option<crate::model::ArtifactSourceIdType>,
        ) -> Self {
            self.source_id_type = input;
            self
        }
        /// <p>The ID.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            self.value = Some(input.into());
            self
        }
        /// <p>The ID.</p>
        pub fn set_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`ArtifactSourceType`](crate::model::ArtifactSourceType).
        pub fn build(self) -> crate::model::ArtifactSourceType {
            crate::model::ArtifactSourceType {
                source_id_type: self.source_id_type,
                value: self.value,
            }
        }
    }
}
impl ArtifactSourceType {
    /// Creates a new builder-style object to manufacture [`ArtifactSourceType`](crate::model::ArtifactSourceType).
    pub fn builder() -> crate::model::artifact_source_type::Builder {
        crate::model::artifact_source_type::Builder::default()
    }
}

/// When writing a match expression against `ArtifactSourceIdType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let artifactsourceidtype = unimplemented!();
/// match artifactsourceidtype {
///     ArtifactSourceIdType::Custom => { /* ... */ },
///     ArtifactSourceIdType::Md5Hash => { /* ... */ },
///     ArtifactSourceIdType::S3Etag => { /* ... */ },
///     ArtifactSourceIdType::S3Version => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `artifactsourceidtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ArtifactSourceIdType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ArtifactSourceIdType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ArtifactSourceIdType::NewFeature` is defined.
/// Specifically, when `artifactsourceidtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ArtifactSourceIdType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ArtifactSourceIdType {
    #[allow(missing_docs)] // documentation missing in model
    Custom,
    #[allow(missing_docs)] // documentation missing in model
    Md5Hash,
    #[allow(missing_docs)] // documentation missing in model
    S3Etag,
    #[allow(missing_docs)] // documentation missing in model
    S3Version,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ArtifactSourceIdType {
    fn from(s: &str) -> Self {
        match s {
            "Custom" => ArtifactSourceIdType::Custom,
            "MD5Hash" => ArtifactSourceIdType::Md5Hash,
            "S3ETag" => ArtifactSourceIdType::S3Etag,
            "S3Version" => ArtifactSourceIdType::S3Version,
            other => {
                ArtifactSourceIdType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ArtifactSourceIdType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ArtifactSourceIdType::from(s))
    }
}
impl ArtifactSourceIdType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ArtifactSourceIdType::Custom => "Custom",
            ArtifactSourceIdType::Md5Hash => "MD5Hash",
            ArtifactSourceIdType::S3Etag => "S3ETag",
            ArtifactSourceIdType::S3Version => "S3Version",
            ArtifactSourceIdType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Custom", "MD5Hash", "S3ETag", "S3Version"]
    }
}
impl AsRef<str> for ArtifactSourceIdType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `SortArtifactsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortartifactsby = unimplemented!();
/// match sortartifactsby {
///     SortArtifactsBy::CreationTime => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortartifactsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortArtifactsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortArtifactsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortArtifactsBy::NewFeature` is defined.
/// Specifically, when `sortartifactsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortArtifactsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortArtifactsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortArtifactsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortArtifactsBy::CreationTime,
            other => SortArtifactsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortArtifactsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortArtifactsBy::from(s))
    }
}
impl SortArtifactsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortArtifactsBy::CreationTime => "CreationTime",
            SortArtifactsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime"]
    }
}
impl AsRef<str> for SortArtifactsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Details about an Amazon SageMaker app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AppDetails {
    /// <p>The domain ID.</p>
    #[doc(hidden)]
    pub domain_id: std::option::Option<std::string::String>,
    /// <p>The user profile name.</p>
    #[doc(hidden)]
    pub user_profile_name: std::option::Option<std::string::String>,
    /// <p>The type of app.</p>
    #[doc(hidden)]
    pub app_type: std::option::Option<crate::model::AppType>,
    /// <p>The name of the app.</p>
    #[doc(hidden)]
    pub app_name: std::option::Option<std::string::String>,
    /// <p>The status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::AppStatus>,
    /// <p>The creation time.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The name of the space.</p>
    #[doc(hidden)]
    pub space_name: std::option::Option<std::string::String>,
}
impl AppDetails {
    /// <p>The domain ID.</p>
    pub fn domain_id(&self) -> std::option::Option<&str> {
        self.domain_id.as_deref()
    }
    /// <p>The user profile name.</p>
    pub fn user_profile_name(&self) -> std::option::Option<&str> {
        self.user_profile_name.as_deref()
    }
    /// <p>The type of app.</p>
    pub fn app_type(&self) -> std::option::Option<&crate::model::AppType> {
        self.app_type.as_ref()
    }
    /// <p>The name of the app.</p>
    pub fn app_name(&self) -> std::option::Option<&str> {
        self.app_name.as_deref()
    }
    /// <p>The status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::AppStatus> {
        self.status.as_ref()
    }
    /// <p>The creation time.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The name of the space.</p>
    pub fn space_name(&self) -> std::option::Option<&str> {
        self.space_name.as_deref()
    }
}
/// See [`AppDetails`](crate::model::AppDetails).
pub mod app_details {

    /// A builder for [`AppDetails`](crate::model::AppDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain_id: std::option::Option<std::string::String>,
        pub(crate) user_profile_name: std::option::Option<std::string::String>,
        pub(crate) app_type: std::option::Option<crate::model::AppType>,
        pub(crate) app_name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::AppStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) space_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The domain ID.</p>
        pub fn domain_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_id = Some(input.into());
            self
        }
        /// <p>The domain ID.</p>
        pub fn set_domain_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain_id = input;
            self
        }
        /// <p>The user profile name.</p>
        pub fn user_profile_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.user_profile_name = Some(input.into());
            self
        }
        /// <p>The user profile name.</p>
        pub fn set_user_profile_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.user_profile_name = input;
            self
        }
        /// <p>The type of app.</p>
        pub fn app_type(mut self, input: crate::model::AppType) -> Self {
            self.app_type = Some(input);
            self
        }
        /// <p>The type of app.</p>
        pub fn set_app_type(mut self, input: std::option::Option<crate::model::AppType>) -> Self {
            self.app_type = input;
            self
        }
        /// <p>The name of the app.</p>
        pub fn app_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.app_name = Some(input.into());
            self
        }
        /// <p>The name of the app.</p>
        pub fn set_app_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.app_name = input;
            self
        }
        /// <p>The status.</p>
        pub fn status(mut self, input: crate::model::AppStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status.</p>
        pub fn set_status(mut self, input: std::option::Option<crate::model::AppStatus>) -> Self {
            self.status = input;
            self
        }
        /// <p>The creation time.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The name of the space.</p>
        pub fn space_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.space_name = Some(input.into());
            self
        }
        /// <p>The name of the space.</p>
        pub fn set_space_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.space_name = input;
            self
        }
        /// Consumes the builder and constructs a [`AppDetails`](crate::model::AppDetails).
        pub fn build(self) -> crate::model::AppDetails {
            crate::model::AppDetails {
                domain_id: self.domain_id,
                user_profile_name: self.user_profile_name,
                app_type: self.app_type,
                app_name: self.app_name,
                status: self.status,
                creation_time: self.creation_time,
                space_name: self.space_name,
            }
        }
    }
}
impl AppDetails {
    /// Creates a new builder-style object to manufacture [`AppDetails`](crate::model::AppDetails).
    pub fn builder() -> crate::model::app_details::Builder {
        crate::model::app_details::Builder::default()
    }
}

/// When writing a match expression against `AppStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let appstatus = unimplemented!();
/// match appstatus {
///     AppStatus::Deleted => { /* ... */ },
///     AppStatus::Deleting => { /* ... */ },
///     AppStatus::Failed => { /* ... */ },
///     AppStatus::InService => { /* ... */ },
///     AppStatus::Pending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `appstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppStatus::NewFeature` is defined.
/// Specifically, when `appstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppStatus {
    #[allow(missing_docs)] // documentation missing in model
    Deleted,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppStatus {
    fn from(s: &str) -> Self {
        match s {
            "Deleted" => AppStatus::Deleted,
            "Deleting" => AppStatus::Deleting,
            "Failed" => AppStatus::Failed,
            "InService" => AppStatus::InService,
            "Pending" => AppStatus::Pending,
            other => AppStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AppStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppStatus::from(s))
    }
}
impl AppStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppStatus::Deleted => "Deleted",
            AppStatus::Deleting => "Deleting",
            AppStatus::Failed => "Failed",
            AppStatus::InService => "InService",
            AppStatus::Pending => "Pending",
            AppStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Deleted", "Deleting", "Failed", "InService", "Pending"]
    }
}
impl AsRef<str> for AppStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AppType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let apptype = unimplemented!();
/// match apptype {
///     AppType::JupyterServer => { /* ... */ },
///     AppType::KernelGateway => { /* ... */ },
///     AppType::RSessionGateway => { /* ... */ },
///     AppType::RStudioServerPro => { /* ... */ },
///     AppType::TensorBoard => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `apptype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppType::NewFeature` is defined.
/// Specifically, when `apptype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppType {
    #[allow(missing_docs)] // documentation missing in model
    JupyterServer,
    #[allow(missing_docs)] // documentation missing in model
    KernelGateway,
    #[allow(missing_docs)] // documentation missing in model
    RSessionGateway,
    #[allow(missing_docs)] // documentation missing in model
    RStudioServerPro,
    #[allow(missing_docs)] // documentation missing in model
    TensorBoard,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppType {
    fn from(s: &str) -> Self {
        match s {
            "JupyterServer" => AppType::JupyterServer,
            "KernelGateway" => AppType::KernelGateway,
            "RSessionGateway" => AppType::RSessionGateway,
            "RStudioServerPro" => AppType::RStudioServerPro,
            "TensorBoard" => AppType::TensorBoard,
            other => AppType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AppType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppType::from(s))
    }
}
impl AppType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppType::JupyterServer => "JupyterServer",
            AppType::KernelGateway => "KernelGateway",
            AppType::RSessionGateway => "RSessionGateway",
            AppType::RStudioServerPro => "RStudioServerPro",
            AppType::TensorBoard => "TensorBoard",
            AppType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "JupyterServer",
            "KernelGateway",
            "RSessionGateway",
            "RStudioServerPro",
            "TensorBoard",
        ]
    }
}
impl AsRef<str> for AppType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AppSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let appsortkey = unimplemented!();
/// match appsortkey {
///     AppSortKey::CreationTime => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `appsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppSortKey::NewFeature` is defined.
/// Specifically, when `appsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => AppSortKey::CreationTime,
            other => AppSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AppSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppSortKey::from(s))
    }
}
impl AppSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppSortKey::CreationTime => "CreationTime",
            AppSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime"]
    }
}
impl AsRef<str> for AppSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The configuration for running a SageMaker image as a KernelGateway app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AppImageConfigDetails {
    /// <p>The Amazon Resource Name (ARN) of the AppImageConfig.</p>
    #[doc(hidden)]
    pub app_image_config_arn: std::option::Option<std::string::String>,
    /// <p>The name of the AppImageConfig. Must be unique to your account.</p>
    #[doc(hidden)]
    pub app_image_config_name: std::option::Option<std::string::String>,
    /// <p>When the AppImageConfig was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the AppImageConfig was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The configuration for the file system and kernels in the SageMaker image.</p>
    #[doc(hidden)]
    pub kernel_gateway_image_config: std::option::Option<crate::model::KernelGatewayImageConfig>,
}
impl AppImageConfigDetails {
    /// <p>The Amazon Resource Name (ARN) of the AppImageConfig.</p>
    pub fn app_image_config_arn(&self) -> std::option::Option<&str> {
        self.app_image_config_arn.as_deref()
    }
    /// <p>The name of the AppImageConfig. Must be unique to your account.</p>
    pub fn app_image_config_name(&self) -> std::option::Option<&str> {
        self.app_image_config_name.as_deref()
    }
    /// <p>When the AppImageConfig was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When the AppImageConfig was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
    /// <p>The configuration for the file system and kernels in the SageMaker image.</p>
    pub fn kernel_gateway_image_config(
        &self,
    ) -> std::option::Option<&crate::model::KernelGatewayImageConfig> {
        self.kernel_gateway_image_config.as_ref()
    }
}
/// See [`AppImageConfigDetails`](crate::model::AppImageConfigDetails).
pub mod app_image_config_details {

    /// A builder for [`AppImageConfigDetails`](crate::model::AppImageConfigDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) app_image_config_arn: std::option::Option<std::string::String>,
        pub(crate) app_image_config_name: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) kernel_gateway_image_config:
            std::option::Option<crate::model::KernelGatewayImageConfig>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the AppImageConfig.</p>
        pub fn app_image_config_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.app_image_config_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the AppImageConfig.</p>
        pub fn set_app_image_config_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.app_image_config_arn = input;
            self
        }
        /// <p>The name of the AppImageConfig. Must be unique to your account.</p>
        pub fn app_image_config_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.app_image_config_name = Some(input.into());
            self
        }
        /// <p>The name of the AppImageConfig. Must be unique to your account.</p>
        pub fn set_app_image_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.app_image_config_name = input;
            self
        }
        /// <p>When the AppImageConfig was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the AppImageConfig was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When the AppImageConfig was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the AppImageConfig was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// <p>The configuration for the file system and kernels in the SageMaker image.</p>
        pub fn kernel_gateway_image_config(
            mut self,
            input: crate::model::KernelGatewayImageConfig,
        ) -> Self {
            self.kernel_gateway_image_config = Some(input);
            self
        }
        /// <p>The configuration for the file system and kernels in the SageMaker image.</p>
        pub fn set_kernel_gateway_image_config(
            mut self,
            input: std::option::Option<crate::model::KernelGatewayImageConfig>,
        ) -> Self {
            self.kernel_gateway_image_config = input;
            self
        }
        /// Consumes the builder and constructs a [`AppImageConfigDetails`](crate::model::AppImageConfigDetails).
        pub fn build(self) -> crate::model::AppImageConfigDetails {
            crate::model::AppImageConfigDetails {
                app_image_config_arn: self.app_image_config_arn,
                app_image_config_name: self.app_image_config_name,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
                kernel_gateway_image_config: self.kernel_gateway_image_config,
            }
        }
    }
}
impl AppImageConfigDetails {
    /// Creates a new builder-style object to manufacture [`AppImageConfigDetails`](crate::model::AppImageConfigDetails).
    pub fn builder() -> crate::model::app_image_config_details::Builder {
        crate::model::app_image_config_details::Builder::default()
    }
}

/// When writing a match expression against `AppImageConfigSortKey`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let appimageconfigsortkey = unimplemented!();
/// match appimageconfigsortkey {
///     AppImageConfigSortKey::CreationTime => { /* ... */ },
///     AppImageConfigSortKey::LastModifiedTime => { /* ... */ },
///     AppImageConfigSortKey::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `appimageconfigsortkey` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppImageConfigSortKey::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppImageConfigSortKey::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppImageConfigSortKey::NewFeature` is defined.
/// Specifically, when `appimageconfigsortkey` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppImageConfigSortKey::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppImageConfigSortKey {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    LastModifiedTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppImageConfigSortKey {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => AppImageConfigSortKey::CreationTime,
            "LastModifiedTime" => AppImageConfigSortKey::LastModifiedTime,
            "Name" => AppImageConfigSortKey::Name,
            other => {
                AppImageConfigSortKey::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for AppImageConfigSortKey {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppImageConfigSortKey::from(s))
    }
}
impl AppImageConfigSortKey {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppImageConfigSortKey::CreationTime => "CreationTime",
            AppImageConfigSortKey::LastModifiedTime => "LastModifiedTime",
            AppImageConfigSortKey::Name => "Name",
            AppImageConfigSortKey::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "LastModifiedTime", "Name"]
    }
}
impl AsRef<str> for AppImageConfigSortKey {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides summary information about an algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AlgorithmSummary {
    /// <p>The name of the algorithm that is described by the summary.</p>
    #[doc(hidden)]
    pub algorithm_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the algorithm.</p>
    #[doc(hidden)]
    pub algorithm_arn: std::option::Option<std::string::String>,
    /// <p>A brief description of the algorithm.</p>
    #[doc(hidden)]
    pub algorithm_description: std::option::Option<std::string::String>,
    /// <p>A timestamp that shows when the algorithm was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The overall status of the algorithm.</p>
    #[doc(hidden)]
    pub algorithm_status: std::option::Option<crate::model::AlgorithmStatus>,
}
impl AlgorithmSummary {
    /// <p>The name of the algorithm that is described by the summary.</p>
    pub fn algorithm_name(&self) -> std::option::Option<&str> {
        self.algorithm_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the algorithm.</p>
    pub fn algorithm_arn(&self) -> std::option::Option<&str> {
        self.algorithm_arn.as_deref()
    }
    /// <p>A brief description of the algorithm.</p>
    pub fn algorithm_description(&self) -> std::option::Option<&str> {
        self.algorithm_description.as_deref()
    }
    /// <p>A timestamp that shows when the algorithm was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>The overall status of the algorithm.</p>
    pub fn algorithm_status(&self) -> std::option::Option<&crate::model::AlgorithmStatus> {
        self.algorithm_status.as_ref()
    }
}
/// See [`AlgorithmSummary`](crate::model::AlgorithmSummary).
pub mod algorithm_summary {

    /// A builder for [`AlgorithmSummary`](crate::model::AlgorithmSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) algorithm_name: std::option::Option<std::string::String>,
        pub(crate) algorithm_arn: std::option::Option<std::string::String>,
        pub(crate) algorithm_description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) algorithm_status: std::option::Option<crate::model::AlgorithmStatus>,
    }
    impl Builder {
        /// <p>The name of the algorithm that is described by the summary.</p>
        pub fn algorithm_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.algorithm_name = Some(input.into());
            self
        }
        /// <p>The name of the algorithm that is described by the summary.</p>
        pub fn set_algorithm_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.algorithm_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the algorithm.</p>
        pub fn algorithm_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.algorithm_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the algorithm.</p>
        pub fn set_algorithm_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.algorithm_arn = input;
            self
        }
        /// <p>A brief description of the algorithm.</p>
        pub fn algorithm_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.algorithm_description = Some(input.into());
            self
        }
        /// <p>A brief description of the algorithm.</p>
        pub fn set_algorithm_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.algorithm_description = input;
            self
        }
        /// <p>A timestamp that shows when the algorithm was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>A timestamp that shows when the algorithm was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>The overall status of the algorithm.</p>
        pub fn algorithm_status(mut self, input: crate::model::AlgorithmStatus) -> Self {
            self.algorithm_status = Some(input);
            self
        }
        /// <p>The overall status of the algorithm.</p>
        pub fn set_algorithm_status(
            mut self,
            input: std::option::Option<crate::model::AlgorithmStatus>,
        ) -> Self {
            self.algorithm_status = input;
            self
        }
        /// Consumes the builder and constructs a [`AlgorithmSummary`](crate::model::AlgorithmSummary).
        pub fn build(self) -> crate::model::AlgorithmSummary {
            crate::model::AlgorithmSummary {
                algorithm_name: self.algorithm_name,
                algorithm_arn: self.algorithm_arn,
                algorithm_description: self.algorithm_description,
                creation_time: self.creation_time,
                algorithm_status: self.algorithm_status,
            }
        }
    }
}
impl AlgorithmSummary {
    /// Creates a new builder-style object to manufacture [`AlgorithmSummary`](crate::model::AlgorithmSummary).
    pub fn builder() -> crate::model::algorithm_summary::Builder {
        crate::model::algorithm_summary::Builder::default()
    }
}

/// When writing a match expression against `AlgorithmStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let algorithmstatus = unimplemented!();
/// match algorithmstatus {
///     AlgorithmStatus::Completed => { /* ... */ },
///     AlgorithmStatus::Deleting => { /* ... */ },
///     AlgorithmStatus::Failed => { /* ... */ },
///     AlgorithmStatus::InProgress => { /* ... */ },
///     AlgorithmStatus::Pending => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `algorithmstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AlgorithmStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AlgorithmStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AlgorithmStatus::NewFeature` is defined.
/// Specifically, when `algorithmstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AlgorithmStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AlgorithmStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    Pending,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AlgorithmStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => AlgorithmStatus::Completed,
            "Deleting" => AlgorithmStatus::Deleting,
            "Failed" => AlgorithmStatus::Failed,
            "InProgress" => AlgorithmStatus::InProgress,
            "Pending" => AlgorithmStatus::Pending,
            other => AlgorithmStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AlgorithmStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AlgorithmStatus::from(s))
    }
}
impl AlgorithmStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AlgorithmStatus::Completed => "Completed",
            AlgorithmStatus::Deleting => "Deleting",
            AlgorithmStatus::Failed => "Failed",
            AlgorithmStatus::InProgress => "InProgress",
            AlgorithmStatus::Pending => "Pending",
            AlgorithmStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Deleting", "Failed", "InProgress", "Pending"]
    }
}
impl AsRef<str> for AlgorithmStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AlgorithmSortBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let algorithmsortby = unimplemented!();
/// match algorithmsortby {
///     AlgorithmSortBy::CreationTime => { /* ... */ },
///     AlgorithmSortBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `algorithmsortby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AlgorithmSortBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AlgorithmSortBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AlgorithmSortBy::NewFeature` is defined.
/// Specifically, when `algorithmsortby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AlgorithmSortBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AlgorithmSortBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AlgorithmSortBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => AlgorithmSortBy::CreationTime,
            "Name" => AlgorithmSortBy::Name,
            other => AlgorithmSortBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AlgorithmSortBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AlgorithmSortBy::from(s))
    }
}
impl AlgorithmSortBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AlgorithmSortBy::CreationTime => "CreationTime",
            AlgorithmSortBy::Name => "Name",
            AlgorithmSortBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for AlgorithmSortBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Lists the properties of an <i>action</i>. An action represents an action or activity. Some examples are a workflow step and a model deployment. Generally, an action involves at least one input artifact or output artifact.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ActionSummary {
    /// <p>The Amazon Resource Name (ARN) of the action.</p>
    #[doc(hidden)]
    pub action_arn: std::option::Option<std::string::String>,
    /// <p>The name of the action.</p>
    #[doc(hidden)]
    pub action_name: std::option::Option<std::string::String>,
    /// <p>The source of the action.</p>
    #[doc(hidden)]
    pub source: std::option::Option<crate::model::ActionSource>,
    /// <p>The type of the action.</p>
    #[doc(hidden)]
    pub action_type: std::option::Option<std::string::String>,
    /// <p>The status of the action.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::ActionStatus>,
    /// <p>When the action was created.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>When the action was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ActionSummary {
    /// <p>The Amazon Resource Name (ARN) of the action.</p>
    pub fn action_arn(&self) -> std::option::Option<&str> {
        self.action_arn.as_deref()
    }
    /// <p>The name of the action.</p>
    pub fn action_name(&self) -> std::option::Option<&str> {
        self.action_name.as_deref()
    }
    /// <p>The source of the action.</p>
    pub fn source(&self) -> std::option::Option<&crate::model::ActionSource> {
        self.source.as_ref()
    }
    /// <p>The type of the action.</p>
    pub fn action_type(&self) -> std::option::Option<&str> {
        self.action_type.as_deref()
    }
    /// <p>The status of the action.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::ActionStatus> {
        self.status.as_ref()
    }
    /// <p>When the action was created.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>When the action was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ActionSummary`](crate::model::ActionSummary).
pub mod action_summary {

    /// A builder for [`ActionSummary`](crate::model::ActionSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) action_arn: std::option::Option<std::string::String>,
        pub(crate) action_name: std::option::Option<std::string::String>,
        pub(crate) source: std::option::Option<crate::model::ActionSource>,
        pub(crate) action_type: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::ActionStatus>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the action.</p>
        pub fn action_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.action_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the action.</p>
        pub fn set_action_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.action_arn = input;
            self
        }
        /// <p>The name of the action.</p>
        pub fn action_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.action_name = Some(input.into());
            self
        }
        /// <p>The name of the action.</p>
        pub fn set_action_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.action_name = input;
            self
        }
        /// <p>The source of the action.</p>
        pub fn source(mut self, input: crate::model::ActionSource) -> Self {
            self.source = Some(input);
            self
        }
        /// <p>The source of the action.</p>
        pub fn set_source(
            mut self,
            input: std::option::Option<crate::model::ActionSource>,
        ) -> Self {
            self.source = input;
            self
        }
        /// <p>The type of the action.</p>
        pub fn action_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.action_type = Some(input.into());
            self
        }
        /// <p>The type of the action.</p>
        pub fn set_action_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.action_type = input;
            self
        }
        /// <p>The status of the action.</p>
        pub fn status(mut self, input: crate::model::ActionStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the action.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::ActionStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>When the action was created.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>When the action was created.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>When the action was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>When the action was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ActionSummary`](crate::model::ActionSummary).
        pub fn build(self) -> crate::model::ActionSummary {
            crate::model::ActionSummary {
                action_arn: self.action_arn,
                action_name: self.action_name,
                source: self.source,
                action_type: self.action_type,
                status: self.status,
                creation_time: self.creation_time,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ActionSummary {
    /// Creates a new builder-style object to manufacture [`ActionSummary`](crate::model::ActionSummary).
    pub fn builder() -> crate::model::action_summary::Builder {
        crate::model::action_summary::Builder::default()
    }
}

/// <p>A structure describing the source of an action.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ActionSource {
    /// <p>The URI of the source.</p>
    #[doc(hidden)]
    pub source_uri: std::option::Option<std::string::String>,
    /// <p>The type of the source.</p>
    #[doc(hidden)]
    pub source_type: std::option::Option<std::string::String>,
    /// <p>The ID of the source.</p>
    #[doc(hidden)]
    pub source_id: std::option::Option<std::string::String>,
}
impl ActionSource {
    /// <p>The URI of the source.</p>
    pub fn source_uri(&self) -> std::option::Option<&str> {
        self.source_uri.as_deref()
    }
    /// <p>The type of the source.</p>
    pub fn source_type(&self) -> std::option::Option<&str> {
        self.source_type.as_deref()
    }
    /// <p>The ID of the source.</p>
    pub fn source_id(&self) -> std::option::Option<&str> {
        self.source_id.as_deref()
    }
}
/// See [`ActionSource`](crate::model::ActionSource).
pub mod action_source {

    /// A builder for [`ActionSource`](crate::model::ActionSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) source_uri: std::option::Option<std::string::String>,
        pub(crate) source_type: std::option::Option<std::string::String>,
        pub(crate) source_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The URI of the source.</p>
        pub fn source_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_uri = Some(input.into());
            self
        }
        /// <p>The URI of the source.</p>
        pub fn set_source_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_uri = input;
            self
        }
        /// <p>The type of the source.</p>
        pub fn source_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_type = Some(input.into());
            self
        }
        /// <p>The type of the source.</p>
        pub fn set_source_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_type = input;
            self
        }
        /// <p>The ID of the source.</p>
        pub fn source_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.source_id = Some(input.into());
            self
        }
        /// <p>The ID of the source.</p>
        pub fn set_source_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.source_id = input;
            self
        }
        /// Consumes the builder and constructs a [`ActionSource`](crate::model::ActionSource).
        pub fn build(self) -> crate::model::ActionSource {
            crate::model::ActionSource {
                source_uri: self.source_uri,
                source_type: self.source_type,
                source_id: self.source_id,
            }
        }
    }
}
impl ActionSource {
    /// Creates a new builder-style object to manufacture [`ActionSource`](crate::model::ActionSource).
    pub fn builder() -> crate::model::action_source::Builder {
        crate::model::action_source::Builder::default()
    }
}

/// When writing a match expression against `SortActionsBy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sortactionsby = unimplemented!();
/// match sortactionsby {
///     SortActionsBy::CreationTime => { /* ... */ },
///     SortActionsBy::Name => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sortactionsby` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SortActionsBy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SortActionsBy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SortActionsBy::NewFeature` is defined.
/// Specifically, when `sortactionsby` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SortActionsBy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SortActionsBy {
    #[allow(missing_docs)] // documentation missing in model
    CreationTime,
    #[allow(missing_docs)] // documentation missing in model
    Name,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SortActionsBy {
    fn from(s: &str) -> Self {
        match s {
            "CreationTime" => SortActionsBy::CreationTime,
            "Name" => SortActionsBy::Name,
            other => SortActionsBy::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for SortActionsBy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SortActionsBy::from(s))
    }
}
impl SortActionsBy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SortActionsBy::CreationTime => "CreationTime",
            SortActionsBy::Name => "Name",
            SortActionsBy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["CreationTime", "Name"]
    }
}
impl AsRef<str> for SortActionsBy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A property name returned from a <code>GetSearchSuggestions</code> call that specifies a value in the <code>PropertyNameQuery</code> field.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PropertyNameSuggestion {
    /// <p>A suggested property name based on what you entered in the search textbox in the Amazon SageMaker console.</p>
    #[doc(hidden)]
    pub property_name: std::option::Option<std::string::String>,
}
impl PropertyNameSuggestion {
    /// <p>A suggested property name based on what you entered in the search textbox in the Amazon SageMaker console.</p>
    pub fn property_name(&self) -> std::option::Option<&str> {
        self.property_name.as_deref()
    }
}
/// See [`PropertyNameSuggestion`](crate::model::PropertyNameSuggestion).
pub mod property_name_suggestion {

    /// A builder for [`PropertyNameSuggestion`](crate::model::PropertyNameSuggestion).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) property_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A suggested property name based on what you entered in the search textbox in the Amazon SageMaker console.</p>
        pub fn property_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.property_name = Some(input.into());
            self
        }
        /// <p>A suggested property name based on what you entered in the search textbox in the Amazon SageMaker console.</p>
        pub fn set_property_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.property_name = input;
            self
        }
        /// Consumes the builder and constructs a [`PropertyNameSuggestion`](crate::model::PropertyNameSuggestion).
        pub fn build(self) -> crate::model::PropertyNameSuggestion {
            crate::model::PropertyNameSuggestion {
                property_name: self.property_name,
            }
        }
    }
}
impl PropertyNameSuggestion {
    /// Creates a new builder-style object to manufacture [`PropertyNameSuggestion`](crate::model::PropertyNameSuggestion).
    pub fn builder() -> crate::model::property_name_suggestion::Builder {
        crate::model::property_name_suggestion::Builder::default()
    }
}

/// <p>Specified in the <code>GetSearchSuggestions</code> request. Limits the property names that are included in the response.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct SuggestionQuery {
    /// <p>Defines a property name hint. Only property names that begin with the specified hint are included in the response.</p>
    #[doc(hidden)]
    pub property_name_query: std::option::Option<crate::model::PropertyNameQuery>,
}
impl SuggestionQuery {
    /// <p>Defines a property name hint. Only property names that begin with the specified hint are included in the response.</p>
    pub fn property_name_query(&self) -> std::option::Option<&crate::model::PropertyNameQuery> {
        self.property_name_query.as_ref()
    }
}
/// See [`SuggestionQuery`](crate::model::SuggestionQuery).
pub mod suggestion_query {

    /// A builder for [`SuggestionQuery`](crate::model::SuggestionQuery).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) property_name_query: std::option::Option<crate::model::PropertyNameQuery>,
    }
    impl Builder {
        /// <p>Defines a property name hint. Only property names that begin with the specified hint are included in the response.</p>
        pub fn property_name_query(mut self, input: crate::model::PropertyNameQuery) -> Self {
            self.property_name_query = Some(input);
            self
        }
        /// <p>Defines a property name hint. Only property names that begin with the specified hint are included in the response.</p>
        pub fn set_property_name_query(
            mut self,
            input: std::option::Option<crate::model::PropertyNameQuery>,
        ) -> Self {
            self.property_name_query = input;
            self
        }
        /// Consumes the builder and constructs a [`SuggestionQuery`](crate::model::SuggestionQuery).
        pub fn build(self) -> crate::model::SuggestionQuery {
            crate::model::SuggestionQuery {
                property_name_query: self.property_name_query,
            }
        }
    }
}
impl SuggestionQuery {
    /// Creates a new builder-style object to manufacture [`SuggestionQuery`](crate::model::SuggestionQuery).
    pub fn builder() -> crate::model::suggestion_query::Builder {
        crate::model::suggestion_query::Builder::default()
    }
}

/// <p>Part of the <code>SuggestionQuery</code> type. Specifies a hint for retrieving property names that begin with the specified text.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PropertyNameQuery {
    /// <p>Text that begins a property's name.</p>
    #[doc(hidden)]
    pub property_name_hint: std::option::Option<std::string::String>,
}
impl PropertyNameQuery {
    /// <p>Text that begins a property's name.</p>
    pub fn property_name_hint(&self) -> std::option::Option<&str> {
        self.property_name_hint.as_deref()
    }
}
/// See [`PropertyNameQuery`](crate::model::PropertyNameQuery).
pub mod property_name_query {

    /// A builder for [`PropertyNameQuery`](crate::model::PropertyNameQuery).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) property_name_hint: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Text that begins a property's name.</p>
        pub fn property_name_hint(mut self, input: impl Into<std::string::String>) -> Self {
            self.property_name_hint = Some(input.into());
            self
        }
        /// <p>Text that begins a property's name.</p>
        pub fn set_property_name_hint(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.property_name_hint = input;
            self
        }
        /// Consumes the builder and constructs a [`PropertyNameQuery`](crate::model::PropertyNameQuery).
        pub fn build(self) -> crate::model::PropertyNameQuery {
            crate::model::PropertyNameQuery {
                property_name_hint: self.property_name_hint,
            }
        }
    }
}
impl PropertyNameQuery {
    /// Creates a new builder-style object to manufacture [`PropertyNameQuery`](crate::model::PropertyNameQuery).
    pub fn builder() -> crate::model::property_name_query::Builder {
        crate::model::property_name_query::Builder::default()
    }
}

/// When writing a match expression against `SagemakerServicecatalogStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let sagemakerservicecatalogstatus = unimplemented!();
/// match sagemakerservicecatalogstatus {
///     SagemakerServicecatalogStatus::Disabled => { /* ... */ },
///     SagemakerServicecatalogStatus::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `sagemakerservicecatalogstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `SagemakerServicecatalogStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `SagemakerServicecatalogStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `SagemakerServicecatalogStatus::NewFeature` is defined.
/// Specifically, when `sagemakerservicecatalogstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `SagemakerServicecatalogStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum SagemakerServicecatalogStatus {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for SagemakerServicecatalogStatus {
    fn from(s: &str) -> Self {
        match s {
            "Disabled" => SagemakerServicecatalogStatus::Disabled,
            "Enabled" => SagemakerServicecatalogStatus::Enabled,
            other => SagemakerServicecatalogStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for SagemakerServicecatalogStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(SagemakerServicecatalogStatus::from(s))
    }
}
impl SagemakerServicecatalogStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            SagemakerServicecatalogStatus::Disabled => "Disabled",
            SagemakerServicecatalogStatus::Enabled => "Enabled",
            SagemakerServicecatalogStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Disabled", "Enabled"]
    }
}
impl AsRef<str> for SagemakerServicecatalogStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Status of edge devices with this model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeModelStat {
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The model version.</p>
    #[doc(hidden)]
    pub model_version: std::option::Option<std::string::String>,
    /// <p>The number of devices that have this model version and do not have a heart beat.</p>
    #[doc(hidden)]
    pub offline_device_count: i64,
    /// <p>The number of devices that have this model version and have a heart beat. </p>
    #[doc(hidden)]
    pub connected_device_count: i64,
    /// <p>The number of devices that have this model version, a heart beat, and are currently running.</p>
    #[doc(hidden)]
    pub active_device_count: i64,
    /// <p>The number of devices with this model version and are producing sample data.</p>
    #[doc(hidden)]
    pub sampling_device_count: i64,
}
impl EdgeModelStat {
    /// <p>The name of the model.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The model version.</p>
    pub fn model_version(&self) -> std::option::Option<&str> {
        self.model_version.as_deref()
    }
    /// <p>The number of devices that have this model version and do not have a heart beat.</p>
    pub fn offline_device_count(&self) -> i64 {
        self.offline_device_count
    }
    /// <p>The number of devices that have this model version and have a heart beat. </p>
    pub fn connected_device_count(&self) -> i64 {
        self.connected_device_count
    }
    /// <p>The number of devices that have this model version, a heart beat, and are currently running.</p>
    pub fn active_device_count(&self) -> i64 {
        self.active_device_count
    }
    /// <p>The number of devices with this model version and are producing sample data.</p>
    pub fn sampling_device_count(&self) -> i64 {
        self.sampling_device_count
    }
}
/// See [`EdgeModelStat`](crate::model::EdgeModelStat).
pub mod edge_model_stat {

    /// A builder for [`EdgeModelStat`](crate::model::EdgeModelStat).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) model_version: std::option::Option<std::string::String>,
        pub(crate) offline_device_count: std::option::Option<i64>,
        pub(crate) connected_device_count: std::option::Option<i64>,
        pub(crate) active_device_count: std::option::Option<i64>,
        pub(crate) sampling_device_count: std::option::Option<i64>,
    }
    impl Builder {
        /// <p>The name of the model.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The model version.</p>
        pub fn model_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_version = Some(input.into());
            self
        }
        /// <p>The model version.</p>
        pub fn set_model_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_version = input;
            self
        }
        /// <p>The number of devices that have this model version and do not have a heart beat.</p>
        pub fn offline_device_count(mut self, input: i64) -> Self {
            self.offline_device_count = Some(input);
            self
        }
        /// <p>The number of devices that have this model version and do not have a heart beat.</p>
        pub fn set_offline_device_count(mut self, input: std::option::Option<i64>) -> Self {
            self.offline_device_count = input;
            self
        }
        /// <p>The number of devices that have this model version and have a heart beat. </p>
        pub fn connected_device_count(mut self, input: i64) -> Self {
            self.connected_device_count = Some(input);
            self
        }
        /// <p>The number of devices that have this model version and have a heart beat. </p>
        pub fn set_connected_device_count(mut self, input: std::option::Option<i64>) -> Self {
            self.connected_device_count = input;
            self
        }
        /// <p>The number of devices that have this model version, a heart beat, and are currently running.</p>
        pub fn active_device_count(mut self, input: i64) -> Self {
            self.active_device_count = Some(input);
            self
        }
        /// <p>The number of devices that have this model version, a heart beat, and are currently running.</p>
        pub fn set_active_device_count(mut self, input: std::option::Option<i64>) -> Self {
            self.active_device_count = input;
            self
        }
        /// <p>The number of devices with this model version and are producing sample data.</p>
        pub fn sampling_device_count(mut self, input: i64) -> Self {
            self.sampling_device_count = Some(input);
            self
        }
        /// <p>The number of devices with this model version and are producing sample data.</p>
        pub fn set_sampling_device_count(mut self, input: std::option::Option<i64>) -> Self {
            self.sampling_device_count = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeModelStat`](crate::model::EdgeModelStat).
        pub fn build(self) -> crate::model::EdgeModelStat {
            crate::model::EdgeModelStat {
                model_name: self.model_name,
                model_version: self.model_version,
                offline_device_count: self.offline_device_count.unwrap_or_default(),
                connected_device_count: self.connected_device_count.unwrap_or_default(),
                active_device_count: self.active_device_count.unwrap_or_default(),
                sampling_device_count: self.sampling_device_count.unwrap_or_default(),
            }
        }
    }
}
impl EdgeModelStat {
    /// Creates a new builder-style object to manufacture [`EdgeModelStat`](crate::model::EdgeModelStat).
    pub fn builder() -> crate::model::edge_model_stat::Builder {
        crate::model::edge_model_stat::Builder::default()
    }
}

/// <p>Edge Manager agent version.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AgentVersion {
    /// <p>Version of the agent.</p>
    #[doc(hidden)]
    pub version: std::option::Option<std::string::String>,
    /// <p>The number of Edge Manager agents.</p>
    #[doc(hidden)]
    pub agent_count: i64,
}
impl AgentVersion {
    /// <p>Version of the agent.</p>
    pub fn version(&self) -> std::option::Option<&str> {
        self.version.as_deref()
    }
    /// <p>The number of Edge Manager agents.</p>
    pub fn agent_count(&self) -> i64 {
        self.agent_count
    }
}
/// See [`AgentVersion`](crate::model::AgentVersion).
pub mod agent_version {

    /// A builder for [`AgentVersion`](crate::model::AgentVersion).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) version: std::option::Option<std::string::String>,
        pub(crate) agent_count: std::option::Option<i64>,
    }
    impl Builder {
        /// <p>Version of the agent.</p>
        pub fn version(mut self, input: impl Into<std::string::String>) -> Self {
            self.version = Some(input.into());
            self
        }
        /// <p>Version of the agent.</p>
        pub fn set_version(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.version = input;
            self
        }
        /// <p>The number of Edge Manager agents.</p>
        pub fn agent_count(mut self, input: i64) -> Self {
            self.agent_count = Some(input);
            self
        }
        /// <p>The number of Edge Manager agents.</p>
        pub fn set_agent_count(mut self, input: std::option::Option<i64>) -> Self {
            self.agent_count = input;
            self
        }
        /// Consumes the builder and constructs a [`AgentVersion`](crate::model::AgentVersion).
        pub fn build(self) -> crate::model::AgentVersion {
            crate::model::AgentVersion {
                version: self.version,
                agent_count: self.agent_count.unwrap_or_default(),
            }
        }
    }
}
impl AgentVersion {
    /// Creates a new builder-style object to manufacture [`AgentVersion`](crate::model::AgentVersion).
    pub fn builder() -> crate::model::agent_version::Builder {
        crate::model::agent_version::Builder::default()
    }
}

/// <p>Status of devices.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeviceStats {
    /// <p>The number of devices connected with a heartbeat.</p>
    #[doc(hidden)]
    pub connected_device_count: i64,
    /// <p>The number of registered devices.</p>
    #[doc(hidden)]
    pub registered_device_count: i64,
}
impl DeviceStats {
    /// <p>The number of devices connected with a heartbeat.</p>
    pub fn connected_device_count(&self) -> i64 {
        self.connected_device_count
    }
    /// <p>The number of registered devices.</p>
    pub fn registered_device_count(&self) -> i64 {
        self.registered_device_count
    }
}
/// See [`DeviceStats`](crate::model::DeviceStats).
pub mod device_stats {

    /// A builder for [`DeviceStats`](crate::model::DeviceStats).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) connected_device_count: std::option::Option<i64>,
        pub(crate) registered_device_count: std::option::Option<i64>,
    }
    impl Builder {
        /// <p>The number of devices connected with a heartbeat.</p>
        pub fn connected_device_count(mut self, input: i64) -> Self {
            self.connected_device_count = Some(input);
            self
        }
        /// <p>The number of devices connected with a heartbeat.</p>
        pub fn set_connected_device_count(mut self, input: std::option::Option<i64>) -> Self {
            self.connected_device_count = input;
            self
        }
        /// <p>The number of registered devices.</p>
        pub fn registered_device_count(mut self, input: i64) -> Self {
            self.registered_device_count = Some(input);
            self
        }
        /// <p>The number of registered devices.</p>
        pub fn set_registered_device_count(mut self, input: std::option::Option<i64>) -> Self {
            self.registered_device_count = input;
            self
        }
        /// Consumes the builder and constructs a [`DeviceStats`](crate::model::DeviceStats).
        pub fn build(self) -> crate::model::DeviceStats {
            crate::model::DeviceStats {
                connected_device_count: self.connected_device_count.unwrap_or_default(),
                registered_device_count: self.registered_device_count.unwrap_or_default(),
            }
        }
    }
}
impl DeviceStats {
    /// Creates a new builder-style object to manufacture [`DeviceStats`](crate::model::DeviceStats).
    pub fn builder() -> crate::model::device_stats::Builder {
        crate::model::device_stats::Builder::default()
    }
}

/// <p>Configuration to control how SageMaker captures inference data for batch transform jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct BatchDataCaptureConfig {
    /// <p>The Amazon S3 location being used to capture the data.</p>
    #[doc(hidden)]
    pub destination_s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the batch transform job.</p>
    /// <p>The KmsKeyId can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>Flag that indicates whether to append inference id to the output.</p>
    #[doc(hidden)]
    pub generate_inference_id: bool,
}
impl BatchDataCaptureConfig {
    /// <p>The Amazon S3 location being used to capture the data.</p>
    pub fn destination_s3_uri(&self) -> std::option::Option<&str> {
        self.destination_s3_uri.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the batch transform job.</p>
    /// <p>The KmsKeyId can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>Flag that indicates whether to append inference id to the output.</p>
    pub fn generate_inference_id(&self) -> bool {
        self.generate_inference_id
    }
}
/// See [`BatchDataCaptureConfig`](crate::model::BatchDataCaptureConfig).
pub mod batch_data_capture_config {

    /// A builder for [`BatchDataCaptureConfig`](crate::model::BatchDataCaptureConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) destination_s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) generate_inference_id: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>The Amazon S3 location being used to capture the data.</p>
        pub fn destination_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location being used to capture the data.</p>
        pub fn set_destination_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_s3_uri = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the batch transform job.</p>
        /// <p>The KmsKeyId can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the batch transform job.</p>
        /// <p>The KmsKeyId can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>Flag that indicates whether to append inference id to the output.</p>
        pub fn generate_inference_id(mut self, input: bool) -> Self {
            self.generate_inference_id = Some(input);
            self
        }
        /// <p>Flag that indicates whether to append inference id to the output.</p>
        pub fn set_generate_inference_id(mut self, input: std::option::Option<bool>) -> Self {
            self.generate_inference_id = input;
            self
        }
        /// Consumes the builder and constructs a [`BatchDataCaptureConfig`](crate::model::BatchDataCaptureConfig).
        pub fn build(self) -> crate::model::BatchDataCaptureConfig {
            crate::model::BatchDataCaptureConfig {
                destination_s3_uri: self.destination_s3_uri,
                kms_key_id: self.kms_key_id,
                generate_inference_id: self.generate_inference_id.unwrap_or_default(),
            }
        }
    }
}
impl BatchDataCaptureConfig {
    /// Creates a new builder-style object to manufacture [`BatchDataCaptureConfig`](crate::model::BatchDataCaptureConfig).
    pub fn builder() -> crate::model::batch_data_capture_config::Builder {
        crate::model::batch_data_capture_config::Builder::default()
    }
}

/// When writing a match expression against `ProfilingStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let profilingstatus = unimplemented!();
/// match profilingstatus {
///     ProfilingStatus::Disabled => { /* ... */ },
///     ProfilingStatus::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `profilingstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProfilingStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProfilingStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProfilingStatus::NewFeature` is defined.
/// Specifically, when `profilingstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProfilingStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProfilingStatus {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProfilingStatus {
    fn from(s: &str) -> Self {
        match s {
            "Disabled" => ProfilingStatus::Disabled,
            "Enabled" => ProfilingStatus::Enabled,
            other => ProfilingStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ProfilingStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProfilingStatus::from(s))
    }
}
impl ProfilingStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProfilingStatus::Disabled => "Disabled",
            ProfilingStatus::Enabled => "Enabled",
            ProfilingStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Disabled", "Enabled"]
    }
}
impl AsRef<str> for ProfilingStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Information about the status of the rule evaluation.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProfilerRuleEvaluationStatus {
    /// <p>The name of the rule configuration.</p>
    #[doc(hidden)]
    pub rule_configuration_name: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
    #[doc(hidden)]
    pub rule_evaluation_job_arn: std::option::Option<std::string::String>,
    /// <p>Status of the rule evaluation.</p>
    #[doc(hidden)]
    pub rule_evaluation_status: std::option::Option<crate::model::RuleEvaluationStatus>,
    /// <p>Details from the rule evaluation.</p>
    #[doc(hidden)]
    pub status_details: std::option::Option<std::string::String>,
    /// <p>Timestamp when the rule evaluation status was last modified.</p>
    #[doc(hidden)]
    pub last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl ProfilerRuleEvaluationStatus {
    /// <p>The name of the rule configuration.</p>
    pub fn rule_configuration_name(&self) -> std::option::Option<&str> {
        self.rule_configuration_name.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
    pub fn rule_evaluation_job_arn(&self) -> std::option::Option<&str> {
        self.rule_evaluation_job_arn.as_deref()
    }
    /// <p>Status of the rule evaluation.</p>
    pub fn rule_evaluation_status(
        &self,
    ) -> std::option::Option<&crate::model::RuleEvaluationStatus> {
        self.rule_evaluation_status.as_ref()
    }
    /// <p>Details from the rule evaluation.</p>
    pub fn status_details(&self) -> std::option::Option<&str> {
        self.status_details.as_deref()
    }
    /// <p>Timestamp when the rule evaluation status was last modified.</p>
    pub fn last_modified_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.last_modified_time.as_ref()
    }
}
/// See [`ProfilerRuleEvaluationStatus`](crate::model::ProfilerRuleEvaluationStatus).
pub mod profiler_rule_evaluation_status {

    /// A builder for [`ProfilerRuleEvaluationStatus`](crate::model::ProfilerRuleEvaluationStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) rule_configuration_name: std::option::Option<std::string::String>,
        pub(crate) rule_evaluation_job_arn: std::option::Option<std::string::String>,
        pub(crate) rule_evaluation_status: std::option::Option<crate::model::RuleEvaluationStatus>,
        pub(crate) status_details: std::option::Option<std::string::String>,
        pub(crate) last_modified_time: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the rule configuration.</p>
        pub fn rule_configuration_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_configuration_name = Some(input.into());
            self
        }
        /// <p>The name of the rule configuration.</p>
        pub fn set_rule_configuration_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_configuration_name = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
        pub fn rule_evaluation_job_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.rule_evaluation_job_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the rule evaluation job.</p>
        pub fn set_rule_evaluation_job_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.rule_evaluation_job_arn = input;
            self
        }
        /// <p>Status of the rule evaluation.</p>
        pub fn rule_evaluation_status(mut self, input: crate::model::RuleEvaluationStatus) -> Self {
            self.rule_evaluation_status = Some(input);
            self
        }
        /// <p>Status of the rule evaluation.</p>
        pub fn set_rule_evaluation_status(
            mut self,
            input: std::option::Option<crate::model::RuleEvaluationStatus>,
        ) -> Self {
            self.rule_evaluation_status = input;
            self
        }
        /// <p>Details from the rule evaluation.</p>
        pub fn status_details(mut self, input: impl Into<std::string::String>) -> Self {
            self.status_details = Some(input.into());
            self
        }
        /// <p>Details from the rule evaluation.</p>
        pub fn set_status_details(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.status_details = input;
            self
        }
        /// <p>Timestamp when the rule evaluation status was last modified.</p>
        pub fn last_modified_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.last_modified_time = Some(input);
            self
        }
        /// <p>Timestamp when the rule evaluation status was last modified.</p>
        pub fn set_last_modified_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.last_modified_time = input;
            self
        }
        /// Consumes the builder and constructs a [`ProfilerRuleEvaluationStatus`](crate::model::ProfilerRuleEvaluationStatus).
        pub fn build(self) -> crate::model::ProfilerRuleEvaluationStatus {
            crate::model::ProfilerRuleEvaluationStatus {
                rule_configuration_name: self.rule_configuration_name,
                rule_evaluation_job_arn: self.rule_evaluation_job_arn,
                rule_evaluation_status: self.rule_evaluation_status,
                status_details: self.status_details,
                last_modified_time: self.last_modified_time,
            }
        }
    }
}
impl ProfilerRuleEvaluationStatus {
    /// Creates a new builder-style object to manufacture [`ProfilerRuleEvaluationStatus`](crate::model::ProfilerRuleEvaluationStatus).
    pub fn builder() -> crate::model::profiler_rule_evaluation_status::Builder {
        crate::model::profiler_rule_evaluation_status::Builder::default()
    }
}

/// <p>Configuration information for Amazon SageMaker Debugger system monitoring, framework profiling, and storage paths.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProfilerConfig {
    /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
    #[doc(hidden)]
    pub profiling_interval_in_milliseconds: std::option::Option<i64>,
    /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
    #[doc(hidden)]
    pub profiling_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>Configuration to turn off Amazon SageMaker Debugger's system monitoring and profiling functionality. To turn it off, set to <code>True</code>.</p>
    #[doc(hidden)]
    pub disable_profiler: bool,
}
impl ProfilerConfig {
    /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
    pub fn profiling_interval_in_milliseconds(&self) -> std::option::Option<i64> {
        self.profiling_interval_in_milliseconds
    }
    /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
    pub fn profiling_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.profiling_parameters.as_ref()
    }
    /// <p>Configuration to turn off Amazon SageMaker Debugger's system monitoring and profiling functionality. To turn it off, set to <code>True</code>.</p>
    pub fn disable_profiler(&self) -> bool {
        self.disable_profiler
    }
}
/// See [`ProfilerConfig`](crate::model::ProfilerConfig).
pub mod profiler_config {

    /// A builder for [`ProfilerConfig`](crate::model::ProfilerConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) profiling_interval_in_milliseconds: std::option::Option<i64>,
        pub(crate) profiling_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) disable_profiler: std::option::Option<bool>,
    }
    impl Builder {
        /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>Path to Amazon S3 storage location for system and framework metrics.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
        pub fn profiling_interval_in_milliseconds(mut self, input: i64) -> Self {
            self.profiling_interval_in_milliseconds = Some(input);
            self
        }
        /// <p>A time interval for capturing system metrics in milliseconds. Available values are 100, 200, 500, 1000 (1 second), 5000 (5 seconds), and 60000 (1 minute) milliseconds. The default value is 500 milliseconds.</p>
        pub fn set_profiling_interval_in_milliseconds(
            mut self,
            input: std::option::Option<i64>,
        ) -> Self {
            self.profiling_interval_in_milliseconds = input;
            self
        }
        /// Adds a key-value pair to `profiling_parameters`.
        ///
        /// To override the contents of this collection use [`set_profiling_parameters`](Self::set_profiling_parameters).
        ///
        /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
        pub fn profiling_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.profiling_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.profiling_parameters = Some(hash_map);
            self
        }
        /// <p>Configuration information for capturing framework metrics. Available key strings for different profiling options are <code>DetailedProfilingConfig</code>, <code>PythonProfilingConfig</code>, and <code>DataLoaderProfilingConfig</code>. The following codes are configuration structures for the <code>ProfilingParameters</code> parameter. To learn more about how to configure the <code>ProfilingParameters</code> parameter, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html">Use the SageMaker and Debugger Configuration API Operations to Create, Update, and Debug Your Training Job</a>. </p>
        pub fn set_profiling_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.profiling_parameters = input;
            self
        }
        /// <p>Configuration to turn off Amazon SageMaker Debugger's system monitoring and profiling functionality. To turn it off, set to <code>True</code>.</p>
        pub fn disable_profiler(mut self, input: bool) -> Self {
            self.disable_profiler = Some(input);
            self
        }
        /// <p>Configuration to turn off Amazon SageMaker Debugger's system monitoring and profiling functionality. To turn it off, set to <code>True</code>.</p>
        pub fn set_disable_profiler(mut self, input: std::option::Option<bool>) -> Self {
            self.disable_profiler = input;
            self
        }
        /// Consumes the builder and constructs a [`ProfilerConfig`](crate::model::ProfilerConfig).
        pub fn build(self) -> crate::model::ProfilerConfig {
            crate::model::ProfilerConfig {
                s3_output_path: self.s3_output_path,
                profiling_interval_in_milliseconds: self.profiling_interval_in_milliseconds,
                profiling_parameters: self.profiling_parameters,
                disable_profiler: self.disable_profiler.unwrap_or_default(),
            }
        }
    }
}
impl ProfilerConfig {
    /// Creates a new builder-style object to manufacture [`ProfilerConfig`](crate::model::ProfilerConfig).
    pub fn builder() -> crate::model::profiler_config::Builder {
        crate::model::profiler_config::Builder::default()
    }
}

/// When writing a match expression against `DirectInternetAccess`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let directinternetaccess = unimplemented!();
/// match directinternetaccess {
///     DirectInternetAccess::Disabled => { /* ... */ },
///     DirectInternetAccess::Enabled => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `directinternetaccess` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DirectInternetAccess::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DirectInternetAccess::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DirectInternetAccess::NewFeature` is defined.
/// Specifically, when `directinternetaccess` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DirectInternetAccess::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DirectInternetAccess {
    #[allow(missing_docs)] // documentation missing in model
    Disabled,
    #[allow(missing_docs)] // documentation missing in model
    Enabled,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DirectInternetAccess {
    fn from(s: &str) -> Self {
        match s {
            "Disabled" => DirectInternetAccess::Disabled,
            "Enabled" => DirectInternetAccess::Enabled,
            other => {
                DirectInternetAccess::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for DirectInternetAccess {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DirectInternetAccess::from(s))
    }
}
impl DirectInternetAccess {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DirectInternetAccess::Disabled => "Disabled",
            DirectInternetAccess::Enabled => "Enabled",
            DirectInternetAccess::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Disabled", "Enabled"]
    }
}
impl AsRef<str> for DirectInternetAccess {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The networking configuration for the monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringNetworkConfig {
    /// <p>Whether to encrypt all communications between the instances used for the monitoring jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed jobs, but the processing might take longer.</p>
    #[doc(hidden)]
    pub enable_inter_container_traffic_encryption: bool,
    /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the monitoring job.</p>
    #[doc(hidden)]
    pub enable_network_isolation: bool,
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
}
impl MonitoringNetworkConfig {
    /// <p>Whether to encrypt all communications between the instances used for the monitoring jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed jobs, but the processing might take longer.</p>
    pub fn enable_inter_container_traffic_encryption(&self) -> bool {
        self.enable_inter_container_traffic_encryption
    }
    /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the monitoring job.</p>
    pub fn enable_network_isolation(&self) -> bool {
        self.enable_network_isolation
    }
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
}
/// See [`MonitoringNetworkConfig`](crate::model::MonitoringNetworkConfig).
pub mod monitoring_network_config {

    /// A builder for [`MonitoringNetworkConfig`](crate::model::MonitoringNetworkConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) enable_inter_container_traffic_encryption: std::option::Option<bool>,
        pub(crate) enable_network_isolation: std::option::Option<bool>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
    }
    impl Builder {
        /// <p>Whether to encrypt all communications between the instances used for the monitoring jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed jobs, but the processing might take longer.</p>
        pub fn enable_inter_container_traffic_encryption(mut self, input: bool) -> Self {
            self.enable_inter_container_traffic_encryption = Some(input);
            self
        }
        /// <p>Whether to encrypt all communications between the instances used for the monitoring jobs. Choose <code>True</code> to encrypt communications. Encryption provides greater security for distributed jobs, but the processing might take longer.</p>
        pub fn set_enable_inter_container_traffic_encryption(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_inter_container_traffic_encryption = input;
            self
        }
        /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the monitoring job.</p>
        pub fn enable_network_isolation(mut self, input: bool) -> Self {
            self.enable_network_isolation = Some(input);
            self
        }
        /// <p>Whether to allow inbound and outbound network calls to and from the containers used for the monitoring job.</p>
        pub fn set_enable_network_isolation(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_network_isolation = input;
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringNetworkConfig`](crate::model::MonitoringNetworkConfig).
        pub fn build(self) -> crate::model::MonitoringNetworkConfig {
            crate::model::MonitoringNetworkConfig {
                enable_inter_container_traffic_encryption: self
                    .enable_inter_container_traffic_encryption
                    .unwrap_or_default(),
                enable_network_isolation: self.enable_network_isolation.unwrap_or_default(),
                vpc_config: self.vpc_config,
            }
        }
    }
}
impl MonitoringNetworkConfig {
    /// Creates a new builder-style object to manufacture [`MonitoringNetworkConfig`](crate::model::MonitoringNetworkConfig).
    pub fn builder() -> crate::model::monitoring_network_config::Builder {
        crate::model::monitoring_network_config::Builder::default()
    }
}

/// <p>The input for the model quality monitoring job. Currently endponts are supported for input for model quality monitoring jobs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelQualityJobInput {
    /// <p>Input object for the endpoint</p>
    #[doc(hidden)]
    pub endpoint_input: std::option::Option<crate::model::EndpointInput>,
    /// <p>Input object for the batch transform job.</p>
    #[doc(hidden)]
    pub batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
    /// <p>The ground truth label provided for the model.</p>
    #[doc(hidden)]
    pub ground_truth_s3_input: std::option::Option<crate::model::MonitoringGroundTruthS3Input>,
}
impl ModelQualityJobInput {
    /// <p>Input object for the endpoint</p>
    pub fn endpoint_input(&self) -> std::option::Option<&crate::model::EndpointInput> {
        self.endpoint_input.as_ref()
    }
    /// <p>Input object for the batch transform job.</p>
    pub fn batch_transform_input(&self) -> std::option::Option<&crate::model::BatchTransformInput> {
        self.batch_transform_input.as_ref()
    }
    /// <p>The ground truth label provided for the model.</p>
    pub fn ground_truth_s3_input(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringGroundTruthS3Input> {
        self.ground_truth_s3_input.as_ref()
    }
}
/// See [`ModelQualityJobInput`](crate::model::ModelQualityJobInput).
pub mod model_quality_job_input {

    /// A builder for [`ModelQualityJobInput`](crate::model::ModelQualityJobInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_input: std::option::Option<crate::model::EndpointInput>,
        pub(crate) batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
        pub(crate) ground_truth_s3_input:
            std::option::Option<crate::model::MonitoringGroundTruthS3Input>,
    }
    impl Builder {
        /// <p>Input object for the endpoint</p>
        pub fn endpoint_input(mut self, input: crate::model::EndpointInput) -> Self {
            self.endpoint_input = Some(input);
            self
        }
        /// <p>Input object for the endpoint</p>
        pub fn set_endpoint_input(
            mut self,
            input: std::option::Option<crate::model::EndpointInput>,
        ) -> Self {
            self.endpoint_input = input;
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn batch_transform_input(mut self, input: crate::model::BatchTransformInput) -> Self {
            self.batch_transform_input = Some(input);
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn set_batch_transform_input(
            mut self,
            input: std::option::Option<crate::model::BatchTransformInput>,
        ) -> Self {
            self.batch_transform_input = input;
            self
        }
        /// <p>The ground truth label provided for the model.</p>
        pub fn ground_truth_s3_input(
            mut self,
            input: crate::model::MonitoringGroundTruthS3Input,
        ) -> Self {
            self.ground_truth_s3_input = Some(input);
            self
        }
        /// <p>The ground truth label provided for the model.</p>
        pub fn set_ground_truth_s3_input(
            mut self,
            input: std::option::Option<crate::model::MonitoringGroundTruthS3Input>,
        ) -> Self {
            self.ground_truth_s3_input = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelQualityJobInput`](crate::model::ModelQualityJobInput).
        pub fn build(self) -> crate::model::ModelQualityJobInput {
            crate::model::ModelQualityJobInput {
                endpoint_input: self.endpoint_input,
                batch_transform_input: self.batch_transform_input,
                ground_truth_s3_input: self.ground_truth_s3_input,
            }
        }
    }
}
impl ModelQualityJobInput {
    /// Creates a new builder-style object to manufacture [`ModelQualityJobInput`](crate::model::ModelQualityJobInput).
    pub fn builder() -> crate::model::model_quality_job_input::Builder {
        crate::model::model_quality_job_input::Builder::default()
    }
}

/// <p>The ground truth labels for the dataset used for the monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct MonitoringGroundTruthS3Input {
    /// <p>The address of the Amazon S3 location of the ground truth labels.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl MonitoringGroundTruthS3Input {
    /// <p>The address of the Amazon S3 location of the ground truth labels.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`MonitoringGroundTruthS3Input`](crate::model::MonitoringGroundTruthS3Input).
pub mod monitoring_ground_truth_s3_input {

    /// A builder for [`MonitoringGroundTruthS3Input`](crate::model::MonitoringGroundTruthS3Input).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The address of the Amazon S3 location of the ground truth labels.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The address of the Amazon S3 location of the ground truth labels.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`MonitoringGroundTruthS3Input`](crate::model::MonitoringGroundTruthS3Input).
        pub fn build(self) -> crate::model::MonitoringGroundTruthS3Input {
            crate::model::MonitoringGroundTruthS3Input {
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl MonitoringGroundTruthS3Input {
    /// Creates a new builder-style object to manufacture [`MonitoringGroundTruthS3Input`](crate::model::MonitoringGroundTruthS3Input).
    pub fn builder() -> crate::model::monitoring_ground_truth_s3_input::Builder {
        crate::model::monitoring_ground_truth_s3_input::Builder::default()
    }
}

/// <p>Container image configuration object for the monitoring job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelQualityAppSpecification {
    /// <p>The address of the container image that the monitoring job runs.</p>
    #[doc(hidden)]
    pub image_uri: std::option::Option<std::string::String>,
    /// <p>Specifies the entrypoint for a container that the monitoring job runs.</p>
    #[doc(hidden)]
    pub container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>An array of arguments for the container used to run the monitoring job.</p>
    #[doc(hidden)]
    pub container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
    #[doc(hidden)]
    pub record_preprocessor_source_uri: std::option::Option<std::string::String>,
    /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
    #[doc(hidden)]
    pub post_analytics_processor_source_uri: std::option::Option<std::string::String>,
    /// <p>The machine learning problem type of the model that the monitoring job monitors.</p>
    #[doc(hidden)]
    pub problem_type: std::option::Option<crate::model::MonitoringProblemType>,
    /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl ModelQualityAppSpecification {
    /// <p>The address of the container image that the monitoring job runs.</p>
    pub fn image_uri(&self) -> std::option::Option<&str> {
        self.image_uri.as_deref()
    }
    /// <p>Specifies the entrypoint for a container that the monitoring job runs.</p>
    pub fn container_entrypoint(&self) -> std::option::Option<&[std::string::String]> {
        self.container_entrypoint.as_deref()
    }
    /// <p>An array of arguments for the container used to run the monitoring job.</p>
    pub fn container_arguments(&self) -> std::option::Option<&[std::string::String]> {
        self.container_arguments.as_deref()
    }
    /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
    pub fn record_preprocessor_source_uri(&self) -> std::option::Option<&str> {
        self.record_preprocessor_source_uri.as_deref()
    }
    /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
    pub fn post_analytics_processor_source_uri(&self) -> std::option::Option<&str> {
        self.post_analytics_processor_source_uri.as_deref()
    }
    /// <p>The machine learning problem type of the model that the monitoring job monitors.</p>
    pub fn problem_type(&self) -> std::option::Option<&crate::model::MonitoringProblemType> {
        self.problem_type.as_ref()
    }
    /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
}
/// See [`ModelQualityAppSpecification`](crate::model::ModelQualityAppSpecification).
pub mod model_quality_app_specification {

    /// A builder for [`ModelQualityAppSpecification`](crate::model::ModelQualityAppSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_uri: std::option::Option<std::string::String>,
        pub(crate) container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) record_preprocessor_source_uri: std::option::Option<std::string::String>,
        pub(crate) post_analytics_processor_source_uri: std::option::Option<std::string::String>,
        pub(crate) problem_type: std::option::Option<crate::model::MonitoringProblemType>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The address of the container image that the monitoring job runs.</p>
        pub fn image_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_uri = Some(input.into());
            self
        }
        /// <p>The address of the container image that the monitoring job runs.</p>
        pub fn set_image_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_uri = input;
            self
        }
        /// Appends an item to `container_entrypoint`.
        ///
        /// To override the contents of this collection use [`set_container_entrypoint`](Self::set_container_entrypoint).
        ///
        /// <p>Specifies the entrypoint for a container that the monitoring job runs.</p>
        pub fn container_entrypoint(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_entrypoint.unwrap_or_default();
            v.push(input.into());
            self.container_entrypoint = Some(v);
            self
        }
        /// <p>Specifies the entrypoint for a container that the monitoring job runs.</p>
        pub fn set_container_entrypoint(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_entrypoint = input;
            self
        }
        /// Appends an item to `container_arguments`.
        ///
        /// To override the contents of this collection use [`set_container_arguments`](Self::set_container_arguments).
        ///
        /// <p>An array of arguments for the container used to run the monitoring job.</p>
        pub fn container_arguments(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_arguments.unwrap_or_default();
            v.push(input.into());
            self.container_arguments = Some(v);
            self
        }
        /// <p>An array of arguments for the container used to run the monitoring job.</p>
        pub fn set_container_arguments(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_arguments = input;
            self
        }
        /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
        pub fn record_preprocessor_source_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.record_preprocessor_source_uri = Some(input.into());
            self
        }
        /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
        pub fn set_record_preprocessor_source_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.record_preprocessor_source_uri = input;
            self
        }
        /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
        pub fn post_analytics_processor_source_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.post_analytics_processor_source_uri = Some(input.into());
            self
        }
        /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
        pub fn set_post_analytics_processor_source_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.post_analytics_processor_source_uri = input;
            self
        }
        /// <p>The machine learning problem type of the model that the monitoring job monitors.</p>
        pub fn problem_type(mut self, input: crate::model::MonitoringProblemType) -> Self {
            self.problem_type = Some(input);
            self
        }
        /// <p>The machine learning problem type of the model that the monitoring job monitors.</p>
        pub fn set_problem_type(
            mut self,
            input: std::option::Option<crate::model::MonitoringProblemType>,
        ) -> Self {
            self.problem_type = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelQualityAppSpecification`](crate::model::ModelQualityAppSpecification).
        pub fn build(self) -> crate::model::ModelQualityAppSpecification {
            crate::model::ModelQualityAppSpecification {
                image_uri: self.image_uri,
                container_entrypoint: self.container_entrypoint,
                container_arguments: self.container_arguments,
                record_preprocessor_source_uri: self.record_preprocessor_source_uri,
                post_analytics_processor_source_uri: self.post_analytics_processor_source_uri,
                problem_type: self.problem_type,
                environment: self.environment,
            }
        }
    }
}
impl ModelQualityAppSpecification {
    /// Creates a new builder-style object to manufacture [`ModelQualityAppSpecification`](crate::model::ModelQualityAppSpecification).
    pub fn builder() -> crate::model::model_quality_app_specification::Builder {
        crate::model::model_quality_app_specification::Builder::default()
    }
}

/// When writing a match expression against `MonitoringProblemType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let monitoringproblemtype = unimplemented!();
/// match monitoringproblemtype {
///     MonitoringProblemType::BinaryClassification => { /* ... */ },
///     MonitoringProblemType::MulticlassClassification => { /* ... */ },
///     MonitoringProblemType::Regression => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `monitoringproblemtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `MonitoringProblemType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `MonitoringProblemType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `MonitoringProblemType::NewFeature` is defined.
/// Specifically, when `monitoringproblemtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `MonitoringProblemType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum MonitoringProblemType {
    #[allow(missing_docs)] // documentation missing in model
    BinaryClassification,
    #[allow(missing_docs)] // documentation missing in model
    MulticlassClassification,
    #[allow(missing_docs)] // documentation missing in model
    Regression,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for MonitoringProblemType {
    fn from(s: &str) -> Self {
        match s {
            "BinaryClassification" => MonitoringProblemType::BinaryClassification,
            "MulticlassClassification" => MonitoringProblemType::MulticlassClassification,
            "Regression" => MonitoringProblemType::Regression,
            other => {
                MonitoringProblemType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for MonitoringProblemType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(MonitoringProblemType::from(s))
    }
}
impl MonitoringProblemType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            MonitoringProblemType::BinaryClassification => "BinaryClassification",
            MonitoringProblemType::MulticlassClassification => "MulticlassClassification",
            MonitoringProblemType::Regression => "Regression",
            MonitoringProblemType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "BinaryClassification",
            "MulticlassClassification",
            "Regression",
        ]
    }
}
impl AsRef<str> for MonitoringProblemType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Configuration for monitoring constraints and monitoring statistics. These baseline resources are compared against the results of the current job from the series of jobs scheduled to collect data periodically.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelQualityBaselineConfig {
    /// <p>The name of the job that performs baselining for the monitoring job.</p>
    #[doc(hidden)]
    pub baselining_job_name: std::option::Option<std::string::String>,
    /// <p>The constraints resource for a monitoring job.</p>
    #[doc(hidden)]
    pub constraints_resource: std::option::Option<crate::model::MonitoringConstraintsResource>,
}
impl ModelQualityBaselineConfig {
    /// <p>The name of the job that performs baselining for the monitoring job.</p>
    pub fn baselining_job_name(&self) -> std::option::Option<&str> {
        self.baselining_job_name.as_deref()
    }
    /// <p>The constraints resource for a monitoring job.</p>
    pub fn constraints_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringConstraintsResource> {
        self.constraints_resource.as_ref()
    }
}
/// See [`ModelQualityBaselineConfig`](crate::model::ModelQualityBaselineConfig).
pub mod model_quality_baseline_config {

    /// A builder for [`ModelQualityBaselineConfig`](crate::model::ModelQualityBaselineConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) baselining_job_name: std::option::Option<std::string::String>,
        pub(crate) constraints_resource:
            std::option::Option<crate::model::MonitoringConstraintsResource>,
    }
    impl Builder {
        /// <p>The name of the job that performs baselining for the monitoring job.</p>
        pub fn baselining_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.baselining_job_name = Some(input.into());
            self
        }
        /// <p>The name of the job that performs baselining for the monitoring job.</p>
        pub fn set_baselining_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baselining_job_name = input;
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn constraints_resource(
            mut self,
            input: crate::model::MonitoringConstraintsResource,
        ) -> Self {
            self.constraints_resource = Some(input);
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn set_constraints_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringConstraintsResource>,
        ) -> Self {
            self.constraints_resource = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelQualityBaselineConfig`](crate::model::ModelQualityBaselineConfig).
        pub fn build(self) -> crate::model::ModelQualityBaselineConfig {
            crate::model::ModelQualityBaselineConfig {
                baselining_job_name: self.baselining_job_name,
                constraints_resource: self.constraints_resource,
            }
        }
    }
}
impl ModelQualityBaselineConfig {
    /// Creates a new builder-style object to manufacture [`ModelQualityBaselineConfig`](crate::model::ModelQualityBaselineConfig).
    pub fn builder() -> crate::model::model_quality_baseline_config::Builder {
        crate::model::model_quality_baseline_config::Builder::default()
    }
}

/// <p>Inputs for the model explainability job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelExplainabilityJobInput {
    /// <p>Input object for the endpoint</p>
    #[doc(hidden)]
    pub endpoint_input: std::option::Option<crate::model::EndpointInput>,
    /// <p>Input object for the batch transform job.</p>
    #[doc(hidden)]
    pub batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
}
impl ModelExplainabilityJobInput {
    /// <p>Input object for the endpoint</p>
    pub fn endpoint_input(&self) -> std::option::Option<&crate::model::EndpointInput> {
        self.endpoint_input.as_ref()
    }
    /// <p>Input object for the batch transform job.</p>
    pub fn batch_transform_input(&self) -> std::option::Option<&crate::model::BatchTransformInput> {
        self.batch_transform_input.as_ref()
    }
}
/// See [`ModelExplainabilityJobInput`](crate::model::ModelExplainabilityJobInput).
pub mod model_explainability_job_input {

    /// A builder for [`ModelExplainabilityJobInput`](crate::model::ModelExplainabilityJobInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_input: std::option::Option<crate::model::EndpointInput>,
        pub(crate) batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
    }
    impl Builder {
        /// <p>Input object for the endpoint</p>
        pub fn endpoint_input(mut self, input: crate::model::EndpointInput) -> Self {
            self.endpoint_input = Some(input);
            self
        }
        /// <p>Input object for the endpoint</p>
        pub fn set_endpoint_input(
            mut self,
            input: std::option::Option<crate::model::EndpointInput>,
        ) -> Self {
            self.endpoint_input = input;
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn batch_transform_input(mut self, input: crate::model::BatchTransformInput) -> Self {
            self.batch_transform_input = Some(input);
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn set_batch_transform_input(
            mut self,
            input: std::option::Option<crate::model::BatchTransformInput>,
        ) -> Self {
            self.batch_transform_input = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelExplainabilityJobInput`](crate::model::ModelExplainabilityJobInput).
        pub fn build(self) -> crate::model::ModelExplainabilityJobInput {
            crate::model::ModelExplainabilityJobInput {
                endpoint_input: self.endpoint_input,
                batch_transform_input: self.batch_transform_input,
            }
        }
    }
}
impl ModelExplainabilityJobInput {
    /// Creates a new builder-style object to manufacture [`ModelExplainabilityJobInput`](crate::model::ModelExplainabilityJobInput).
    pub fn builder() -> crate::model::model_explainability_job_input::Builder {
        crate::model::model_explainability_job_input::Builder::default()
    }
}

/// <p>Docker container image configuration object for the model explainability job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelExplainabilityAppSpecification {
    /// <p>The container image to be run by the model explainability job.</p>
    #[doc(hidden)]
    pub image_uri: std::option::Option<std::string::String>,
    /// <p>JSON formatted S3 file that defines explainability parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-model-explainability-parameters.html">Configure model explainability parameters</a>.</p>
    #[doc(hidden)]
    pub config_uri: std::option::Option<std::string::String>,
    /// <p>Sets the environment variables in the Docker container.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl ModelExplainabilityAppSpecification {
    /// <p>The container image to be run by the model explainability job.</p>
    pub fn image_uri(&self) -> std::option::Option<&str> {
        self.image_uri.as_deref()
    }
    /// <p>JSON formatted S3 file that defines explainability parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-model-explainability-parameters.html">Configure model explainability parameters</a>.</p>
    pub fn config_uri(&self) -> std::option::Option<&str> {
        self.config_uri.as_deref()
    }
    /// <p>Sets the environment variables in the Docker container.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
}
/// See [`ModelExplainabilityAppSpecification`](crate::model::ModelExplainabilityAppSpecification).
pub mod model_explainability_app_specification {

    /// A builder for [`ModelExplainabilityAppSpecification`](crate::model::ModelExplainabilityAppSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_uri: std::option::Option<std::string::String>,
        pub(crate) config_uri: std::option::Option<std::string::String>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The container image to be run by the model explainability job.</p>
        pub fn image_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_uri = Some(input.into());
            self
        }
        /// <p>The container image to be run by the model explainability job.</p>
        pub fn set_image_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_uri = input;
            self
        }
        /// <p>JSON formatted S3 file that defines explainability parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-model-explainability-parameters.html">Configure model explainability parameters</a>.</p>
        pub fn config_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.config_uri = Some(input.into());
            self
        }
        /// <p>JSON formatted S3 file that defines explainability parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-model-explainability-parameters.html">Configure model explainability parameters</a>.</p>
        pub fn set_config_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.config_uri = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelExplainabilityAppSpecification`](crate::model::ModelExplainabilityAppSpecification).
        pub fn build(self) -> crate::model::ModelExplainabilityAppSpecification {
            crate::model::ModelExplainabilityAppSpecification {
                image_uri: self.image_uri,
                config_uri: self.config_uri,
                environment: self.environment,
            }
        }
    }
}
impl ModelExplainabilityAppSpecification {
    /// Creates a new builder-style object to manufacture [`ModelExplainabilityAppSpecification`](crate::model::ModelExplainabilityAppSpecification).
    pub fn builder() -> crate::model::model_explainability_app_specification::Builder {
        crate::model::model_explainability_app_specification::Builder::default()
    }
}

/// <p>The configuration for a baseline model explainability job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelExplainabilityBaselineConfig {
    /// <p>The name of the baseline model explainability job.</p>
    #[doc(hidden)]
    pub baselining_job_name: std::option::Option<std::string::String>,
    /// <p>The constraints resource for a monitoring job.</p>
    #[doc(hidden)]
    pub constraints_resource: std::option::Option<crate::model::MonitoringConstraintsResource>,
}
impl ModelExplainabilityBaselineConfig {
    /// <p>The name of the baseline model explainability job.</p>
    pub fn baselining_job_name(&self) -> std::option::Option<&str> {
        self.baselining_job_name.as_deref()
    }
    /// <p>The constraints resource for a monitoring job.</p>
    pub fn constraints_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringConstraintsResource> {
        self.constraints_resource.as_ref()
    }
}
/// See [`ModelExplainabilityBaselineConfig`](crate::model::ModelExplainabilityBaselineConfig).
pub mod model_explainability_baseline_config {

    /// A builder for [`ModelExplainabilityBaselineConfig`](crate::model::ModelExplainabilityBaselineConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) baselining_job_name: std::option::Option<std::string::String>,
        pub(crate) constraints_resource:
            std::option::Option<crate::model::MonitoringConstraintsResource>,
    }
    impl Builder {
        /// <p>The name of the baseline model explainability job.</p>
        pub fn baselining_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.baselining_job_name = Some(input.into());
            self
        }
        /// <p>The name of the baseline model explainability job.</p>
        pub fn set_baselining_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baselining_job_name = input;
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn constraints_resource(
            mut self,
            input: crate::model::MonitoringConstraintsResource,
        ) -> Self {
            self.constraints_resource = Some(input);
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn set_constraints_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringConstraintsResource>,
        ) -> Self {
            self.constraints_resource = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelExplainabilityBaselineConfig`](crate::model::ModelExplainabilityBaselineConfig).
        pub fn build(self) -> crate::model::ModelExplainabilityBaselineConfig {
            crate::model::ModelExplainabilityBaselineConfig {
                baselining_job_name: self.baselining_job_name,
                constraints_resource: self.constraints_resource,
            }
        }
    }
}
impl ModelExplainabilityBaselineConfig {
    /// Creates a new builder-style object to manufacture [`ModelExplainabilityBaselineConfig`](crate::model::ModelExplainabilityBaselineConfig).
    pub fn builder() -> crate::model::model_explainability_baseline_config::Builder {
        crate::model::model_explainability_baseline_config::Builder::default()
    }
}

/// <p>The artifacts of the model card export job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelCardExportArtifacts {
    /// <p>The Amazon S3 URI of the exported model artifacts.</p>
    #[doc(hidden)]
    pub s3_export_artifacts: std::option::Option<std::string::String>,
}
impl ModelCardExportArtifacts {
    /// <p>The Amazon S3 URI of the exported model artifacts.</p>
    pub fn s3_export_artifacts(&self) -> std::option::Option<&str> {
        self.s3_export_artifacts.as_deref()
    }
}
/// See [`ModelCardExportArtifacts`](crate::model::ModelCardExportArtifacts).
pub mod model_card_export_artifacts {

    /// A builder for [`ModelCardExportArtifacts`](crate::model::ModelCardExportArtifacts).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_export_artifacts: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 URI of the exported model artifacts.</p>
        pub fn s3_export_artifacts(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_export_artifacts = Some(input.into());
            self
        }
        /// <p>The Amazon S3 URI of the exported model artifacts.</p>
        pub fn set_s3_export_artifacts(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_export_artifacts = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCardExportArtifacts`](crate::model::ModelCardExportArtifacts).
        pub fn build(self) -> crate::model::ModelCardExportArtifacts {
            crate::model::ModelCardExportArtifacts {
                s3_export_artifacts: self.s3_export_artifacts,
            }
        }
    }
}
impl ModelCardExportArtifacts {
    /// Creates a new builder-style object to manufacture [`ModelCardExportArtifacts`](crate::model::ModelCardExportArtifacts).
    pub fn builder() -> crate::model::model_card_export_artifacts::Builder {
        crate::model::model_card_export_artifacts::Builder::default()
    }
}

/// <p>Configure the export output details for an Amazon SageMaker Model Card.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelCardExportOutputConfig {
    /// <p>The Amazon S3 output path to export your model card PDF.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
}
impl ModelCardExportOutputConfig {
    /// <p>The Amazon S3 output path to export your model card PDF.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
}
/// See [`ModelCardExportOutputConfig`](crate::model::ModelCardExportOutputConfig).
pub mod model_card_export_output_config {

    /// A builder for [`ModelCardExportOutputConfig`](crate::model::ModelCardExportOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 output path to export your model card PDF.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 output path to export your model card PDF.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelCardExportOutputConfig`](crate::model::ModelCardExportOutputConfig).
        pub fn build(self) -> crate::model::ModelCardExportOutputConfig {
            crate::model::ModelCardExportOutputConfig {
                s3_output_path: self.s3_output_path,
            }
        }
    }
}
impl ModelCardExportOutputConfig {
    /// Creates a new builder-style object to manufacture [`ModelCardExportOutputConfig`](crate::model::ModelCardExportOutputConfig).
    pub fn builder() -> crate::model::model_card_export_output_config::Builder {
        crate::model::model_card_export_output_config::Builder::default()
    }
}

/// When writing a match expression against `ModelCardProcessingStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelcardprocessingstatus = unimplemented!();
/// match modelcardprocessingstatus {
///     ModelCardProcessingStatus::ContentDeleted => { /* ... */ },
///     ModelCardProcessingStatus::DeleteCompleted => { /* ... */ },
///     ModelCardProcessingStatus::DeleteFailed => { /* ... */ },
///     ModelCardProcessingStatus::DeleteInprogress => { /* ... */ },
///     ModelCardProcessingStatus::DeletePending => { /* ... */ },
///     ModelCardProcessingStatus::ExportjobsDeleted => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelcardprocessingstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelCardProcessingStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelCardProcessingStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelCardProcessingStatus::NewFeature` is defined.
/// Specifically, when `modelcardprocessingstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelCardProcessingStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelCardProcessingStatus {
    #[allow(missing_docs)] // documentation missing in model
    ContentDeleted,
    #[allow(missing_docs)] // documentation missing in model
    DeleteCompleted,
    #[allow(missing_docs)] // documentation missing in model
    DeleteFailed,
    #[allow(missing_docs)] // documentation missing in model
    DeleteInprogress,
    #[allow(missing_docs)] // documentation missing in model
    DeletePending,
    #[allow(missing_docs)] // documentation missing in model
    ExportjobsDeleted,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelCardProcessingStatus {
    fn from(s: &str) -> Self {
        match s {
            "ContentDeleted" => ModelCardProcessingStatus::ContentDeleted,
            "DeleteCompleted" => ModelCardProcessingStatus::DeleteCompleted,
            "DeleteFailed" => ModelCardProcessingStatus::DeleteFailed,
            "DeleteInProgress" => ModelCardProcessingStatus::DeleteInprogress,
            "DeletePending" => ModelCardProcessingStatus::DeletePending,
            "ExportJobsDeleted" => ModelCardProcessingStatus::ExportjobsDeleted,
            other => ModelCardProcessingStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ModelCardProcessingStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelCardProcessingStatus::from(s))
    }
}
impl ModelCardProcessingStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelCardProcessingStatus::ContentDeleted => "ContentDeleted",
            ModelCardProcessingStatus::DeleteCompleted => "DeleteCompleted",
            ModelCardProcessingStatus::DeleteFailed => "DeleteFailed",
            ModelCardProcessingStatus::DeleteInprogress => "DeleteInProgress",
            ModelCardProcessingStatus::DeletePending => "DeletePending",
            ModelCardProcessingStatus::ExportjobsDeleted => "ExportJobsDeleted",
            ModelCardProcessingStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ContentDeleted",
            "DeleteCompleted",
            "DeleteFailed",
            "DeleteInProgress",
            "DeletePending",
            "ExportJobsDeleted",
        ]
    }
}
impl AsRef<str> for ModelCardProcessingStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Inputs for the model bias job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelBiasJobInput {
    /// <p>Input object for the endpoint</p>
    #[doc(hidden)]
    pub endpoint_input: std::option::Option<crate::model::EndpointInput>,
    /// <p>Input object for the batch transform job.</p>
    #[doc(hidden)]
    pub batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
    /// <p>Location of ground truth labels to use in model bias job.</p>
    #[doc(hidden)]
    pub ground_truth_s3_input: std::option::Option<crate::model::MonitoringGroundTruthS3Input>,
}
impl ModelBiasJobInput {
    /// <p>Input object for the endpoint</p>
    pub fn endpoint_input(&self) -> std::option::Option<&crate::model::EndpointInput> {
        self.endpoint_input.as_ref()
    }
    /// <p>Input object for the batch transform job.</p>
    pub fn batch_transform_input(&self) -> std::option::Option<&crate::model::BatchTransformInput> {
        self.batch_transform_input.as_ref()
    }
    /// <p>Location of ground truth labels to use in model bias job.</p>
    pub fn ground_truth_s3_input(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringGroundTruthS3Input> {
        self.ground_truth_s3_input.as_ref()
    }
}
/// See [`ModelBiasJobInput`](crate::model::ModelBiasJobInput).
pub mod model_bias_job_input {

    /// A builder for [`ModelBiasJobInput`](crate::model::ModelBiasJobInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_input: std::option::Option<crate::model::EndpointInput>,
        pub(crate) batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
        pub(crate) ground_truth_s3_input:
            std::option::Option<crate::model::MonitoringGroundTruthS3Input>,
    }
    impl Builder {
        /// <p>Input object for the endpoint</p>
        pub fn endpoint_input(mut self, input: crate::model::EndpointInput) -> Self {
            self.endpoint_input = Some(input);
            self
        }
        /// <p>Input object for the endpoint</p>
        pub fn set_endpoint_input(
            mut self,
            input: std::option::Option<crate::model::EndpointInput>,
        ) -> Self {
            self.endpoint_input = input;
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn batch_transform_input(mut self, input: crate::model::BatchTransformInput) -> Self {
            self.batch_transform_input = Some(input);
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn set_batch_transform_input(
            mut self,
            input: std::option::Option<crate::model::BatchTransformInput>,
        ) -> Self {
            self.batch_transform_input = input;
            self
        }
        /// <p>Location of ground truth labels to use in model bias job.</p>
        pub fn ground_truth_s3_input(
            mut self,
            input: crate::model::MonitoringGroundTruthS3Input,
        ) -> Self {
            self.ground_truth_s3_input = Some(input);
            self
        }
        /// <p>Location of ground truth labels to use in model bias job.</p>
        pub fn set_ground_truth_s3_input(
            mut self,
            input: std::option::Option<crate::model::MonitoringGroundTruthS3Input>,
        ) -> Self {
            self.ground_truth_s3_input = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelBiasJobInput`](crate::model::ModelBiasJobInput).
        pub fn build(self) -> crate::model::ModelBiasJobInput {
            crate::model::ModelBiasJobInput {
                endpoint_input: self.endpoint_input,
                batch_transform_input: self.batch_transform_input,
                ground_truth_s3_input: self.ground_truth_s3_input,
            }
        }
    }
}
impl ModelBiasJobInput {
    /// Creates a new builder-style object to manufacture [`ModelBiasJobInput`](crate::model::ModelBiasJobInput).
    pub fn builder() -> crate::model::model_bias_job_input::Builder {
        crate::model::model_bias_job_input::Builder::default()
    }
}

/// <p>Docker container image configuration object for the model bias job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelBiasAppSpecification {
    /// <p>The container image to be run by the model bias job.</p>
    #[doc(hidden)]
    pub image_uri: std::option::Option<std::string::String>,
    /// <p>JSON formatted S3 file that defines bias parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-bias-parameters.html">Configure bias parameters</a>.</p>
    #[doc(hidden)]
    pub config_uri: std::option::Option<std::string::String>,
    /// <p>Sets the environment variables in the Docker container.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl ModelBiasAppSpecification {
    /// <p>The container image to be run by the model bias job.</p>
    pub fn image_uri(&self) -> std::option::Option<&str> {
        self.image_uri.as_deref()
    }
    /// <p>JSON formatted S3 file that defines bias parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-bias-parameters.html">Configure bias parameters</a>.</p>
    pub fn config_uri(&self) -> std::option::Option<&str> {
        self.config_uri.as_deref()
    }
    /// <p>Sets the environment variables in the Docker container.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
}
/// See [`ModelBiasAppSpecification`](crate::model::ModelBiasAppSpecification).
pub mod model_bias_app_specification {

    /// A builder for [`ModelBiasAppSpecification`](crate::model::ModelBiasAppSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_uri: std::option::Option<std::string::String>,
        pub(crate) config_uri: std::option::Option<std::string::String>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The container image to be run by the model bias job.</p>
        pub fn image_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_uri = Some(input.into());
            self
        }
        /// <p>The container image to be run by the model bias job.</p>
        pub fn set_image_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_uri = input;
            self
        }
        /// <p>JSON formatted S3 file that defines bias parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-bias-parameters.html">Configure bias parameters</a>.</p>
        pub fn config_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.config_uri = Some(input.into());
            self
        }
        /// <p>JSON formatted S3 file that defines bias parameters. For more information on this JSON configuration file, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-bias-parameters.html">Configure bias parameters</a>.</p>
        pub fn set_config_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.config_uri = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>Sets the environment variables in the Docker container.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelBiasAppSpecification`](crate::model::ModelBiasAppSpecification).
        pub fn build(self) -> crate::model::ModelBiasAppSpecification {
            crate::model::ModelBiasAppSpecification {
                image_uri: self.image_uri,
                config_uri: self.config_uri,
                environment: self.environment,
            }
        }
    }
}
impl ModelBiasAppSpecification {
    /// Creates a new builder-style object to manufacture [`ModelBiasAppSpecification`](crate::model::ModelBiasAppSpecification).
    pub fn builder() -> crate::model::model_bias_app_specification::Builder {
        crate::model::model_bias_app_specification::Builder::default()
    }
}

/// <p>The configuration for a baseline model bias job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelBiasBaselineConfig {
    /// <p>The name of the baseline model bias job.</p>
    #[doc(hidden)]
    pub baselining_job_name: std::option::Option<std::string::String>,
    /// <p>The constraints resource for a monitoring job.</p>
    #[doc(hidden)]
    pub constraints_resource: std::option::Option<crate::model::MonitoringConstraintsResource>,
}
impl ModelBiasBaselineConfig {
    /// <p>The name of the baseline model bias job.</p>
    pub fn baselining_job_name(&self) -> std::option::Option<&str> {
        self.baselining_job_name.as_deref()
    }
    /// <p>The constraints resource for a monitoring job.</p>
    pub fn constraints_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringConstraintsResource> {
        self.constraints_resource.as_ref()
    }
}
/// See [`ModelBiasBaselineConfig`](crate::model::ModelBiasBaselineConfig).
pub mod model_bias_baseline_config {

    /// A builder for [`ModelBiasBaselineConfig`](crate::model::ModelBiasBaselineConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) baselining_job_name: std::option::Option<std::string::String>,
        pub(crate) constraints_resource:
            std::option::Option<crate::model::MonitoringConstraintsResource>,
    }
    impl Builder {
        /// <p>The name of the baseline model bias job.</p>
        pub fn baselining_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.baselining_job_name = Some(input.into());
            self
        }
        /// <p>The name of the baseline model bias job.</p>
        pub fn set_baselining_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baselining_job_name = input;
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn constraints_resource(
            mut self,
            input: crate::model::MonitoringConstraintsResource,
        ) -> Self {
            self.constraints_resource = Some(input);
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn set_constraints_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringConstraintsResource>,
        ) -> Self {
            self.constraints_resource = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelBiasBaselineConfig`](crate::model::ModelBiasBaselineConfig).
        pub fn build(self) -> crate::model::ModelBiasBaselineConfig {
            crate::model::ModelBiasBaselineConfig {
                baselining_job_name: self.baselining_job_name,
                constraints_resource: self.constraints_resource,
            }
        }
    }
}
impl ModelBiasBaselineConfig {
    /// Creates a new builder-style object to manufacture [`ModelBiasBaselineConfig`](crate::model::ModelBiasBaselineConfig).
    pub fn builder() -> crate::model::model_bias_baseline_config::Builder {
        crate::model::model_bias_baseline_config::Builder::default()
    }
}

/// <p>Information required for human workers to complete a labeling task.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HumanTaskConfig {
    /// <p>The Amazon Resource Name (ARN) of the work team assigned to complete the tasks.</p>
    #[doc(hidden)]
    pub workteam_arn: std::option::Option<std::string::String>,
    /// <p>Information about the user interface that workers use to complete the labeling task.</p>
    #[doc(hidden)]
    pub ui_config: std::option::Option<crate::model::UiConfig>,
    /// <p>The Amazon Resource Name (ARN) of a Lambda function that is run before a data object is sent to a human worker. Use this function to provide input to a custom labeling job.</p>
    /// <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>PreHumanTaskLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-prelambda">Pre-annotation Lambda</a>. </p>
    /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-BoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-SemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Modalities</b> </p>
    /// <p>Use the following pre-annotation lambdas for 3D point cloud labeling modality tasks. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud-task-types.html">3D Point Cloud Task types </a> to learn more. </p>
    /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
    /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
    /// <p> <b>Bounding box verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Bounding box adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D point cloud object detection adjustment</b> - Adjust 3D cuboids in a point cloud frame. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D point cloud object tracking adjustment</b> - Adjust 3D cuboids across a sequence of point cloud frames. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D point cloud semantic segmentation adjustment</b> - Adjust semantic segmentation masks in a 3D point cloud. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub pre_human_task_lambda_arn: std::option::Option<std::string::String>,
    /// <p>Keywords used to describe the task so that workers on Amazon Mechanical Turk can discover the task.</p>
    #[doc(hidden)]
    pub task_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A title for the task for your human workers.</p>
    #[doc(hidden)]
    pub task_title: std::option::Option<std::string::String>,
    /// <p>A description of the task for your human workers.</p>
    #[doc(hidden)]
    pub task_description: std::option::Option<std::string::String>,
    /// <p>The number of human workers that will label an object. </p>
    #[doc(hidden)]
    pub number_of_human_workers_per_data_object: std::option::Option<i32>,
    /// <p>The amount of time that a worker has to complete a task. </p>
    /// <p>If you create a custom labeling job, the maximum value for this parameter is 8 hours (28,800 seconds).</p>
    /// <p>If you create a labeling job using a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task type</a> the maximum for this parameter depends on the task type you use:</p>
    /// <ul>
    /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-images.html">image</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-text.html">text</a> labeling jobs, the maximum is 8 hours (28,800 seconds).</p> </li>
    /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud.html">3D point cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-video.html">video frame</a> labeling jobs, the maximum is 30 days (2952,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub task_time_limit_in_seconds: std::option::Option<i32>,
    /// <p>The length of time that a task remains available for labeling by human workers. The default and maximum values for this parameter depend on the type of workforce you use.</p>
    /// <ul>
    /// <li> <p>If you choose the Amazon Mechanical Turk workforce, the maximum is 12 hours (43,200 seconds). The default is 6 hours (21,600 seconds).</p> </li>
    /// <li> <p>If you choose a private or vendor workforce, the default value is 30 days (2592,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub task_availability_lifetime_in_seconds: std::option::Option<i32>,
    /// <p>Defines the maximum number of data objects that can be labeled by human workers at the same time. Also referred to as batch size. Each object may have more than one worker at one time. The default value is 1000 objects. To increase the maximum value to 5000 objects, contact Amazon Web Services Support.</p>
    #[doc(hidden)]
    pub max_concurrent_task_count: std::option::Option<i32>,
    /// <p>Configures how labels are consolidated across human workers.</p>
    #[doc(hidden)]
    pub annotation_consolidation_config:
        std::option::Option<crate::model::AnnotationConsolidationConfig>,
    /// <p>The price that you pay for each task performed by an Amazon Mechanical Turk worker.</p>
    #[doc(hidden)]
    pub public_workforce_task_price: std::option::Option<crate::model::PublicWorkforceTaskPrice>,
}
impl HumanTaskConfig {
    /// <p>The Amazon Resource Name (ARN) of the work team assigned to complete the tasks.</p>
    pub fn workteam_arn(&self) -> std::option::Option<&str> {
        self.workteam_arn.as_deref()
    }
    /// <p>Information about the user interface that workers use to complete the labeling task.</p>
    pub fn ui_config(&self) -> std::option::Option<&crate::model::UiConfig> {
        self.ui_config.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of a Lambda function that is run before a data object is sent to a human worker. Use this function to provide input to a custom labeling job.</p>
    /// <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>PreHumanTaskLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-prelambda">Pre-annotation Lambda</a>. </p>
    /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-BoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-SemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-NamedEntityRecognition</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Modalities</b> </p>
    /// <p>Use the following pre-annotation lambdas for 3D point cloud labeling modality tasks. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud-task-types.html">3D Point Cloud Task types </a> to learn more. </p>
    /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
    /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
    /// <p> <b>Bounding box verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Bounding box adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D point cloud object detection adjustment</b> - Adjust 3D cuboids in a point cloud frame. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D point cloud object tracking adjustment</b> - Adjust 3D cuboids across a sequence of point cloud frames. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D point cloud semantic segmentation adjustment</b> - Adjust semantic segmentation masks in a 3D point cloud. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    pub fn pre_human_task_lambda_arn(&self) -> std::option::Option<&str> {
        self.pre_human_task_lambda_arn.as_deref()
    }
    /// <p>Keywords used to describe the task so that workers on Amazon Mechanical Turk can discover the task.</p>
    pub fn task_keywords(&self) -> std::option::Option<&[std::string::String]> {
        self.task_keywords.as_deref()
    }
    /// <p>A title for the task for your human workers.</p>
    pub fn task_title(&self) -> std::option::Option<&str> {
        self.task_title.as_deref()
    }
    /// <p>A description of the task for your human workers.</p>
    pub fn task_description(&self) -> std::option::Option<&str> {
        self.task_description.as_deref()
    }
    /// <p>The number of human workers that will label an object. </p>
    pub fn number_of_human_workers_per_data_object(&self) -> std::option::Option<i32> {
        self.number_of_human_workers_per_data_object
    }
    /// <p>The amount of time that a worker has to complete a task. </p>
    /// <p>If you create a custom labeling job, the maximum value for this parameter is 8 hours (28,800 seconds).</p>
    /// <p>If you create a labeling job using a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task type</a> the maximum for this parameter depends on the task type you use:</p>
    /// <ul>
    /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-images.html">image</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-text.html">text</a> labeling jobs, the maximum is 8 hours (28,800 seconds).</p> </li>
    /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud.html">3D point cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-video.html">video frame</a> labeling jobs, the maximum is 30 days (2952,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
    /// </ul>
    pub fn task_time_limit_in_seconds(&self) -> std::option::Option<i32> {
        self.task_time_limit_in_seconds
    }
    /// <p>The length of time that a task remains available for labeling by human workers. The default and maximum values for this parameter depend on the type of workforce you use.</p>
    /// <ul>
    /// <li> <p>If you choose the Amazon Mechanical Turk workforce, the maximum is 12 hours (43,200 seconds). The default is 6 hours (21,600 seconds).</p> </li>
    /// <li> <p>If you choose a private or vendor workforce, the default value is 30 days (2592,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
    /// </ul>
    pub fn task_availability_lifetime_in_seconds(&self) -> std::option::Option<i32> {
        self.task_availability_lifetime_in_seconds
    }
    /// <p>Defines the maximum number of data objects that can be labeled by human workers at the same time. Also referred to as batch size. Each object may have more than one worker at one time. The default value is 1000 objects. To increase the maximum value to 5000 objects, contact Amazon Web Services Support.</p>
    pub fn max_concurrent_task_count(&self) -> std::option::Option<i32> {
        self.max_concurrent_task_count
    }
    /// <p>Configures how labels are consolidated across human workers.</p>
    pub fn annotation_consolidation_config(
        &self,
    ) -> std::option::Option<&crate::model::AnnotationConsolidationConfig> {
        self.annotation_consolidation_config.as_ref()
    }
    /// <p>The price that you pay for each task performed by an Amazon Mechanical Turk worker.</p>
    pub fn public_workforce_task_price(
        &self,
    ) -> std::option::Option<&crate::model::PublicWorkforceTaskPrice> {
        self.public_workforce_task_price.as_ref()
    }
}
/// See [`HumanTaskConfig`](crate::model::HumanTaskConfig).
pub mod human_task_config {

    /// A builder for [`HumanTaskConfig`](crate::model::HumanTaskConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) workteam_arn: std::option::Option<std::string::String>,
        pub(crate) ui_config: std::option::Option<crate::model::UiConfig>,
        pub(crate) pre_human_task_lambda_arn: std::option::Option<std::string::String>,
        pub(crate) task_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) task_title: std::option::Option<std::string::String>,
        pub(crate) task_description: std::option::Option<std::string::String>,
        pub(crate) number_of_human_workers_per_data_object: std::option::Option<i32>,
        pub(crate) task_time_limit_in_seconds: std::option::Option<i32>,
        pub(crate) task_availability_lifetime_in_seconds: std::option::Option<i32>,
        pub(crate) max_concurrent_task_count: std::option::Option<i32>,
        pub(crate) annotation_consolidation_config:
            std::option::Option<crate::model::AnnotationConsolidationConfig>,
        pub(crate) public_workforce_task_price:
            std::option::Option<crate::model::PublicWorkforceTaskPrice>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of the work team assigned to complete the tasks.</p>
        pub fn workteam_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workteam_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the work team assigned to complete the tasks.</p>
        pub fn set_workteam_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.workteam_arn = input;
            self
        }
        /// <p>Information about the user interface that workers use to complete the labeling task.</p>
        pub fn ui_config(mut self, input: crate::model::UiConfig) -> Self {
            self.ui_config = Some(input);
            self
        }
        /// <p>Information about the user interface that workers use to complete the labeling task.</p>
        pub fn set_ui_config(mut self, input: std::option::Option<crate::model::UiConfig>) -> Self {
            self.ui_config = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Lambda function that is run before a data object is sent to a human worker. Use this function to provide input to a custom labeling job.</p>
        /// <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>PreHumanTaskLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-prelambda">Pre-annotation Lambda</a>. </p>
        /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-BoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-SemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Modalities</b> </p>
        /// <p>Use the following pre-annotation lambdas for 3D point cloud labeling modality tasks. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud-task-types.html">3D Point Cloud Task types </a> to learn more. </p>
        /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
        /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
        /// <p> <b>Bounding box verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Bounding box adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D point cloud object detection adjustment</b> - Adjust 3D cuboids in a point cloud frame. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D point cloud object tracking adjustment</b> - Adjust 3D cuboids across a sequence of point cloud frames. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D point cloud semantic segmentation adjustment</b> - Adjust semantic segmentation masks in a 3D point cloud. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        pub fn pre_human_task_lambda_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.pre_human_task_lambda_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Lambda function that is run before a data object is sent to a human worker. Use this function to provide input to a custom labeling job.</p>
        /// <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>PreHumanTaskLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-prelambda">Pre-annotation Lambda</a>. </p>
        /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-BoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-ImageMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-SemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-TextMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-NamedEntityRecognition</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Modalities</b> </p>
        /// <p>Use the following pre-annotation lambdas for 3D point cloud labeling modality tasks. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud-task-types.html">3D Point Cloud Task types </a> to learn more. </p>
        /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
        /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
        /// <p> <b>Bounding box verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Bounding box adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-VerificationSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-AdjustmentVideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D point cloud object detection adjustment</b> - Adjust 3D cuboids in a point cloud frame. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D point cloud object tracking adjustment</b> - Adjust 3D cuboids across a sequence of point cloud frames. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D point cloud semantic segmentation adjustment</b> - Adjust semantic segmentation masks in a 3D point cloud. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:PRE-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        pub fn set_pre_human_task_lambda_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.pre_human_task_lambda_arn = input;
            self
        }
        /// Appends an item to `task_keywords`.
        ///
        /// To override the contents of this collection use [`set_task_keywords`](Self::set_task_keywords).
        ///
        /// <p>Keywords used to describe the task so that workers on Amazon Mechanical Turk can discover the task.</p>
        pub fn task_keywords(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.task_keywords.unwrap_or_default();
            v.push(input.into());
            self.task_keywords = Some(v);
            self
        }
        /// <p>Keywords used to describe the task so that workers on Amazon Mechanical Turk can discover the task.</p>
        pub fn set_task_keywords(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.task_keywords = input;
            self
        }
        /// <p>A title for the task for your human workers.</p>
        pub fn task_title(mut self, input: impl Into<std::string::String>) -> Self {
            self.task_title = Some(input.into());
            self
        }
        /// <p>A title for the task for your human workers.</p>
        pub fn set_task_title(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.task_title = input;
            self
        }
        /// <p>A description of the task for your human workers.</p>
        pub fn task_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.task_description = Some(input.into());
            self
        }
        /// <p>A description of the task for your human workers.</p>
        pub fn set_task_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.task_description = input;
            self
        }
        /// <p>The number of human workers that will label an object. </p>
        pub fn number_of_human_workers_per_data_object(mut self, input: i32) -> Self {
            self.number_of_human_workers_per_data_object = Some(input);
            self
        }
        /// <p>The number of human workers that will label an object. </p>
        pub fn set_number_of_human_workers_per_data_object(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.number_of_human_workers_per_data_object = input;
            self
        }
        /// <p>The amount of time that a worker has to complete a task. </p>
        /// <p>If you create a custom labeling job, the maximum value for this parameter is 8 hours (28,800 seconds).</p>
        /// <p>If you create a labeling job using a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task type</a> the maximum for this parameter depends on the task type you use:</p>
        /// <ul>
        /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-images.html">image</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-text.html">text</a> labeling jobs, the maximum is 8 hours (28,800 seconds).</p> </li>
        /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud.html">3D point cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-video.html">video frame</a> labeling jobs, the maximum is 30 days (2952,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
        /// </ul>
        pub fn task_time_limit_in_seconds(mut self, input: i32) -> Self {
            self.task_time_limit_in_seconds = Some(input);
            self
        }
        /// <p>The amount of time that a worker has to complete a task. </p>
        /// <p>If you create a custom labeling job, the maximum value for this parameter is 8 hours (28,800 seconds).</p>
        /// <p>If you create a labeling job using a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task type</a> the maximum for this parameter depends on the task type you use:</p>
        /// <ul>
        /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-images.html">image</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-label-text.html">text</a> labeling jobs, the maximum is 8 hours (28,800 seconds).</p> </li>
        /// <li> <p>For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-point-cloud.html">3D point cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-video.html">video frame</a> labeling jobs, the maximum is 30 days (2952,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
        /// </ul>
        pub fn set_task_time_limit_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.task_time_limit_in_seconds = input;
            self
        }
        /// <p>The length of time that a task remains available for labeling by human workers. The default and maximum values for this parameter depend on the type of workforce you use.</p>
        /// <ul>
        /// <li> <p>If you choose the Amazon Mechanical Turk workforce, the maximum is 12 hours (43,200 seconds). The default is 6 hours (21,600 seconds).</p> </li>
        /// <li> <p>If you choose a private or vendor workforce, the default value is 30 days (2592,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
        /// </ul>
        pub fn task_availability_lifetime_in_seconds(mut self, input: i32) -> Self {
            self.task_availability_lifetime_in_seconds = Some(input);
            self
        }
        /// <p>The length of time that a task remains available for labeling by human workers. The default and maximum values for this parameter depend on the type of workforce you use.</p>
        /// <ul>
        /// <li> <p>If you choose the Amazon Mechanical Turk workforce, the maximum is 12 hours (43,200 seconds). The default is 6 hours (21,600 seconds).</p> </li>
        /// <li> <p>If you choose a private or vendor workforce, the default value is 30 days (2592,000 seconds) for non-AL mode. For most users, the maximum is also 30 days.</p> </li>
        /// </ul>
        pub fn set_task_availability_lifetime_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.task_availability_lifetime_in_seconds = input;
            self
        }
        /// <p>Defines the maximum number of data objects that can be labeled by human workers at the same time. Also referred to as batch size. Each object may have more than one worker at one time. The default value is 1000 objects. To increase the maximum value to 5000 objects, contact Amazon Web Services Support.</p>
        pub fn max_concurrent_task_count(mut self, input: i32) -> Self {
            self.max_concurrent_task_count = Some(input);
            self
        }
        /// <p>Defines the maximum number of data objects that can be labeled by human workers at the same time. Also referred to as batch size. Each object may have more than one worker at one time. The default value is 1000 objects. To increase the maximum value to 5000 objects, contact Amazon Web Services Support.</p>
        pub fn set_max_concurrent_task_count(mut self, input: std::option::Option<i32>) -> Self {
            self.max_concurrent_task_count = input;
            self
        }
        /// <p>Configures how labels are consolidated across human workers.</p>
        pub fn annotation_consolidation_config(
            mut self,
            input: crate::model::AnnotationConsolidationConfig,
        ) -> Self {
            self.annotation_consolidation_config = Some(input);
            self
        }
        /// <p>Configures how labels are consolidated across human workers.</p>
        pub fn set_annotation_consolidation_config(
            mut self,
            input: std::option::Option<crate::model::AnnotationConsolidationConfig>,
        ) -> Self {
            self.annotation_consolidation_config = input;
            self
        }
        /// <p>The price that you pay for each task performed by an Amazon Mechanical Turk worker.</p>
        pub fn public_workforce_task_price(
            mut self,
            input: crate::model::PublicWorkforceTaskPrice,
        ) -> Self {
            self.public_workforce_task_price = Some(input);
            self
        }
        /// <p>The price that you pay for each task performed by an Amazon Mechanical Turk worker.</p>
        pub fn set_public_workforce_task_price(
            mut self,
            input: std::option::Option<crate::model::PublicWorkforceTaskPrice>,
        ) -> Self {
            self.public_workforce_task_price = input;
            self
        }
        /// Consumes the builder and constructs a [`HumanTaskConfig`](crate::model::HumanTaskConfig).
        pub fn build(self) -> crate::model::HumanTaskConfig {
            crate::model::HumanTaskConfig {
                workteam_arn: self.workteam_arn,
                ui_config: self.ui_config,
                pre_human_task_lambda_arn: self.pre_human_task_lambda_arn,
                task_keywords: self.task_keywords,
                task_title: self.task_title,
                task_description: self.task_description,
                number_of_human_workers_per_data_object: self
                    .number_of_human_workers_per_data_object,
                task_time_limit_in_seconds: self.task_time_limit_in_seconds,
                task_availability_lifetime_in_seconds: self.task_availability_lifetime_in_seconds,
                max_concurrent_task_count: self.max_concurrent_task_count,
                annotation_consolidation_config: self.annotation_consolidation_config,
                public_workforce_task_price: self.public_workforce_task_price,
            }
        }
    }
}
impl HumanTaskConfig {
    /// Creates a new builder-style object to manufacture [`HumanTaskConfig`](crate::model::HumanTaskConfig).
    pub fn builder() -> crate::model::human_task_config::Builder {
        crate::model::human_task_config::Builder::default()
    }
}

/// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker for each task performed. </p>
/// <p>Use one of the following prices for bounding box tasks. Prices are in US dollars and should be based on the complexity of the task; the longer it takes in your initial testing, the more you should offer.</p>
/// <ul>
/// <li> <p>0.036</p> </li>
/// <li> <p>0.048</p> </li>
/// <li> <p>0.060</p> </li>
/// <li> <p>0.072</p> </li>
/// <li> <p>0.120</p> </li>
/// <li> <p>0.240</p> </li>
/// <li> <p>0.360</p> </li>
/// <li> <p>0.480</p> </li>
/// <li> <p>0.600</p> </li>
/// <li> <p>0.720</p> </li>
/// <li> <p>0.840</p> </li>
/// <li> <p>0.960</p> </li>
/// <li> <p>1.080</p> </li>
/// <li> <p>1.200</p> </li>
/// </ul>
/// <p>Use one of the following prices for image classification, text classification, and custom tasks. Prices are in US dollars.</p>
/// <ul>
/// <li> <p>0.012</p> </li>
/// <li> <p>0.024</p> </li>
/// <li> <p>0.036</p> </li>
/// <li> <p>0.048</p> </li>
/// <li> <p>0.060</p> </li>
/// <li> <p>0.072</p> </li>
/// <li> <p>0.120</p> </li>
/// <li> <p>0.240</p> </li>
/// <li> <p>0.360</p> </li>
/// <li> <p>0.480</p> </li>
/// <li> <p>0.600</p> </li>
/// <li> <p>0.720</p> </li>
/// <li> <p>0.840</p> </li>
/// <li> <p>0.960</p> </li>
/// <li> <p>1.080</p> </li>
/// <li> <p>1.200</p> </li>
/// </ul>
/// <p>Use one of the following prices for semantic segmentation tasks. Prices are in US dollars.</p>
/// <ul>
/// <li> <p>0.840</p> </li>
/// <li> <p>0.960</p> </li>
/// <li> <p>1.080</p> </li>
/// <li> <p>1.200</p> </li>
/// </ul>
/// <p>Use one of the following prices for Textract AnalyzeDocument Important Form Key Amazon Augmented AI review tasks. Prices are in US dollars.</p>
/// <ul>
/// <li> <p>2.400 </p> </li>
/// <li> <p>2.280 </p> </li>
/// <li> <p>2.160 </p> </li>
/// <li> <p>2.040 </p> </li>
/// <li> <p>1.920 </p> </li>
/// <li> <p>1.800 </p> </li>
/// <li> <p>1.680 </p> </li>
/// <li> <p>1.560 </p> </li>
/// <li> <p>1.440 </p> </li>
/// <li> <p>1.320 </p> </li>
/// <li> <p>1.200 </p> </li>
/// <li> <p>1.080 </p> </li>
/// <li> <p>0.960 </p> </li>
/// <li> <p>0.840 </p> </li>
/// <li> <p>0.720 </p> </li>
/// <li> <p>0.600 </p> </li>
/// <li> <p>0.480 </p> </li>
/// <li> <p>0.360 </p> </li>
/// <li> <p>0.240 </p> </li>
/// <li> <p>0.120 </p> </li>
/// <li> <p>0.072 </p> </li>
/// <li> <p>0.060 </p> </li>
/// <li> <p>0.048 </p> </li>
/// <li> <p>0.036 </p> </li>
/// <li> <p>0.024 </p> </li>
/// <li> <p>0.012 </p> </li>
/// </ul>
/// <p>Use one of the following prices for Rekognition DetectModerationLabels Amazon Augmented AI review tasks. Prices are in US dollars.</p>
/// <ul>
/// <li> <p>1.200 </p> </li>
/// <li> <p>1.080 </p> </li>
/// <li> <p>0.960 </p> </li>
/// <li> <p>0.840 </p> </li>
/// <li> <p>0.720 </p> </li>
/// <li> <p>0.600 </p> </li>
/// <li> <p>0.480 </p> </li>
/// <li> <p>0.360 </p> </li>
/// <li> <p>0.240 </p> </li>
/// <li> <p>0.120 </p> </li>
/// <li> <p>0.072 </p> </li>
/// <li> <p>0.060 </p> </li>
/// <li> <p>0.048 </p> </li>
/// <li> <p>0.036 </p> </li>
/// <li> <p>0.024 </p> </li>
/// <li> <p>0.012 </p> </li>
/// </ul>
/// <p>Use one of the following prices for Amazon Augmented AI custom human review tasks. Prices are in US dollars.</p>
/// <ul>
/// <li> <p>1.200 </p> </li>
/// <li> <p>1.080 </p> </li>
/// <li> <p>0.960 </p> </li>
/// <li> <p>0.840 </p> </li>
/// <li> <p>0.720 </p> </li>
/// <li> <p>0.600 </p> </li>
/// <li> <p>0.480 </p> </li>
/// <li> <p>0.360 </p> </li>
/// <li> <p>0.240 </p> </li>
/// <li> <p>0.120 </p> </li>
/// <li> <p>0.072 </p> </li>
/// <li> <p>0.060 </p> </li>
/// <li> <p>0.048 </p> </li>
/// <li> <p>0.036 </p> </li>
/// <li> <p>0.024 </p> </li>
/// <li> <p>0.012 </p> </li>
/// </ul>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PublicWorkforceTaskPrice {
    /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker in United States dollars.</p>
    #[doc(hidden)]
    pub amount_in_usd: std::option::Option<crate::model::Usd>,
}
impl PublicWorkforceTaskPrice {
    /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker in United States dollars.</p>
    pub fn amount_in_usd(&self) -> std::option::Option<&crate::model::Usd> {
        self.amount_in_usd.as_ref()
    }
}
/// See [`PublicWorkforceTaskPrice`](crate::model::PublicWorkforceTaskPrice).
pub mod public_workforce_task_price {

    /// A builder for [`PublicWorkforceTaskPrice`](crate::model::PublicWorkforceTaskPrice).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) amount_in_usd: std::option::Option<crate::model::Usd>,
    }
    impl Builder {
        /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker in United States dollars.</p>
        pub fn amount_in_usd(mut self, input: crate::model::Usd) -> Self {
            self.amount_in_usd = Some(input);
            self
        }
        /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker in United States dollars.</p>
        pub fn set_amount_in_usd(mut self, input: std::option::Option<crate::model::Usd>) -> Self {
            self.amount_in_usd = input;
            self
        }
        /// Consumes the builder and constructs a [`PublicWorkforceTaskPrice`](crate::model::PublicWorkforceTaskPrice).
        pub fn build(self) -> crate::model::PublicWorkforceTaskPrice {
            crate::model::PublicWorkforceTaskPrice {
                amount_in_usd: self.amount_in_usd,
            }
        }
    }
}
impl PublicWorkforceTaskPrice {
    /// Creates a new builder-style object to manufacture [`PublicWorkforceTaskPrice`](crate::model::PublicWorkforceTaskPrice).
    pub fn builder() -> crate::model::public_workforce_task_price::Builder {
        crate::model::public_workforce_task_price::Builder::default()
    }
}

/// <p>Represents an amount of money in United States dollars.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Usd {
    /// <p>The whole number of dollars in the amount.</p>
    #[doc(hidden)]
    pub dollars: i32,
    /// <p>The fractional portion, in cents, of the amount. </p>
    #[doc(hidden)]
    pub cents: i32,
    /// <p>Fractions of a cent, in tenths.</p>
    #[doc(hidden)]
    pub tenth_fractions_of_a_cent: i32,
}
impl Usd {
    /// <p>The whole number of dollars in the amount.</p>
    pub fn dollars(&self) -> i32 {
        self.dollars
    }
    /// <p>The fractional portion, in cents, of the amount. </p>
    pub fn cents(&self) -> i32 {
        self.cents
    }
    /// <p>Fractions of a cent, in tenths.</p>
    pub fn tenth_fractions_of_a_cent(&self) -> i32 {
        self.tenth_fractions_of_a_cent
    }
}
/// See [`Usd`](crate::model::Usd).
pub mod usd {

    /// A builder for [`Usd`](crate::model::Usd).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) dollars: std::option::Option<i32>,
        pub(crate) cents: std::option::Option<i32>,
        pub(crate) tenth_fractions_of_a_cent: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The whole number of dollars in the amount.</p>
        pub fn dollars(mut self, input: i32) -> Self {
            self.dollars = Some(input);
            self
        }
        /// <p>The whole number of dollars in the amount.</p>
        pub fn set_dollars(mut self, input: std::option::Option<i32>) -> Self {
            self.dollars = input;
            self
        }
        /// <p>The fractional portion, in cents, of the amount. </p>
        pub fn cents(mut self, input: i32) -> Self {
            self.cents = Some(input);
            self
        }
        /// <p>The fractional portion, in cents, of the amount. </p>
        pub fn set_cents(mut self, input: std::option::Option<i32>) -> Self {
            self.cents = input;
            self
        }
        /// <p>Fractions of a cent, in tenths.</p>
        pub fn tenth_fractions_of_a_cent(mut self, input: i32) -> Self {
            self.tenth_fractions_of_a_cent = Some(input);
            self
        }
        /// <p>Fractions of a cent, in tenths.</p>
        pub fn set_tenth_fractions_of_a_cent(mut self, input: std::option::Option<i32>) -> Self {
            self.tenth_fractions_of_a_cent = input;
            self
        }
        /// Consumes the builder and constructs a [`Usd`](crate::model::Usd).
        pub fn build(self) -> crate::model::Usd {
            crate::model::Usd {
                dollars: self.dollars.unwrap_or_default(),
                cents: self.cents.unwrap_or_default(),
                tenth_fractions_of_a_cent: self.tenth_fractions_of_a_cent.unwrap_or_default(),
            }
        }
    }
}
impl Usd {
    /// Creates a new builder-style object to manufacture [`Usd`](crate::model::Usd).
    pub fn builder() -> crate::model::usd::Builder {
        crate::model::usd::Builder::default()
    }
}

/// <p>Configures how labels are consolidated across human workers and processes output data. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AnnotationConsolidationConfig {
    /// <p>The Amazon Resource Name (ARN) of a Lambda function implements the logic for <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">annotation consolidation</a> and to process output data.</p>
    /// <p>This parameter is required for all labeling jobs. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>AnnotationConsolidationLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-postlambda">Post-annotation Lambda</a>. </p>
    /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-BoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-SemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
    /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
    /// <p> <b>Semantic Segmentation Adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic Segmentation Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Bounding Box Adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Bounding Box Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Detection Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects in a 3D point cloud. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Tracking Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects that appear in a sequence of 3D point cloud frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Semantic Segmentation Adjustment</b> - Use this task type when you want workers to adjust a point-level semantic segmentation masks using a paint tool.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub annotation_consolidation_lambda_arn: std::option::Option<std::string::String>,
}
impl AnnotationConsolidationConfig {
    /// <p>The Amazon Resource Name (ARN) of a Lambda function implements the logic for <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">annotation consolidation</a> and to process output data.</p>
    /// <p>This parameter is required for all labeling jobs. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>AnnotationConsolidationLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-postlambda">Post-annotation Lambda</a>. </p>
    /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-BoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-BoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-SemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-SemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
    /// </ul>
    /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-NamedEntityRecognition</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoMultiClass</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoMultiClass</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
    /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
    /// <p> <b>Semantic Segmentation Adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Semantic Segmentation Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Bounding Box Adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Bounding Box Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationBoundingBox</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Detection Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects in a 3D point cloud. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Object Tracking Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects that appear in a sequence of 3D point cloud frames.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> <b>3D Point Cloud Semantic Segmentation Adjustment</b> - Use this task type when you want workers to adjust a point-level semantic segmentation masks using a paint tool.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    pub fn annotation_consolidation_lambda_arn(&self) -> std::option::Option<&str> {
        self.annotation_consolidation_lambda_arn.as_deref()
    }
}
/// See [`AnnotationConsolidationConfig`](crate::model::AnnotationConsolidationConfig).
pub mod annotation_consolidation_config {

    /// A builder for [`AnnotationConsolidationConfig`](crate::model::AnnotationConsolidationConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) annotation_consolidation_lambda_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of a Lambda function implements the logic for <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">annotation consolidation</a> and to process output data.</p>
        /// <p>This parameter is required for all labeling jobs. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>AnnotationConsolidationLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-postlambda">Post-annotation Lambda</a>. </p>
        /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-BoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-SemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
        /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
        /// <p> <b>Semantic Segmentation Adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic Segmentation Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Bounding Box Adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Bounding Box Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Detection Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects in a 3D point cloud. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Tracking Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects that appear in a sequence of 3D point cloud frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Semantic Segmentation Adjustment</b> - Use this task type when you want workers to adjust a point-level semantic segmentation masks using a paint tool.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        pub fn annotation_consolidation_lambda_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.annotation_consolidation_lambda_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Lambda function implements the logic for <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-annotation-consolidation.html">annotation consolidation</a> and to process output data.</p>
        /// <p>This parameter is required for all labeling jobs. For <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-task-types.html">built-in task types</a>, use one of the following Amazon SageMaker Ground Truth Lambda function ARNs for <code>AnnotationConsolidationLambdaArn</code>. For custom labeling workflows, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step3.html#sms-custom-templates-step3-postlambda">Post-annotation Lambda</a>. </p>
        /// <p> <b>Bounding box</b> - Finds the most similar boxes from different workers based on the Jaccard index of the boxes.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-BoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-BoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label image classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of an image based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-ImageMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic segmentation</b> - Treats each pixel in an image as a multi-class classification and treats pixel annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-SemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-SemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Multi-label text classification</b> - Uses a variant of the Expectation Maximization approach to estimate the true classes of text based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-TextMultiClassMultiLabel</code> </p> </li>
        /// </ul>
        /// <p> <b>Named entity recognition</b> - Groups similar selections and calculates aggregate boundaries, resolving to most-assigned label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-NamedEntityRecognition</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Classification</b> - Use this task type when you need workers to classify videos using predefined labels that you specify. Workers are shown videos and are asked to choose one label for each video.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoMultiClass</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoMultiClass</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection</b> - Use this task type to have workers identify and locate objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to identify and localize various objects in a series of video frames, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking</b> - Use this task type to have workers track the movement of objects in a sequence of video frames (images extracted from a video) using bounding boxes. For example, you can use this task to ask workers to track the movement of objects, such as cars, bikes, and pedestrians. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Detection</b> - Use this task type when you want workers to classify objects in a 3D point cloud by drawing 3D cuboids around objects. For example, you can use this task type to ask workers to identify different types of objects in a point cloud, such as cars, bikes, and pedestrians.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Tracking</b> - Use this task type when you want workers to draw 3D cuboids around objects that appear in a sequence of 3D point cloud frames. For example, you can use this task type to ask workers to track the movement of vehicles across multiple point cloud frames. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Semantic Segmentation</b> - Use this task type when you want workers to create a point-level semantic segmentation masks by painting objects in a 3D point cloud using different colors where each color is assigned to one of the classes you specify.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Use the following ARNs for Label Verification and Adjustment Jobs</b> </p>
        /// <p>Use label verification and adjustment jobs to review and adjust labels. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-verification-data.html">Verify and Adjust Labels </a>.</p>
        /// <p> <b>Semantic Segmentation Adjustment</b> - Treats each pixel in an image as a multi-class classification and treats pixel adjusted annotations from workers as "votes" for the correct label.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Semantic Segmentation Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgment for semantic segmentation labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Bounding Box Adjustment</b> - Finds the most similar boxes from different workers based on the Jaccard index of the adjusted annotations.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Bounding Box Verification</b> - Uses a variant of the Expectation Maximization approach to estimate the true class of verification judgement for bounding box labels based on annotations from individual workers.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-VerificationBoundingBox</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Detection Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to classify and localize objects in a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame Object Tracking Adjustment</b> - Use this task type when you want workers to adjust bounding boxes that workers have added to video frames to track object movement across a sequence of video frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-AdjustmentVideoObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Detection Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects in a 3D point cloud. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Object Tracking Adjustment</b> - Use this task type when you want workers to adjust 3D cuboids around objects that appear in a sequence of 3D point cloud frames.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> <b>3D Point Cloud Semantic Segmentation Adjustment</b> - Use this task type when you want workers to adjust a point-level semantic segmentation masks using a paint tool.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-1:432418664414:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-east-2:266458841044:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:us-west-2:081040173940:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-1:568282634449:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-1:477331159723:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-2:454466003867:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-south-1:565803892007:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-central-1:203001061592:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-northeast-2:845288260483:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:eu-west-2:487402164563:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ap-southeast-1:377565633583:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// <li> <p> <code>arn:aws:lambda:ca-central-1:918755190332:function:ACS-Adjustment3DPointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        pub fn set_annotation_consolidation_lambda_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.annotation_consolidation_lambda_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`AnnotationConsolidationConfig`](crate::model::AnnotationConsolidationConfig).
        pub fn build(self) -> crate::model::AnnotationConsolidationConfig {
            crate::model::AnnotationConsolidationConfig {
                annotation_consolidation_lambda_arn: self.annotation_consolidation_lambda_arn,
            }
        }
    }
}
impl AnnotationConsolidationConfig {
    /// Creates a new builder-style object to manufacture [`AnnotationConsolidationConfig`](crate::model::AnnotationConsolidationConfig).
    pub fn builder() -> crate::model::annotation_consolidation_config::Builder {
        crate::model::annotation_consolidation_config::Builder::default()
    }
}

/// <p>Provided configuration information for the worker UI for a labeling job. Provide either <code>HumanTaskUiArn</code> or <code>UiTemplateS3Uri</code>.</p>
/// <p>For named entity recognition, 3D point cloud and video frame labeling jobs, use <code>HumanTaskUiArn</code>.</p>
/// <p>For all other Ground Truth built-in task types and custom task types, use <code>UiTemplateS3Uri</code> to specify the location of a worker task template in Amazon S3.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct UiConfig {
    /// <p>The Amazon S3 bucket location of the UI template, or worker task template. This is the template used to render the worker UI and tools for labeling job tasks. For more information about the contents of a UI template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step2.html"> Creating Your Custom Labeling Task Template</a>.</p>
    #[doc(hidden)]
    pub ui_template_s3_uri: std::option::Option<std::string::String>,
    /// <p>The ARN of the worker task template used to render the worker UI and tools for labeling job tasks.</p>
    /// <p>Use this parameter when you are creating a labeling job for named entity recognition, 3D point cloud and video frame labeling jobs. Use your labeling job task type to select one of the following ARNs and use it with this parameter when you create a labeling job. Replace <code>aws-region</code> with the Amazon Web Services Region you are creating your labeling job in. For example, replace <code>aws-region</code> with <code>us-west-1</code> if you create a labeling job in US West (N. California).</p>
    /// <p> <b>Named Entity Recognition</b> </p>
    /// <p>Use the following <code>HumanTaskUiArn</code> for named entity recognition labeling jobs:</p>
    /// <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/NamedEntityRecognition</code> </p>
    /// <p> <b>3D Point Cloud HumanTaskUiArns</b> </p>
    /// <p>Use this <code>HumanTaskUiArn</code> for 3D point cloud object detection and 3D point cloud object detection adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud object tracking and 3D point cloud object tracking adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud semantic segmentation and 3D point cloud semantic segmentation adjustment labeling jobs.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame HumanTaskUiArns</b> </p>
    /// <p>Use this <code>HumanTaskUiArn</code> for video frame object detection and video frame object detection adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:region:394669845002:human-task-ui/VideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> Use this <code>HumanTaskUiArn</code> for video frame object tracking and video frame object tracking adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/VideoObjectTracking</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub human_task_ui_arn: std::option::Option<std::string::String>,
}
impl UiConfig {
    /// <p>The Amazon S3 bucket location of the UI template, or worker task template. This is the template used to render the worker UI and tools for labeling job tasks. For more information about the contents of a UI template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step2.html"> Creating Your Custom Labeling Task Template</a>.</p>
    pub fn ui_template_s3_uri(&self) -> std::option::Option<&str> {
        self.ui_template_s3_uri.as_deref()
    }
    /// <p>The ARN of the worker task template used to render the worker UI and tools for labeling job tasks.</p>
    /// <p>Use this parameter when you are creating a labeling job for named entity recognition, 3D point cloud and video frame labeling jobs. Use your labeling job task type to select one of the following ARNs and use it with this parameter when you create a labeling job. Replace <code>aws-region</code> with the Amazon Web Services Region you are creating your labeling job in. For example, replace <code>aws-region</code> with <code>us-west-1</code> if you create a labeling job in US West (N. California).</p>
    /// <p> <b>Named Entity Recognition</b> </p>
    /// <p>Use the following <code>HumanTaskUiArn</code> for named entity recognition labeling jobs:</p>
    /// <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/NamedEntityRecognition</code> </p>
    /// <p> <b>3D Point Cloud HumanTaskUiArns</b> </p>
    /// <p>Use this <code>HumanTaskUiArn</code> for 3D point cloud object detection and 3D point cloud object detection adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud object tracking and 3D point cloud object tracking adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectTracking</code> </p> </li>
    /// </ul>
    /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud semantic segmentation and 3D point cloud semantic segmentation adjustment labeling jobs.</p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudSemanticSegmentation</code> </p> </li>
    /// </ul>
    /// <p> <b>Video Frame HumanTaskUiArns</b> </p>
    /// <p>Use this <code>HumanTaskUiArn</code> for video frame object detection and video frame object detection adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:region:394669845002:human-task-ui/VideoObjectDetection</code> </p> </li>
    /// </ul>
    /// <p> Use this <code>HumanTaskUiArn</code> for video frame object tracking and video frame object tracking adjustment labeling jobs. </p>
    /// <ul>
    /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/VideoObjectTracking</code> </p> </li>
    /// </ul>
    pub fn human_task_ui_arn(&self) -> std::option::Option<&str> {
        self.human_task_ui_arn.as_deref()
    }
}
/// See [`UiConfig`](crate::model::UiConfig).
pub mod ui_config {

    /// A builder for [`UiConfig`](crate::model::UiConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) ui_template_s3_uri: std::option::Option<std::string::String>,
        pub(crate) human_task_ui_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 bucket location of the UI template, or worker task template. This is the template used to render the worker UI and tools for labeling job tasks. For more information about the contents of a UI template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step2.html"> Creating Your Custom Labeling Task Template</a>.</p>
        pub fn ui_template_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.ui_template_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 bucket location of the UI template, or worker task template. This is the template used to render the worker UI and tools for labeling job tasks. For more information about the contents of a UI template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-custom-templates-step2.html"> Creating Your Custom Labeling Task Template</a>.</p>
        pub fn set_ui_template_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.ui_template_s3_uri = input;
            self
        }
        /// <p>The ARN of the worker task template used to render the worker UI and tools for labeling job tasks.</p>
        /// <p>Use this parameter when you are creating a labeling job for named entity recognition, 3D point cloud and video frame labeling jobs. Use your labeling job task type to select one of the following ARNs and use it with this parameter when you create a labeling job. Replace <code>aws-region</code> with the Amazon Web Services Region you are creating your labeling job in. For example, replace <code>aws-region</code> with <code>us-west-1</code> if you create a labeling job in US West (N. California).</p>
        /// <p> <b>Named Entity Recognition</b> </p>
        /// <p>Use the following <code>HumanTaskUiArn</code> for named entity recognition labeling jobs:</p>
        /// <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/NamedEntityRecognition</code> </p>
        /// <p> <b>3D Point Cloud HumanTaskUiArns</b> </p>
        /// <p>Use this <code>HumanTaskUiArn</code> for 3D point cloud object detection and 3D point cloud object detection adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud object tracking and 3D point cloud object tracking adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud semantic segmentation and 3D point cloud semantic segmentation adjustment labeling jobs.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame HumanTaskUiArns</b> </p>
        /// <p>Use this <code>HumanTaskUiArn</code> for video frame object detection and video frame object detection adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:region:394669845002:human-task-ui/VideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> Use this <code>HumanTaskUiArn</code> for video frame object tracking and video frame object tracking adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/VideoObjectTracking</code> </p> </li>
        /// </ul>
        pub fn human_task_ui_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.human_task_ui_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the worker task template used to render the worker UI and tools for labeling job tasks.</p>
        /// <p>Use this parameter when you are creating a labeling job for named entity recognition, 3D point cloud and video frame labeling jobs. Use your labeling job task type to select one of the following ARNs and use it with this parameter when you create a labeling job. Replace <code>aws-region</code> with the Amazon Web Services Region you are creating your labeling job in. For example, replace <code>aws-region</code> with <code>us-west-1</code> if you create a labeling job in US West (N. California).</p>
        /// <p> <b>Named Entity Recognition</b> </p>
        /// <p>Use the following <code>HumanTaskUiArn</code> for named entity recognition labeling jobs:</p>
        /// <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/NamedEntityRecognition</code> </p>
        /// <p> <b>3D Point Cloud HumanTaskUiArns</b> </p>
        /// <p>Use this <code>HumanTaskUiArn</code> for 3D point cloud object detection and 3D point cloud object detection adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud object tracking and 3D point cloud object tracking adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudObjectTracking</code> </p> </li>
        /// </ul>
        /// <p> Use this <code>HumanTaskUiArn</code> for 3D point cloud semantic segmentation and 3D point cloud semantic segmentation adjustment labeling jobs.</p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/PointCloudSemanticSegmentation</code> </p> </li>
        /// </ul>
        /// <p> <b>Video Frame HumanTaskUiArns</b> </p>
        /// <p>Use this <code>HumanTaskUiArn</code> for video frame object detection and video frame object detection adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:region:394669845002:human-task-ui/VideoObjectDetection</code> </p> </li>
        /// </ul>
        /// <p> Use this <code>HumanTaskUiArn</code> for video frame object tracking and video frame object tracking adjustment labeling jobs. </p>
        /// <ul>
        /// <li> <p> <code>arn:aws:sagemaker:aws-region:394669845002:human-task-ui/VideoObjectTracking</code> </p> </li>
        /// </ul>
        pub fn set_human_task_ui_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.human_task_ui_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`UiConfig`](crate::model::UiConfig).
        pub fn build(self) -> crate::model::UiConfig {
            crate::model::UiConfig {
                ui_template_s3_uri: self.ui_template_s3_uri,
                human_task_ui_arn: self.human_task_ui_arn,
            }
        }
    }
}
impl UiConfig {
    /// Creates a new builder-style object to manufacture [`UiConfig`](crate::model::UiConfig).
    pub fn builder() -> crate::model::ui_config::Builder {
        crate::model::ui_config::Builder::default()
    }
}

/// <p>Provides configuration information for auto-labeling of your data objects. A <code>LabelingJobAlgorithmsConfig</code> object must be supplied in order to use auto-labeling.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobAlgorithmsConfig {
    /// <p>Specifies the Amazon Resource Name (ARN) of the algorithm used for auto-labeling. You must select one of the following ARNs:</p>
    /// <ul>
    /// <li> <p> <i>Image classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/image-classification</code> </p> </li>
    /// <li> <p> <i>Text classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/text-classification</code> </p> </li>
    /// <li> <p> <i>Object detection</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/object-detection</code> </p> </li>
    /// <li> <p> <i>Semantic Segmentation</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/semantic-segmentation</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub labeling_job_algorithm_specification_arn: std::option::Option<std::string::String>,
    /// <p>At the end of an auto-label job Ground Truth sends the Amazon Resource Name (ARN) of the final model used for auto-labeling. You can use this model as the starting point for subsequent similar jobs by providing the ARN of the model here. </p>
    #[doc(hidden)]
    pub initial_active_learning_model_arn: std::option::Option<std::string::String>,
    /// <p>Provides configuration information for a labeling job.</p>
    #[doc(hidden)]
    pub labeling_job_resource_config: std::option::Option<crate::model::LabelingJobResourceConfig>,
}
impl LabelingJobAlgorithmsConfig {
    /// <p>Specifies the Amazon Resource Name (ARN) of the algorithm used for auto-labeling. You must select one of the following ARNs:</p>
    /// <ul>
    /// <li> <p> <i>Image classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/image-classification</code> </p> </li>
    /// <li> <p> <i>Text classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/text-classification</code> </p> </li>
    /// <li> <p> <i>Object detection</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/object-detection</code> </p> </li>
    /// <li> <p> <i>Semantic Segmentation</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/semantic-segmentation</code> </p> </li>
    /// </ul>
    pub fn labeling_job_algorithm_specification_arn(&self) -> std::option::Option<&str> {
        self.labeling_job_algorithm_specification_arn.as_deref()
    }
    /// <p>At the end of an auto-label job Ground Truth sends the Amazon Resource Name (ARN) of the final model used for auto-labeling. You can use this model as the starting point for subsequent similar jobs by providing the ARN of the model here. </p>
    pub fn initial_active_learning_model_arn(&self) -> std::option::Option<&str> {
        self.initial_active_learning_model_arn.as_deref()
    }
    /// <p>Provides configuration information for a labeling job.</p>
    pub fn labeling_job_resource_config(
        &self,
    ) -> std::option::Option<&crate::model::LabelingJobResourceConfig> {
        self.labeling_job_resource_config.as_ref()
    }
}
/// See [`LabelingJobAlgorithmsConfig`](crate::model::LabelingJobAlgorithmsConfig).
pub mod labeling_job_algorithms_config {

    /// A builder for [`LabelingJobAlgorithmsConfig`](crate::model::LabelingJobAlgorithmsConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) labeling_job_algorithm_specification_arn:
            std::option::Option<std::string::String>,
        pub(crate) initial_active_learning_model_arn: std::option::Option<std::string::String>,
        pub(crate) labeling_job_resource_config:
            std::option::Option<crate::model::LabelingJobResourceConfig>,
    }
    impl Builder {
        /// <p>Specifies the Amazon Resource Name (ARN) of the algorithm used for auto-labeling. You must select one of the following ARNs:</p>
        /// <ul>
        /// <li> <p> <i>Image classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/image-classification</code> </p> </li>
        /// <li> <p> <i>Text classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/text-classification</code> </p> </li>
        /// <li> <p> <i>Object detection</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/object-detection</code> </p> </li>
        /// <li> <p> <i>Semantic Segmentation</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/semantic-segmentation</code> </p> </li>
        /// </ul>
        pub fn labeling_job_algorithm_specification_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.labeling_job_algorithm_specification_arn = Some(input.into());
            self
        }
        /// <p>Specifies the Amazon Resource Name (ARN) of the algorithm used for auto-labeling. You must select one of the following ARNs:</p>
        /// <ul>
        /// <li> <p> <i>Image classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/image-classification</code> </p> </li>
        /// <li> <p> <i>Text classification</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/text-classification</code> </p> </li>
        /// <li> <p> <i>Object detection</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/object-detection</code> </p> </li>
        /// <li> <p> <i>Semantic Segmentation</i> </p> <p> <code>arn:aws:sagemaker:<i>region</i>:027400017018:labeling-job-algorithm-specification/semantic-segmentation</code> </p> </li>
        /// </ul>
        pub fn set_labeling_job_algorithm_specification_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.labeling_job_algorithm_specification_arn = input;
            self
        }
        /// <p>At the end of an auto-label job Ground Truth sends the Amazon Resource Name (ARN) of the final model used for auto-labeling. You can use this model as the starting point for subsequent similar jobs by providing the ARN of the model here. </p>
        pub fn initial_active_learning_model_arn(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.initial_active_learning_model_arn = Some(input.into());
            self
        }
        /// <p>At the end of an auto-label job Ground Truth sends the Amazon Resource Name (ARN) of the final model used for auto-labeling. You can use this model as the starting point for subsequent similar jobs by providing the ARN of the model here. </p>
        pub fn set_initial_active_learning_model_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.initial_active_learning_model_arn = input;
            self
        }
        /// <p>Provides configuration information for a labeling job.</p>
        pub fn labeling_job_resource_config(
            mut self,
            input: crate::model::LabelingJobResourceConfig,
        ) -> Self {
            self.labeling_job_resource_config = Some(input);
            self
        }
        /// <p>Provides configuration information for a labeling job.</p>
        pub fn set_labeling_job_resource_config(
            mut self,
            input: std::option::Option<crate::model::LabelingJobResourceConfig>,
        ) -> Self {
            self.labeling_job_resource_config = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobAlgorithmsConfig`](crate::model::LabelingJobAlgorithmsConfig).
        pub fn build(self) -> crate::model::LabelingJobAlgorithmsConfig {
            crate::model::LabelingJobAlgorithmsConfig {
                labeling_job_algorithm_specification_arn: self
                    .labeling_job_algorithm_specification_arn,
                initial_active_learning_model_arn: self.initial_active_learning_model_arn,
                labeling_job_resource_config: self.labeling_job_resource_config,
            }
        }
    }
}
impl LabelingJobAlgorithmsConfig {
    /// Creates a new builder-style object to manufacture [`LabelingJobAlgorithmsConfig`](crate::model::LabelingJobAlgorithmsConfig).
    pub fn builder() -> crate::model::labeling_job_algorithms_config::Builder {
        crate::model::labeling_job_algorithms_config::Builder::default()
    }
}

/// <p>Configure encryption on the storage volume attached to the ML compute instance used to run automated data labeling model training and inference. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobResourceConfig {
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training and inference jobs used for automated data labeling. </p>
    /// <p>You can only specify a <code>VolumeKmsKeyId</code> when you create a labeling job with automated data labeling enabled using the API operation <code>CreateLabelingJob</code>. You cannot specify an Amazon Web Services KMS key to encrypt the storage volume used for automated data labeling model training and inference when you create a labeling job using the console. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security.html">Output Data and Storage Volume Encryption</a>.</p>
    /// <p>The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
}
impl LabelingJobResourceConfig {
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training and inference jobs used for automated data labeling. </p>
    /// <p>You can only specify a <code>VolumeKmsKeyId</code> when you create a labeling job with automated data labeling enabled using the API operation <code>CreateLabelingJob</code>. You cannot specify an Amazon Web Services KMS key to encrypt the storage volume used for automated data labeling model training and inference when you create a labeling job using the console. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security.html">Output Data and Storage Volume Encryption</a>.</p>
    /// <p>The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// </ul>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
    /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
}
/// See [`LabelingJobResourceConfig`](crate::model::LabelingJobResourceConfig).
pub mod labeling_job_resource_config {

    /// A builder for [`LabelingJobResourceConfig`](crate::model::LabelingJobResourceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
    }
    impl Builder {
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training and inference jobs used for automated data labeling. </p>
        /// <p>You can only specify a <code>VolumeKmsKeyId</code> when you create a labeling job with automated data labeling enabled using the API operation <code>CreateLabelingJob</code>. You cannot specify an Amazon Web Services KMS key to encrypt the storage volume used for automated data labeling model training and inference when you create a labeling job using the console. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security.html">Output Data and Storage Volume Encryption</a>.</p>
        /// <p>The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// </ul>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the training and inference jobs used for automated data labeling. </p>
        /// <p>You can only specify a <code>VolumeKmsKeyId</code> when you create a labeling job with automated data labeling enabled using the API operation <code>CreateLabelingJob</code>. You cannot specify an Amazon Web Services KMS key to encrypt the storage volume used for automated data labeling model training and inference when you create a labeling job using the console. To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security.html">Output Data and Storage Volume Encryption</a>.</p>
        /// <p>The <code>VolumeKmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// </ul>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html">Protect Endpoints by Using an Amazon Virtual Private Cloud</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html">Protect Training Jobs by Using an Amazon Virtual Private Cloud</a>. </p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobResourceConfig`](crate::model::LabelingJobResourceConfig).
        pub fn build(self) -> crate::model::LabelingJobResourceConfig {
            crate::model::LabelingJobResourceConfig {
                volume_kms_key_id: self.volume_kms_key_id,
                vpc_config: self.vpc_config,
            }
        }
    }
}
impl LabelingJobResourceConfig {
    /// Creates a new builder-style object to manufacture [`LabelingJobResourceConfig`](crate::model::LabelingJobResourceConfig).
    pub fn builder() -> crate::model::labeling_job_resource_config::Builder {
        crate::model::labeling_job_resource_config::Builder::default()
    }
}

/// <p>A set of conditions for stopping a labeling job. If any of the conditions are met, the job is automatically stopped. You can use these conditions to control the cost of data labeling.</p> <note>
/// <p>Labeling jobs fail after 30 days with an appropriate client error message.</p>
/// </note>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobStoppingConditions {
    /// <p>The maximum number of objects that can be labeled by human workers.</p>
    #[doc(hidden)]
    pub max_human_labeled_object_count: std::option::Option<i32>,
    /// <p>The maximum number of input data objects that should be labeled.</p>
    #[doc(hidden)]
    pub max_percentage_of_input_dataset_labeled: std::option::Option<i32>,
}
impl LabelingJobStoppingConditions {
    /// <p>The maximum number of objects that can be labeled by human workers.</p>
    pub fn max_human_labeled_object_count(&self) -> std::option::Option<i32> {
        self.max_human_labeled_object_count
    }
    /// <p>The maximum number of input data objects that should be labeled.</p>
    pub fn max_percentage_of_input_dataset_labeled(&self) -> std::option::Option<i32> {
        self.max_percentage_of_input_dataset_labeled
    }
}
/// See [`LabelingJobStoppingConditions`](crate::model::LabelingJobStoppingConditions).
pub mod labeling_job_stopping_conditions {

    /// A builder for [`LabelingJobStoppingConditions`](crate::model::LabelingJobStoppingConditions).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_human_labeled_object_count: std::option::Option<i32>,
        pub(crate) max_percentage_of_input_dataset_labeled: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The maximum number of objects that can be labeled by human workers.</p>
        pub fn max_human_labeled_object_count(mut self, input: i32) -> Self {
            self.max_human_labeled_object_count = Some(input);
            self
        }
        /// <p>The maximum number of objects that can be labeled by human workers.</p>
        pub fn set_max_human_labeled_object_count(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.max_human_labeled_object_count = input;
            self
        }
        /// <p>The maximum number of input data objects that should be labeled.</p>
        pub fn max_percentage_of_input_dataset_labeled(mut self, input: i32) -> Self {
            self.max_percentage_of_input_dataset_labeled = Some(input);
            self
        }
        /// <p>The maximum number of input data objects that should be labeled.</p>
        pub fn set_max_percentage_of_input_dataset_labeled(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.max_percentage_of_input_dataset_labeled = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobStoppingConditions`](crate::model::LabelingJobStoppingConditions).
        pub fn build(self) -> crate::model::LabelingJobStoppingConditions {
            crate::model::LabelingJobStoppingConditions {
                max_human_labeled_object_count: self.max_human_labeled_object_count,
                max_percentage_of_input_dataset_labeled: self
                    .max_percentage_of_input_dataset_labeled,
            }
        }
    }
}
impl LabelingJobStoppingConditions {
    /// Creates a new builder-style object to manufacture [`LabelingJobStoppingConditions`](crate::model::LabelingJobStoppingConditions).
    pub fn builder() -> crate::model::labeling_job_stopping_conditions::Builder {
        crate::model::labeling_job_stopping_conditions::Builder::default()
    }
}

/// <p>Output configuration information for a labeling job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct LabelingJobOutputConfig {
    /// <p>The Amazon S3 location to write output data.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service ID of the key used to encrypt the output data, if any.</p>
    /// <p>If you provide your own KMS key ID, you must add the required permissions to your KMS key described in <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-permission.html#sms-security-kms-permissions">Encrypt Output Data and Storage Volume with Amazon Web Services KMS</a>.</p>
    /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default Amazon Web Services KMS key for Amazon S3 for your role's account to encrypt your output data.</p>
    /// <p>If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>An Amazon Simple Notification Service (Amazon SNS) output topic ARN. Provide a <code>SnsTopicArn</code> if you want to do real time chaining to another streaming job and receive an Amazon SNS notifications each time a data object is submitted by a worker.</p>
    /// <p>If you provide an <code>SnsTopicArn</code> in <code>OutputConfig</code>, when workers complete labeling tasks, Ground Truth will send labeling task output data to the SNS output topic you specify here. </p>
    /// <p>To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-output-data">Receive Output Data from a Streaming Labeling Job</a>. </p>
    #[doc(hidden)]
    pub sns_topic_arn: std::option::Option<std::string::String>,
}
impl LabelingJobOutputConfig {
    /// <p>The Amazon S3 location to write output data.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service ID of the key used to encrypt the output data, if any.</p>
    /// <p>If you provide your own KMS key ID, you must add the required permissions to your KMS key described in <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-permission.html#sms-security-kms-permissions">Encrypt Output Data and Storage Volume with Amazon Web Services KMS</a>.</p>
    /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default Amazon Web Services KMS key for Amazon S3 for your role's account to encrypt your output data.</p>
    /// <p>If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>An Amazon Simple Notification Service (Amazon SNS) output topic ARN. Provide a <code>SnsTopicArn</code> if you want to do real time chaining to another streaming job and receive an Amazon SNS notifications each time a data object is submitted by a worker.</p>
    /// <p>If you provide an <code>SnsTopicArn</code> in <code>OutputConfig</code>, when workers complete labeling tasks, Ground Truth will send labeling task output data to the SNS output topic you specify here. </p>
    /// <p>To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-output-data">Receive Output Data from a Streaming Labeling Job</a>. </p>
    pub fn sns_topic_arn(&self) -> std::option::Option<&str> {
        self.sns_topic_arn.as_deref()
    }
}
/// See [`LabelingJobOutputConfig`](crate::model::LabelingJobOutputConfig).
pub mod labeling_job_output_config {

    /// A builder for [`LabelingJobOutputConfig`](crate::model::LabelingJobOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) sns_topic_arn: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 location to write output data.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location to write output data.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service ID of the key used to encrypt the output data, if any.</p>
        /// <p>If you provide your own KMS key ID, you must add the required permissions to your KMS key described in <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-permission.html#sms-security-kms-permissions">Encrypt Output Data and Storage Volume with Amazon Web Services KMS</a>.</p>
        /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default Amazon Web Services KMS key for Amazon S3 for your role's account to encrypt your output data.</p>
        /// <p>If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service ID of the key used to encrypt the output data, if any.</p>
        /// <p>If you provide your own KMS key ID, you must add the required permissions to your KMS key described in <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-security-permission.html#sms-security-kms-permissions">Encrypt Output Data and Storage Volume with Amazon Web Services KMS</a>.</p>
        /// <p>If you don't provide a KMS key ID, Amazon SageMaker uses the default Amazon Web Services KMS key for Amazon S3 for your role's account to encrypt your output data.</p>
        /// <p>If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>An Amazon Simple Notification Service (Amazon SNS) output topic ARN. Provide a <code>SnsTopicArn</code> if you want to do real time chaining to another streaming job and receive an Amazon SNS notifications each time a data object is submitted by a worker.</p>
        /// <p>If you provide an <code>SnsTopicArn</code> in <code>OutputConfig</code>, when workers complete labeling tasks, Ground Truth will send labeling task output data to the SNS output topic you specify here. </p>
        /// <p>To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-output-data">Receive Output Data from a Streaming Labeling Job</a>. </p>
        pub fn sns_topic_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.sns_topic_arn = Some(input.into());
            self
        }
        /// <p>An Amazon Simple Notification Service (Amazon SNS) output topic ARN. Provide a <code>SnsTopicArn</code> if you want to do real time chaining to another streaming job and receive an Amazon SNS notifications each time a data object is submitted by a worker.</p>
        /// <p>If you provide an <code>SnsTopicArn</code> in <code>OutputConfig</code>, when workers complete labeling tasks, Ground Truth will send labeling task output data to the SNS output topic you specify here. </p>
        /// <p>To learn more, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-streaming-labeling-job.html#sms-streaming-how-it-works-output-data">Receive Output Data from a Streaming Labeling Job</a>. </p>
        pub fn set_sns_topic_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sns_topic_arn = input;
            self
        }
        /// Consumes the builder and constructs a [`LabelingJobOutputConfig`](crate::model::LabelingJobOutputConfig).
        pub fn build(self) -> crate::model::LabelingJobOutputConfig {
            crate::model::LabelingJobOutputConfig {
                s3_output_path: self.s3_output_path,
                kms_key_id: self.kms_key_id,
                sns_topic_arn: self.sns_topic_arn,
            }
        }
    }
}
impl LabelingJobOutputConfig {
    /// Creates a new builder-style object to manufacture [`LabelingJobOutputConfig`](crate::model::LabelingJobOutputConfig).
    pub fn builder() -> crate::model::labeling_job_output_config::Builder {
        crate::model::labeling_job_output_config::Builder::default()
    }
}

/// <p>The performance results from running an Inference Recommender job on an existing endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointPerformance {
    /// <p>The metrics for an existing endpoint.</p>
    #[doc(hidden)]
    pub metrics: std::option::Option<crate::model::InferenceMetrics>,
    /// <p>Details about a customer endpoint that was compared in an Inference Recommender job.</p>
    #[doc(hidden)]
    pub endpoint_info: std::option::Option<crate::model::EndpointInfo>,
}
impl EndpointPerformance {
    /// <p>The metrics for an existing endpoint.</p>
    pub fn metrics(&self) -> std::option::Option<&crate::model::InferenceMetrics> {
        self.metrics.as_ref()
    }
    /// <p>Details about a customer endpoint that was compared in an Inference Recommender job.</p>
    pub fn endpoint_info(&self) -> std::option::Option<&crate::model::EndpointInfo> {
        self.endpoint_info.as_ref()
    }
}
/// See [`EndpointPerformance`](crate::model::EndpointPerformance).
pub mod endpoint_performance {

    /// A builder for [`EndpointPerformance`](crate::model::EndpointPerformance).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metrics: std::option::Option<crate::model::InferenceMetrics>,
        pub(crate) endpoint_info: std::option::Option<crate::model::EndpointInfo>,
    }
    impl Builder {
        /// <p>The metrics for an existing endpoint.</p>
        pub fn metrics(mut self, input: crate::model::InferenceMetrics) -> Self {
            self.metrics = Some(input);
            self
        }
        /// <p>The metrics for an existing endpoint.</p>
        pub fn set_metrics(
            mut self,
            input: std::option::Option<crate::model::InferenceMetrics>,
        ) -> Self {
            self.metrics = input;
            self
        }
        /// <p>Details about a customer endpoint that was compared in an Inference Recommender job.</p>
        pub fn endpoint_info(mut self, input: crate::model::EndpointInfo) -> Self {
            self.endpoint_info = Some(input);
            self
        }
        /// <p>Details about a customer endpoint that was compared in an Inference Recommender job.</p>
        pub fn set_endpoint_info(
            mut self,
            input: std::option::Option<crate::model::EndpointInfo>,
        ) -> Self {
            self.endpoint_info = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointPerformance`](crate::model::EndpointPerformance).
        pub fn build(self) -> crate::model::EndpointPerformance {
            crate::model::EndpointPerformance {
                metrics: self.metrics,
                endpoint_info: self.endpoint_info,
            }
        }
    }
}
impl EndpointPerformance {
    /// Creates a new builder-style object to manufacture [`EndpointPerformance`](crate::model::EndpointPerformance).
    pub fn builder() -> crate::model::endpoint_performance::Builder {
        crate::model::endpoint_performance::Builder::default()
    }
}

/// <p>Details about a customer endpoint that was compared in an Inference Recommender job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointInfo {
    /// <p>The name of a customer's endpoint.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
}
impl EndpointInfo {
    /// <p>The name of a customer's endpoint.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
}
/// See [`EndpointInfo`](crate::model::EndpointInfo).
pub mod endpoint_info {

    /// A builder for [`EndpointInfo`](crate::model::EndpointInfo).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of a customer's endpoint.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of a customer's endpoint.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointInfo`](crate::model::EndpointInfo).
        pub fn build(self) -> crate::model::EndpointInfo {
            crate::model::EndpointInfo {
                endpoint_name: self.endpoint_name,
            }
        }
    }
}
impl EndpointInfo {
    /// Creates a new builder-style object to manufacture [`EndpointInfo`](crate::model::EndpointInfo).
    pub fn builder() -> crate::model::endpoint_info::Builder {
        crate::model::endpoint_info::Builder::default()
    }
}

/// <p>The metrics for an existing endpoint compared in an Inference Recommender job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceMetrics {
    /// <p>The expected maximum number of requests per minute for the instance.</p>
    #[doc(hidden)]
    pub max_invocations: i32,
    /// <p>The expected model latency at maximum invocations per minute for the instance.</p>
    #[doc(hidden)]
    pub model_latency: i32,
}
impl InferenceMetrics {
    /// <p>The expected maximum number of requests per minute for the instance.</p>
    pub fn max_invocations(&self) -> i32 {
        self.max_invocations
    }
    /// <p>The expected model latency at maximum invocations per minute for the instance.</p>
    pub fn model_latency(&self) -> i32 {
        self.model_latency
    }
}
/// See [`InferenceMetrics`](crate::model::InferenceMetrics).
pub mod inference_metrics {

    /// A builder for [`InferenceMetrics`](crate::model::InferenceMetrics).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_invocations: std::option::Option<i32>,
        pub(crate) model_latency: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The expected maximum number of requests per minute for the instance.</p>
        pub fn max_invocations(mut self, input: i32) -> Self {
            self.max_invocations = Some(input);
            self
        }
        /// <p>The expected maximum number of requests per minute for the instance.</p>
        pub fn set_max_invocations(mut self, input: std::option::Option<i32>) -> Self {
            self.max_invocations = input;
            self
        }
        /// <p>The expected model latency at maximum invocations per minute for the instance.</p>
        pub fn model_latency(mut self, input: i32) -> Self {
            self.model_latency = Some(input);
            self
        }
        /// <p>The expected model latency at maximum invocations per minute for the instance.</p>
        pub fn set_model_latency(mut self, input: std::option::Option<i32>) -> Self {
            self.model_latency = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceMetrics`](crate::model::InferenceMetrics).
        pub fn build(self) -> crate::model::InferenceMetrics {
            crate::model::InferenceMetrics {
                max_invocations: self.max_invocations.unwrap_or_default(),
                model_latency: self.model_latency.unwrap_or_default(),
            }
        }
    }
}
impl InferenceMetrics {
    /// Creates a new builder-style object to manufacture [`InferenceMetrics`](crate::model::InferenceMetrics).
    pub fn builder() -> crate::model::inference_metrics::Builder {
        crate::model::inference_metrics::Builder::default()
    }
}

/// <p>A list of recommendations made by Amazon SageMaker Inference Recommender.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InferenceRecommendation {
    /// <p>The metrics used to decide what recommendation to make.</p>
    #[doc(hidden)]
    pub metrics: std::option::Option<crate::model::RecommendationMetrics>,
    /// <p>Defines the endpoint configuration parameters.</p>
    #[doc(hidden)]
    pub endpoint_configuration: std::option::Option<crate::model::EndpointOutputConfiguration>,
    /// <p>Defines the model configuration.</p>
    #[doc(hidden)]
    pub model_configuration: std::option::Option<crate::model::ModelConfiguration>,
}
impl InferenceRecommendation {
    /// <p>The metrics used to decide what recommendation to make.</p>
    pub fn metrics(&self) -> std::option::Option<&crate::model::RecommendationMetrics> {
        self.metrics.as_ref()
    }
    /// <p>Defines the endpoint configuration parameters.</p>
    pub fn endpoint_configuration(
        &self,
    ) -> std::option::Option<&crate::model::EndpointOutputConfiguration> {
        self.endpoint_configuration.as_ref()
    }
    /// <p>Defines the model configuration.</p>
    pub fn model_configuration(&self) -> std::option::Option<&crate::model::ModelConfiguration> {
        self.model_configuration.as_ref()
    }
}
/// See [`InferenceRecommendation`](crate::model::InferenceRecommendation).
pub mod inference_recommendation {

    /// A builder for [`InferenceRecommendation`](crate::model::InferenceRecommendation).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metrics: std::option::Option<crate::model::RecommendationMetrics>,
        pub(crate) endpoint_configuration:
            std::option::Option<crate::model::EndpointOutputConfiguration>,
        pub(crate) model_configuration: std::option::Option<crate::model::ModelConfiguration>,
    }
    impl Builder {
        /// <p>The metrics used to decide what recommendation to make.</p>
        pub fn metrics(mut self, input: crate::model::RecommendationMetrics) -> Self {
            self.metrics = Some(input);
            self
        }
        /// <p>The metrics used to decide what recommendation to make.</p>
        pub fn set_metrics(
            mut self,
            input: std::option::Option<crate::model::RecommendationMetrics>,
        ) -> Self {
            self.metrics = input;
            self
        }
        /// <p>Defines the endpoint configuration parameters.</p>
        pub fn endpoint_configuration(
            mut self,
            input: crate::model::EndpointOutputConfiguration,
        ) -> Self {
            self.endpoint_configuration = Some(input);
            self
        }
        /// <p>Defines the endpoint configuration parameters.</p>
        pub fn set_endpoint_configuration(
            mut self,
            input: std::option::Option<crate::model::EndpointOutputConfiguration>,
        ) -> Self {
            self.endpoint_configuration = input;
            self
        }
        /// <p>Defines the model configuration.</p>
        pub fn model_configuration(mut self, input: crate::model::ModelConfiguration) -> Self {
            self.model_configuration = Some(input);
            self
        }
        /// <p>Defines the model configuration.</p>
        pub fn set_model_configuration(
            mut self,
            input: std::option::Option<crate::model::ModelConfiguration>,
        ) -> Self {
            self.model_configuration = input;
            self
        }
        /// Consumes the builder and constructs a [`InferenceRecommendation`](crate::model::InferenceRecommendation).
        pub fn build(self) -> crate::model::InferenceRecommendation {
            crate::model::InferenceRecommendation {
                metrics: self.metrics,
                endpoint_configuration: self.endpoint_configuration,
                model_configuration: self.model_configuration,
            }
        }
    }
}
impl InferenceRecommendation {
    /// Creates a new builder-style object to manufacture [`InferenceRecommendation`](crate::model::InferenceRecommendation).
    pub fn builder() -> crate::model::inference_recommendation::Builder {
        crate::model::inference_recommendation::Builder::default()
    }
}

/// <p>Specifies conditions for stopping a job. When a job reaches a stopping condition limit, SageMaker ends the job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobStoppingConditions {
    /// <p>The maximum number of requests per minute expected for the endpoint.</p>
    #[doc(hidden)]
    pub max_invocations: i32,
    /// <p>The interval of time taken by a model to respond as viewed from SageMaker. The interval includes the local communication time taken to send the request and to fetch the response from the container of a model and the time taken to complete the inference in the container.</p>
    #[doc(hidden)]
    pub model_latency_thresholds:
        std::option::Option<std::vec::Vec<crate::model::ModelLatencyThreshold>>,
}
impl RecommendationJobStoppingConditions {
    /// <p>The maximum number of requests per minute expected for the endpoint.</p>
    pub fn max_invocations(&self) -> i32 {
        self.max_invocations
    }
    /// <p>The interval of time taken by a model to respond as viewed from SageMaker. The interval includes the local communication time taken to send the request and to fetch the response from the container of a model and the time taken to complete the inference in the container.</p>
    pub fn model_latency_thresholds(
        &self,
    ) -> std::option::Option<&[crate::model::ModelLatencyThreshold]> {
        self.model_latency_thresholds.as_deref()
    }
}
/// See [`RecommendationJobStoppingConditions`](crate::model::RecommendationJobStoppingConditions).
pub mod recommendation_job_stopping_conditions {

    /// A builder for [`RecommendationJobStoppingConditions`](crate::model::RecommendationJobStoppingConditions).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_invocations: std::option::Option<i32>,
        pub(crate) model_latency_thresholds:
            std::option::Option<std::vec::Vec<crate::model::ModelLatencyThreshold>>,
    }
    impl Builder {
        /// <p>The maximum number of requests per minute expected for the endpoint.</p>
        pub fn max_invocations(mut self, input: i32) -> Self {
            self.max_invocations = Some(input);
            self
        }
        /// <p>The maximum number of requests per minute expected for the endpoint.</p>
        pub fn set_max_invocations(mut self, input: std::option::Option<i32>) -> Self {
            self.max_invocations = input;
            self
        }
        /// Appends an item to `model_latency_thresholds`.
        ///
        /// To override the contents of this collection use [`set_model_latency_thresholds`](Self::set_model_latency_thresholds).
        ///
        /// <p>The interval of time taken by a model to respond as viewed from SageMaker. The interval includes the local communication time taken to send the request and to fetch the response from the container of a model and the time taken to complete the inference in the container.</p>
        pub fn model_latency_thresholds(
            mut self,
            input: crate::model::ModelLatencyThreshold,
        ) -> Self {
            let mut v = self.model_latency_thresholds.unwrap_or_default();
            v.push(input);
            self.model_latency_thresholds = Some(v);
            self
        }
        /// <p>The interval of time taken by a model to respond as viewed from SageMaker. The interval includes the local communication time taken to send the request and to fetch the response from the container of a model and the time taken to complete the inference in the container.</p>
        pub fn set_model_latency_thresholds(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ModelLatencyThreshold>>,
        ) -> Self {
            self.model_latency_thresholds = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobStoppingConditions`](crate::model::RecommendationJobStoppingConditions).
        pub fn build(self) -> crate::model::RecommendationJobStoppingConditions {
            crate::model::RecommendationJobStoppingConditions {
                max_invocations: self.max_invocations.unwrap_or_default(),
                model_latency_thresholds: self.model_latency_thresholds,
            }
        }
    }
}
impl RecommendationJobStoppingConditions {
    /// Creates a new builder-style object to manufacture [`RecommendationJobStoppingConditions`](crate::model::RecommendationJobStoppingConditions).
    pub fn builder() -> crate::model::recommendation_job_stopping_conditions::Builder {
        crate::model::recommendation_job_stopping_conditions::Builder::default()
    }
}

/// <p>The model latency threshold.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelLatencyThreshold {
    /// <p>The model latency percentile threshold.</p>
    #[doc(hidden)]
    pub percentile: std::option::Option<std::string::String>,
    /// <p>The model latency percentile value in milliseconds.</p>
    #[doc(hidden)]
    pub value_in_milliseconds: i32,
}
impl ModelLatencyThreshold {
    /// <p>The model latency percentile threshold.</p>
    pub fn percentile(&self) -> std::option::Option<&str> {
        self.percentile.as_deref()
    }
    /// <p>The model latency percentile value in milliseconds.</p>
    pub fn value_in_milliseconds(&self) -> i32 {
        self.value_in_milliseconds
    }
}
/// See [`ModelLatencyThreshold`](crate::model::ModelLatencyThreshold).
pub mod model_latency_threshold {

    /// A builder for [`ModelLatencyThreshold`](crate::model::ModelLatencyThreshold).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) percentile: std::option::Option<std::string::String>,
        pub(crate) value_in_milliseconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The model latency percentile threshold.</p>
        pub fn percentile(mut self, input: impl Into<std::string::String>) -> Self {
            self.percentile = Some(input.into());
            self
        }
        /// <p>The model latency percentile threshold.</p>
        pub fn set_percentile(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.percentile = input;
            self
        }
        /// <p>The model latency percentile value in milliseconds.</p>
        pub fn value_in_milliseconds(mut self, input: i32) -> Self {
            self.value_in_milliseconds = Some(input);
            self
        }
        /// <p>The model latency percentile value in milliseconds.</p>
        pub fn set_value_in_milliseconds(mut self, input: std::option::Option<i32>) -> Self {
            self.value_in_milliseconds = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelLatencyThreshold`](crate::model::ModelLatencyThreshold).
        pub fn build(self) -> crate::model::ModelLatencyThreshold {
            crate::model::ModelLatencyThreshold {
                percentile: self.percentile,
                value_in_milliseconds: self.value_in_milliseconds.unwrap_or_default(),
            }
        }
    }
}
impl ModelLatencyThreshold {
    /// Creates a new builder-style object to manufacture [`ModelLatencyThreshold`](crate::model::ModelLatencyThreshold).
    pub fn builder() -> crate::model::model_latency_threshold::Builder {
        crate::model::model_latency_threshold::Builder::default()
    }
}

/// <p>The input configuration of the recommendation job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobInputConfig {
    /// <p>The Amazon Resource Name (ARN) of a versioned model package.</p>
    #[doc(hidden)]
    pub model_package_version_arn: std::option::Option<std::string::String>,
    /// <p>Specifies the maximum duration of the job, in seconds.&gt;</p>
    #[doc(hidden)]
    pub job_duration_in_seconds: std::option::Option<i32>,
    /// <p>Specifies the traffic pattern of the job.</p>
    #[doc(hidden)]
    pub traffic_pattern: std::option::Option<crate::model::TrafficPattern>,
    /// <p>Defines the resource limit of the job.</p>
    #[doc(hidden)]
    pub resource_limit: std::option::Option<crate::model::RecommendationJobResourceLimit>,
    /// <p>Specifies the endpoint configuration to use for a job.</p>
    #[doc(hidden)]
    pub endpoint_configurations:
        std::option::Option<std::vec::Vec<crate::model::EndpointInputConfiguration>>,
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the endpoint. This key will be passed to SageMaker Hosting for endpoint creation. </p>
    /// <p>The SageMaker execution role must have <code>kms:CreateGrant</code> permission in order to encrypt data on the storage volume of the endpoints created for inference recommendation. The inference recommendation job will fail asynchronously during endpoint configuration creation if the role passed does not have <code>kms:CreateGrant</code> permission.</p>
    /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :key/
    /// <key-id-12ab-34cd-56ef-1234567890ab>
    /// "
    /// </key-id-12ab-34cd-56ef-1234567890ab>
    /// </account>
    /// </region></code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :alias/
    /// <examplealias>
    /// "
    /// </examplealias>
    /// </account>
    /// </region></code> </p> </li>
    /// </ul>
    /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
    /// <p>Specifies mandatory fields for running an Inference Recommender job. The fields specified in <code>ContainerConfig</code> override the corresponding fields in the model package.</p>
    #[doc(hidden)]
    pub container_config: std::option::Option<crate::model::RecommendationJobContainerConfig>,
    /// <p>Existing customer endpoints on which to run an Inference Recommender job.</p>
    #[doc(hidden)]
    pub endpoints: std::option::Option<std::vec::Vec<crate::model::EndpointInfo>>,
    /// <p>Inference Recommender provisions SageMaker endpoints with access to VPC in the inference recommendation job.</p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::RecommendationJobVpcConfig>,
}
impl RecommendationJobInputConfig {
    /// <p>The Amazon Resource Name (ARN) of a versioned model package.</p>
    pub fn model_package_version_arn(&self) -> std::option::Option<&str> {
        self.model_package_version_arn.as_deref()
    }
    /// <p>Specifies the maximum duration of the job, in seconds.&gt;</p>
    pub fn job_duration_in_seconds(&self) -> std::option::Option<i32> {
        self.job_duration_in_seconds
    }
    /// <p>Specifies the traffic pattern of the job.</p>
    pub fn traffic_pattern(&self) -> std::option::Option<&crate::model::TrafficPattern> {
        self.traffic_pattern.as_ref()
    }
    /// <p>Defines the resource limit of the job.</p>
    pub fn resource_limit(
        &self,
    ) -> std::option::Option<&crate::model::RecommendationJobResourceLimit> {
        self.resource_limit.as_ref()
    }
    /// <p>Specifies the endpoint configuration to use for a job.</p>
    pub fn endpoint_configurations(
        &self,
    ) -> std::option::Option<&[crate::model::EndpointInputConfiguration]> {
        self.endpoint_configurations.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the endpoint. This key will be passed to SageMaker Hosting for endpoint creation. </p>
    /// <p>The SageMaker execution role must have <code>kms:CreateGrant</code> permission in order to encrypt data on the storage volume of the endpoints created for inference recommendation. The inference recommendation job will fail asynchronously during endpoint configuration creation if the role passed does not have <code>kms:CreateGrant</code> permission.</p>
    /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :key/
    /// <key-id-12ab-34cd-56ef-1234567890ab>
    /// "
    /// </key-id-12ab-34cd-56ef-1234567890ab>
    /// </account>
    /// </region></code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :alias/
    /// <examplealias>
    /// "
    /// </examplealias>
    /// </account>
    /// </region></code> </p> </li>
    /// </ul>
    /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
    /// <p>Specifies mandatory fields for running an Inference Recommender job. The fields specified in <code>ContainerConfig</code> override the corresponding fields in the model package.</p>
    pub fn container_config(
        &self,
    ) -> std::option::Option<&crate::model::RecommendationJobContainerConfig> {
        self.container_config.as_ref()
    }
    /// <p>Existing customer endpoints on which to run an Inference Recommender job.</p>
    pub fn endpoints(&self) -> std::option::Option<&[crate::model::EndpointInfo]> {
        self.endpoints.as_deref()
    }
    /// <p>Inference Recommender provisions SageMaker endpoints with access to VPC in the inference recommendation job.</p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::RecommendationJobVpcConfig> {
        self.vpc_config.as_ref()
    }
}
/// See [`RecommendationJobInputConfig`](crate::model::RecommendationJobInputConfig).
pub mod recommendation_job_input_config {

    /// A builder for [`RecommendationJobInputConfig`](crate::model::RecommendationJobInputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_package_version_arn: std::option::Option<std::string::String>,
        pub(crate) job_duration_in_seconds: std::option::Option<i32>,
        pub(crate) traffic_pattern: std::option::Option<crate::model::TrafficPattern>,
        pub(crate) resource_limit:
            std::option::Option<crate::model::RecommendationJobResourceLimit>,
        pub(crate) endpoint_configurations:
            std::option::Option<std::vec::Vec<crate::model::EndpointInputConfiguration>>,
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
        pub(crate) container_config:
            std::option::Option<crate::model::RecommendationJobContainerConfig>,
        pub(crate) endpoints: std::option::Option<std::vec::Vec<crate::model::EndpointInfo>>,
        pub(crate) vpc_config: std::option::Option<crate::model::RecommendationJobVpcConfig>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of a versioned model package.</p>
        pub fn model_package_version_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_version_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a versioned model package.</p>
        pub fn set_model_package_version_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_version_arn = input;
            self
        }
        /// <p>Specifies the maximum duration of the job, in seconds.&gt;</p>
        pub fn job_duration_in_seconds(mut self, input: i32) -> Self {
            self.job_duration_in_seconds = Some(input);
            self
        }
        /// <p>Specifies the maximum duration of the job, in seconds.&gt;</p>
        pub fn set_job_duration_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.job_duration_in_seconds = input;
            self
        }
        /// <p>Specifies the traffic pattern of the job.</p>
        pub fn traffic_pattern(mut self, input: crate::model::TrafficPattern) -> Self {
            self.traffic_pattern = Some(input);
            self
        }
        /// <p>Specifies the traffic pattern of the job.</p>
        pub fn set_traffic_pattern(
            mut self,
            input: std::option::Option<crate::model::TrafficPattern>,
        ) -> Self {
            self.traffic_pattern = input;
            self
        }
        /// <p>Defines the resource limit of the job.</p>
        pub fn resource_limit(
            mut self,
            input: crate::model::RecommendationJobResourceLimit,
        ) -> Self {
            self.resource_limit = Some(input);
            self
        }
        /// <p>Defines the resource limit of the job.</p>
        pub fn set_resource_limit(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobResourceLimit>,
        ) -> Self {
            self.resource_limit = input;
            self
        }
        /// Appends an item to `endpoint_configurations`.
        ///
        /// To override the contents of this collection use [`set_endpoint_configurations`](Self::set_endpoint_configurations).
        ///
        /// <p>Specifies the endpoint configuration to use for a job.</p>
        pub fn endpoint_configurations(
            mut self,
            input: crate::model::EndpointInputConfiguration,
        ) -> Self {
            let mut v = self.endpoint_configurations.unwrap_or_default();
            v.push(input);
            self.endpoint_configurations = Some(v);
            self
        }
        /// <p>Specifies the endpoint configuration to use for a job.</p>
        pub fn set_endpoint_configurations(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::EndpointInputConfiguration>>,
        ) -> Self {
            self.endpoint_configurations = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the endpoint. This key will be passed to SageMaker Hosting for endpoint creation. </p>
        /// <p>The SageMaker execution role must have <code>kms:CreateGrant</code> permission in order to encrypt data on the storage volume of the endpoints created for inference recommendation. The inference recommendation job will fail asynchronously during endpoint configuration creation if the role passed does not have <code>kms:CreateGrant</code> permission.</p>
        /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :key/
        /// <key-id-12ab-34cd-56ef-1234567890ab>
        /// "
        /// </key-id-12ab-34cd-56ef-1234567890ab>
        /// </account>
        /// </region></code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :alias/
        /// <examplealias>
        /// "
        /// </examplealias>
        /// </account>
        /// </region></code> </p> </li>
        /// </ul>
        /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the endpoint. This key will be passed to SageMaker Hosting for endpoint creation. </p>
        /// <p>The SageMaker execution role must have <code>kms:CreateGrant</code> permission in order to encrypt data on the storage volume of the endpoints created for inference recommendation. The inference recommendation job will fail asynchronously during endpoint configuration creation if the role passed does not have <code>kms:CreateGrant</code> permission.</p>
        /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :key/
        /// <key-id-12ab-34cd-56ef-1234567890ab>
        /// "
        /// </key-id-12ab-34cd-56ef-1234567890ab>
        /// </account>
        /// </region></code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :alias/
        /// <examplealias>
        /// "
        /// </examplealias>
        /// </account>
        /// </region></code> </p> </li>
        /// </ul>
        /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// <p>Specifies mandatory fields for running an Inference Recommender job. The fields specified in <code>ContainerConfig</code> override the corresponding fields in the model package.</p>
        pub fn container_config(
            mut self,
            input: crate::model::RecommendationJobContainerConfig,
        ) -> Self {
            self.container_config = Some(input);
            self
        }
        /// <p>Specifies mandatory fields for running an Inference Recommender job. The fields specified in <code>ContainerConfig</code> override the corresponding fields in the model package.</p>
        pub fn set_container_config(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobContainerConfig>,
        ) -> Self {
            self.container_config = input;
            self
        }
        /// Appends an item to `endpoints`.
        ///
        /// To override the contents of this collection use [`set_endpoints`](Self::set_endpoints).
        ///
        /// <p>Existing customer endpoints on which to run an Inference Recommender job.</p>
        pub fn endpoints(mut self, input: crate::model::EndpointInfo) -> Self {
            let mut v = self.endpoints.unwrap_or_default();
            v.push(input);
            self.endpoints = Some(v);
            self
        }
        /// <p>Existing customer endpoints on which to run an Inference Recommender job.</p>
        pub fn set_endpoints(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::EndpointInfo>>,
        ) -> Self {
            self.endpoints = input;
            self
        }
        /// <p>Inference Recommender provisions SageMaker endpoints with access to VPC in the inference recommendation job.</p>
        pub fn vpc_config(mut self, input: crate::model::RecommendationJobVpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>Inference Recommender provisions SageMaker endpoints with access to VPC in the inference recommendation job.</p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobVpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobInputConfig`](crate::model::RecommendationJobInputConfig).
        pub fn build(self) -> crate::model::RecommendationJobInputConfig {
            crate::model::RecommendationJobInputConfig {
                model_package_version_arn: self.model_package_version_arn,
                job_duration_in_seconds: self.job_duration_in_seconds,
                traffic_pattern: self.traffic_pattern,
                resource_limit: self.resource_limit,
                endpoint_configurations: self.endpoint_configurations,
                volume_kms_key_id: self.volume_kms_key_id,
                container_config: self.container_config,
                endpoints: self.endpoints,
                vpc_config: self.vpc_config,
            }
        }
    }
}
impl RecommendationJobInputConfig {
    /// Creates a new builder-style object to manufacture [`RecommendationJobInputConfig`](crate::model::RecommendationJobInputConfig).
    pub fn builder() -> crate::model::recommendation_job_input_config::Builder {
        crate::model::recommendation_job_input_config::Builder::default()
    }
}

/// <p>Inference Recommender provisions SageMaker endpoints with access to VPC in the inference recommendation job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobVpcConfig {
    /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The ID of the subnets in the VPC to which you want to connect your model.</p>
    #[doc(hidden)]
    pub subnets: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl RecommendationJobVpcConfig {
    /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
    /// <p>The ID of the subnets in the VPC to which you want to connect your model.</p>
    pub fn subnets(&self) -> std::option::Option<&[std::string::String]> {
        self.subnets.as_deref()
    }
}
/// See [`RecommendationJobVpcConfig`](crate::model::RecommendationJobVpcConfig).
pub mod recommendation_job_vpc_config {

    /// A builder for [`RecommendationJobVpcConfig`](crate::model::RecommendationJobVpcConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) subnets: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// Appends an item to `subnets`.
        ///
        /// To override the contents of this collection use [`set_subnets`](Self::set_subnets).
        ///
        /// <p>The ID of the subnets in the VPC to which you want to connect your model.</p>
        pub fn subnets(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.subnets.unwrap_or_default();
            v.push(input.into());
            self.subnets = Some(v);
            self
        }
        /// <p>The ID of the subnets in the VPC to which you want to connect your model.</p>
        pub fn set_subnets(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.subnets = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobVpcConfig`](crate::model::RecommendationJobVpcConfig).
        pub fn build(self) -> crate::model::RecommendationJobVpcConfig {
            crate::model::RecommendationJobVpcConfig {
                security_group_ids: self.security_group_ids,
                subnets: self.subnets,
            }
        }
    }
}
impl RecommendationJobVpcConfig {
    /// Creates a new builder-style object to manufacture [`RecommendationJobVpcConfig`](crate::model::RecommendationJobVpcConfig).
    pub fn builder() -> crate::model::recommendation_job_vpc_config::Builder {
        crate::model::recommendation_job_vpc_config::Builder::default()
    }
}

/// <p>Specifies mandatory fields for running an Inference Recommender job directly in the <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateInferenceRecommendationsJob.html">CreateInferenceRecommendationsJob</a> API. The fields specified in <code>ContainerConfig</code> override the corresponding fields in the model package. Use <code>ContainerConfig</code> if you want to specify these fields for the recommendation job but don't want to edit them in your model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobContainerConfig {
    /// <p>The machine learning domain of the model and its components.</p>
    /// <p>Valid Values: <code>COMPUTER_VISION | NATURAL_LANGUAGE_PROCESSING | MACHINE_LEARNING</code> </p>
    #[doc(hidden)]
    pub domain: std::option::Option<std::string::String>,
    /// <p>The machine learning task that the model accomplishes.</p>
    /// <p>Valid Values: <code>IMAGE_CLASSIFICATION | OBJECT_DETECTION | TEXT_GENERATION | IMAGE_SEGMENTATION | FILL_MASK | CLASSIFICATION | REGRESSION | OTHER</code> </p>
    #[doc(hidden)]
    pub task: std::option::Option<std::string::String>,
    /// <p>The machine learning framework of the container image.</p>
    /// <p>Valid Values: <code>TENSORFLOW | PYTORCH | XGBOOST | SAGEMAKER-SCIKIT-LEARN</code> </p>
    #[doc(hidden)]
    pub framework: std::option::Option<std::string::String>,
    /// <p>The framework version of the container image.</p>
    #[doc(hidden)]
    pub framework_version: std::option::Option<std::string::String>,
    /// <p>Specifies the <code>SamplePayloadUrl</code> and all other sample payload-related fields.</p>
    #[doc(hidden)]
    pub payload_config: std::option::Option<crate::model::RecommendationJobPayloadConfig>,
    /// <p>The name of a pre-trained machine learning model benchmarked by Amazon SageMaker Inference Recommender that matches your model.</p>
    /// <p>Valid Values: <code>efficientnetb7 | unet | xgboost | faster-rcnn-resnet101 | nasnetlarge | vgg16 | inception-v3 | mask-rcnn | sagemaker-scikit-learn | densenet201-gluon | resnet18v2-gluon | xception | densenet201 | yolov4 | resnet152 | bert-base-cased | xceptionV1-keras | resnet50 | retinanet</code> </p>
    #[doc(hidden)]
    pub nearest_model_name: std::option::Option<std::string::String>,
    /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
    #[doc(hidden)]
    pub supported_instance_types: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl RecommendationJobContainerConfig {
    /// <p>The machine learning domain of the model and its components.</p>
    /// <p>Valid Values: <code>COMPUTER_VISION | NATURAL_LANGUAGE_PROCESSING | MACHINE_LEARNING</code> </p>
    pub fn domain(&self) -> std::option::Option<&str> {
        self.domain.as_deref()
    }
    /// <p>The machine learning task that the model accomplishes.</p>
    /// <p>Valid Values: <code>IMAGE_CLASSIFICATION | OBJECT_DETECTION | TEXT_GENERATION | IMAGE_SEGMENTATION | FILL_MASK | CLASSIFICATION | REGRESSION | OTHER</code> </p>
    pub fn task(&self) -> std::option::Option<&str> {
        self.task.as_deref()
    }
    /// <p>The machine learning framework of the container image.</p>
    /// <p>Valid Values: <code>TENSORFLOW | PYTORCH | XGBOOST | SAGEMAKER-SCIKIT-LEARN</code> </p>
    pub fn framework(&self) -> std::option::Option<&str> {
        self.framework.as_deref()
    }
    /// <p>The framework version of the container image.</p>
    pub fn framework_version(&self) -> std::option::Option<&str> {
        self.framework_version.as_deref()
    }
    /// <p>Specifies the <code>SamplePayloadUrl</code> and all other sample payload-related fields.</p>
    pub fn payload_config(
        &self,
    ) -> std::option::Option<&crate::model::RecommendationJobPayloadConfig> {
        self.payload_config.as_ref()
    }
    /// <p>The name of a pre-trained machine learning model benchmarked by Amazon SageMaker Inference Recommender that matches your model.</p>
    /// <p>Valid Values: <code>efficientnetb7 | unet | xgboost | faster-rcnn-resnet101 | nasnetlarge | vgg16 | inception-v3 | mask-rcnn | sagemaker-scikit-learn | densenet201-gluon | resnet18v2-gluon | xception | densenet201 | yolov4 | resnet152 | bert-base-cased | xceptionV1-keras | resnet50 | retinanet</code> </p>
    pub fn nearest_model_name(&self) -> std::option::Option<&str> {
        self.nearest_model_name.as_deref()
    }
    /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
    pub fn supported_instance_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_instance_types.as_deref()
    }
}
/// See [`RecommendationJobContainerConfig`](crate::model::RecommendationJobContainerConfig).
pub mod recommendation_job_container_config {

    /// A builder for [`RecommendationJobContainerConfig`](crate::model::RecommendationJobContainerConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain: std::option::Option<std::string::String>,
        pub(crate) task: std::option::Option<std::string::String>,
        pub(crate) framework: std::option::Option<std::string::String>,
        pub(crate) framework_version: std::option::Option<std::string::String>,
        pub(crate) payload_config:
            std::option::Option<crate::model::RecommendationJobPayloadConfig>,
        pub(crate) nearest_model_name: std::option::Option<std::string::String>,
        pub(crate) supported_instance_types:
            std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The machine learning domain of the model and its components.</p>
        /// <p>Valid Values: <code>COMPUTER_VISION | NATURAL_LANGUAGE_PROCESSING | MACHINE_LEARNING</code> </p>
        pub fn domain(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain = Some(input.into());
            self
        }
        /// <p>The machine learning domain of the model and its components.</p>
        /// <p>Valid Values: <code>COMPUTER_VISION | NATURAL_LANGUAGE_PROCESSING | MACHINE_LEARNING</code> </p>
        pub fn set_domain(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.domain = input;
            self
        }
        /// <p>The machine learning task that the model accomplishes.</p>
        /// <p>Valid Values: <code>IMAGE_CLASSIFICATION | OBJECT_DETECTION | TEXT_GENERATION | IMAGE_SEGMENTATION | FILL_MASK | CLASSIFICATION | REGRESSION | OTHER</code> </p>
        pub fn task(mut self, input: impl Into<std::string::String>) -> Self {
            self.task = Some(input.into());
            self
        }
        /// <p>The machine learning task that the model accomplishes.</p>
        /// <p>Valid Values: <code>IMAGE_CLASSIFICATION | OBJECT_DETECTION | TEXT_GENERATION | IMAGE_SEGMENTATION | FILL_MASK | CLASSIFICATION | REGRESSION | OTHER</code> </p>
        pub fn set_task(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.task = input;
            self
        }
        /// <p>The machine learning framework of the container image.</p>
        /// <p>Valid Values: <code>TENSORFLOW | PYTORCH | XGBOOST | SAGEMAKER-SCIKIT-LEARN</code> </p>
        pub fn framework(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework = Some(input.into());
            self
        }
        /// <p>The machine learning framework of the container image.</p>
        /// <p>Valid Values: <code>TENSORFLOW | PYTORCH | XGBOOST | SAGEMAKER-SCIKIT-LEARN</code> </p>
        pub fn set_framework(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.framework = input;
            self
        }
        /// <p>The framework version of the container image.</p>
        pub fn framework_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework_version = Some(input.into());
            self
        }
        /// <p>The framework version of the container image.</p>
        pub fn set_framework_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.framework_version = input;
            self
        }
        /// <p>Specifies the <code>SamplePayloadUrl</code> and all other sample payload-related fields.</p>
        pub fn payload_config(
            mut self,
            input: crate::model::RecommendationJobPayloadConfig,
        ) -> Self {
            self.payload_config = Some(input);
            self
        }
        /// <p>Specifies the <code>SamplePayloadUrl</code> and all other sample payload-related fields.</p>
        pub fn set_payload_config(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobPayloadConfig>,
        ) -> Self {
            self.payload_config = input;
            self
        }
        /// <p>The name of a pre-trained machine learning model benchmarked by Amazon SageMaker Inference Recommender that matches your model.</p>
        /// <p>Valid Values: <code>efficientnetb7 | unet | xgboost | faster-rcnn-resnet101 | nasnetlarge | vgg16 | inception-v3 | mask-rcnn | sagemaker-scikit-learn | densenet201-gluon | resnet18v2-gluon | xception | densenet201 | yolov4 | resnet152 | bert-base-cased | xceptionV1-keras | resnet50 | retinanet</code> </p>
        pub fn nearest_model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.nearest_model_name = Some(input.into());
            self
        }
        /// <p>The name of a pre-trained machine learning model benchmarked by Amazon SageMaker Inference Recommender that matches your model.</p>
        /// <p>Valid Values: <code>efficientnetb7 | unet | xgboost | faster-rcnn-resnet101 | nasnetlarge | vgg16 | inception-v3 | mask-rcnn | sagemaker-scikit-learn | densenet201-gluon | resnet18v2-gluon | xception | densenet201 | yolov4 | resnet152 | bert-base-cased | xceptionV1-keras | resnet50 | retinanet</code> </p>
        pub fn set_nearest_model_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.nearest_model_name = input;
            self
        }
        /// Appends an item to `supported_instance_types`.
        ///
        /// To override the contents of this collection use [`set_supported_instance_types`](Self::set_supported_instance_types).
        ///
        /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
        pub fn supported_instance_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.supported_instance_types.unwrap_or_default();
            v.push(input.into());
            self.supported_instance_types = Some(v);
            self
        }
        /// <p>A list of the instance types that are used to generate inferences in real-time.</p>
        pub fn set_supported_instance_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_instance_types = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobContainerConfig`](crate::model::RecommendationJobContainerConfig).
        pub fn build(self) -> crate::model::RecommendationJobContainerConfig {
            crate::model::RecommendationJobContainerConfig {
                domain: self.domain,
                task: self.task,
                framework: self.framework,
                framework_version: self.framework_version,
                payload_config: self.payload_config,
                nearest_model_name: self.nearest_model_name,
                supported_instance_types: self.supported_instance_types,
            }
        }
    }
}
impl RecommendationJobContainerConfig {
    /// Creates a new builder-style object to manufacture [`RecommendationJobContainerConfig`](crate::model::RecommendationJobContainerConfig).
    pub fn builder() -> crate::model::recommendation_job_container_config::Builder {
        crate::model::recommendation_job_container_config::Builder::default()
    }
}

/// <p>The configuration for the payload for a recommendation job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobPayloadConfig {
    /// <p>The Amazon Simple Storage Service (Amazon S3) path where the sample payload is stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
    #[doc(hidden)]
    pub sample_payload_url: std::option::Option<std::string::String>,
    /// <p>The supported MIME types for the input data.</p>
    #[doc(hidden)]
    pub supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl RecommendationJobPayloadConfig {
    /// <p>The Amazon Simple Storage Service (Amazon S3) path where the sample payload is stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
    pub fn sample_payload_url(&self) -> std::option::Option<&str> {
        self.sample_payload_url.as_deref()
    }
    /// <p>The supported MIME types for the input data.</p>
    pub fn supported_content_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_content_types.as_deref()
    }
}
/// See [`RecommendationJobPayloadConfig`](crate::model::RecommendationJobPayloadConfig).
pub mod recommendation_job_payload_config {

    /// A builder for [`RecommendationJobPayloadConfig`](crate::model::RecommendationJobPayloadConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) sample_payload_url: std::option::Option<std::string::String>,
        pub(crate) supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The Amazon Simple Storage Service (Amazon S3) path where the sample payload is stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
        pub fn sample_payload_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.sample_payload_url = Some(input.into());
            self
        }
        /// <p>The Amazon Simple Storage Service (Amazon S3) path where the sample payload is stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
        pub fn set_sample_payload_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.sample_payload_url = input;
            self
        }
        /// Appends an item to `supported_content_types`.
        ///
        /// To override the contents of this collection use [`set_supported_content_types`](Self::set_supported_content_types).
        ///
        /// <p>The supported MIME types for the input data.</p>
        pub fn supported_content_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.supported_content_types.unwrap_or_default();
            v.push(input.into());
            self.supported_content_types = Some(v);
            self
        }
        /// <p>The supported MIME types for the input data.</p>
        pub fn set_supported_content_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_content_types = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobPayloadConfig`](crate::model::RecommendationJobPayloadConfig).
        pub fn build(self) -> crate::model::RecommendationJobPayloadConfig {
            crate::model::RecommendationJobPayloadConfig {
                sample_payload_url: self.sample_payload_url,
                supported_content_types: self.supported_content_types,
            }
        }
    }
}
impl RecommendationJobPayloadConfig {
    /// Creates a new builder-style object to manufacture [`RecommendationJobPayloadConfig`](crate::model::RecommendationJobPayloadConfig).
    pub fn builder() -> crate::model::recommendation_job_payload_config::Builder {
        crate::model::recommendation_job_payload_config::Builder::default()
    }
}

/// <p>The endpoint configuration for the load test.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointInputConfiguration {
    /// <p>The instance types to use for the load test.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
    /// <p>The inference specification name in the model package version.</p>
    #[doc(hidden)]
    pub inference_specification_name: std::option::Option<std::string::String>,
    /// <p> The parameter you want to benchmark against.</p>
    #[doc(hidden)]
    pub environment_parameter_ranges: std::option::Option<crate::model::EnvironmentParameterRanges>,
}
impl EndpointInputConfiguration {
    /// <p>The instance types to use for the load test.</p>
    pub fn instance_type(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The inference specification name in the model package version.</p>
    pub fn inference_specification_name(&self) -> std::option::Option<&str> {
        self.inference_specification_name.as_deref()
    }
    /// <p> The parameter you want to benchmark against.</p>
    pub fn environment_parameter_ranges(
        &self,
    ) -> std::option::Option<&crate::model::EnvironmentParameterRanges> {
        self.environment_parameter_ranges.as_ref()
    }
}
/// See [`EndpointInputConfiguration`](crate::model::EndpointInputConfiguration).
pub mod endpoint_input_configuration {

    /// A builder for [`EndpointInputConfiguration`](crate::model::EndpointInputConfiguration).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
        pub(crate) inference_specification_name: std::option::Option<std::string::String>,
        pub(crate) environment_parameter_ranges:
            std::option::Option<crate::model::EnvironmentParameterRanges>,
    }
    impl Builder {
        /// <p>The instance types to use for the load test.</p>
        pub fn instance_type(mut self, input: crate::model::ProductionVariantInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The instance types to use for the load test.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The inference specification name in the model package version.</p>
        pub fn inference_specification_name(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.inference_specification_name = Some(input.into());
            self
        }
        /// <p>The inference specification name in the model package version.</p>
        pub fn set_inference_specification_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.inference_specification_name = input;
            self
        }
        /// <p> The parameter you want to benchmark against.</p>
        pub fn environment_parameter_ranges(
            mut self,
            input: crate::model::EnvironmentParameterRanges,
        ) -> Self {
            self.environment_parameter_ranges = Some(input);
            self
        }
        /// <p> The parameter you want to benchmark against.</p>
        pub fn set_environment_parameter_ranges(
            mut self,
            input: std::option::Option<crate::model::EnvironmentParameterRanges>,
        ) -> Self {
            self.environment_parameter_ranges = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointInputConfiguration`](crate::model::EndpointInputConfiguration).
        pub fn build(self) -> crate::model::EndpointInputConfiguration {
            crate::model::EndpointInputConfiguration {
                instance_type: self.instance_type,
                inference_specification_name: self.inference_specification_name,
                environment_parameter_ranges: self.environment_parameter_ranges,
            }
        }
    }
}
impl EndpointInputConfiguration {
    /// Creates a new builder-style object to manufacture [`EndpointInputConfiguration`](crate::model::EndpointInputConfiguration).
    pub fn builder() -> crate::model::endpoint_input_configuration::Builder {
        crate::model::endpoint_input_configuration::Builder::default()
    }
}

/// <p>Specifies the range of environment parameters</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EnvironmentParameterRanges {
    /// <p>Specified a list of parameters for each category.</p>
    #[doc(hidden)]
    pub categorical_parameter_ranges:
        std::option::Option<std::vec::Vec<crate::model::CategoricalParameter>>,
}
impl EnvironmentParameterRanges {
    /// <p>Specified a list of parameters for each category.</p>
    pub fn categorical_parameter_ranges(
        &self,
    ) -> std::option::Option<&[crate::model::CategoricalParameter]> {
        self.categorical_parameter_ranges.as_deref()
    }
}
/// See [`EnvironmentParameterRanges`](crate::model::EnvironmentParameterRanges).
pub mod environment_parameter_ranges {

    /// A builder for [`EnvironmentParameterRanges`](crate::model::EnvironmentParameterRanges).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) categorical_parameter_ranges:
            std::option::Option<std::vec::Vec<crate::model::CategoricalParameter>>,
    }
    impl Builder {
        /// Appends an item to `categorical_parameter_ranges`.
        ///
        /// To override the contents of this collection use [`set_categorical_parameter_ranges`](Self::set_categorical_parameter_ranges).
        ///
        /// <p>Specified a list of parameters for each category.</p>
        pub fn categorical_parameter_ranges(
            mut self,
            input: crate::model::CategoricalParameter,
        ) -> Self {
            let mut v = self.categorical_parameter_ranges.unwrap_or_default();
            v.push(input);
            self.categorical_parameter_ranges = Some(v);
            self
        }
        /// <p>Specified a list of parameters for each category.</p>
        pub fn set_categorical_parameter_ranges(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CategoricalParameter>>,
        ) -> Self {
            self.categorical_parameter_ranges = input;
            self
        }
        /// Consumes the builder and constructs a [`EnvironmentParameterRanges`](crate::model::EnvironmentParameterRanges).
        pub fn build(self) -> crate::model::EnvironmentParameterRanges {
            crate::model::EnvironmentParameterRanges {
                categorical_parameter_ranges: self.categorical_parameter_ranges,
            }
        }
    }
}
impl EnvironmentParameterRanges {
    /// Creates a new builder-style object to manufacture [`EnvironmentParameterRanges`](crate::model::EnvironmentParameterRanges).
    pub fn builder() -> crate::model::environment_parameter_ranges::Builder {
        crate::model::environment_parameter_ranges::Builder::default()
    }
}

/// <p>Environment parameters you want to benchmark your load test against.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CategoricalParameter {
    /// <p>The Name of the environment variable.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The list of values you can pass.</p>
    #[doc(hidden)]
    pub value: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl CategoricalParameter {
    /// <p>The Name of the environment variable.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The list of values you can pass.</p>
    pub fn value(&self) -> std::option::Option<&[std::string::String]> {
        self.value.as_deref()
    }
}
/// See [`CategoricalParameter`](crate::model::CategoricalParameter).
pub mod categorical_parameter {

    /// A builder for [`CategoricalParameter`](crate::model::CategoricalParameter).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) value: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// <p>The Name of the environment variable.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The Name of the environment variable.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// Appends an item to `value`.
        ///
        /// To override the contents of this collection use [`set_value`](Self::set_value).
        ///
        /// <p>The list of values you can pass.</p>
        pub fn value(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.value.unwrap_or_default();
            v.push(input.into());
            self.value = Some(v);
            self
        }
        /// <p>The list of values you can pass.</p>
        pub fn set_value(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.value = input;
            self
        }
        /// Consumes the builder and constructs a [`CategoricalParameter`](crate::model::CategoricalParameter).
        pub fn build(self) -> crate::model::CategoricalParameter {
            crate::model::CategoricalParameter {
                name: self.name,
                value: self.value,
            }
        }
    }
}
impl CategoricalParameter {
    /// Creates a new builder-style object to manufacture [`CategoricalParameter`](crate::model::CategoricalParameter).
    pub fn builder() -> crate::model::categorical_parameter::Builder {
        crate::model::categorical_parameter::Builder::default()
    }
}

/// <p>Specifies the maximum number of jobs that can run in parallel and the maximum number of jobs that can run.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobResourceLimit {
    /// <p>Defines the maximum number of load tests.</p>
    #[doc(hidden)]
    pub max_number_of_tests: std::option::Option<i32>,
    /// <p>Defines the maximum number of parallel load tests.</p>
    #[doc(hidden)]
    pub max_parallel_of_tests: std::option::Option<i32>,
}
impl RecommendationJobResourceLimit {
    /// <p>Defines the maximum number of load tests.</p>
    pub fn max_number_of_tests(&self) -> std::option::Option<i32> {
        self.max_number_of_tests
    }
    /// <p>Defines the maximum number of parallel load tests.</p>
    pub fn max_parallel_of_tests(&self) -> std::option::Option<i32> {
        self.max_parallel_of_tests
    }
}
/// See [`RecommendationJobResourceLimit`](crate::model::RecommendationJobResourceLimit).
pub mod recommendation_job_resource_limit {

    /// A builder for [`RecommendationJobResourceLimit`](crate::model::RecommendationJobResourceLimit).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_number_of_tests: std::option::Option<i32>,
        pub(crate) max_parallel_of_tests: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Defines the maximum number of load tests.</p>
        pub fn max_number_of_tests(mut self, input: i32) -> Self {
            self.max_number_of_tests = Some(input);
            self
        }
        /// <p>Defines the maximum number of load tests.</p>
        pub fn set_max_number_of_tests(mut self, input: std::option::Option<i32>) -> Self {
            self.max_number_of_tests = input;
            self
        }
        /// <p>Defines the maximum number of parallel load tests.</p>
        pub fn max_parallel_of_tests(mut self, input: i32) -> Self {
            self.max_parallel_of_tests = Some(input);
            self
        }
        /// <p>Defines the maximum number of parallel load tests.</p>
        pub fn set_max_parallel_of_tests(mut self, input: std::option::Option<i32>) -> Self {
            self.max_parallel_of_tests = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobResourceLimit`](crate::model::RecommendationJobResourceLimit).
        pub fn build(self) -> crate::model::RecommendationJobResourceLimit {
            crate::model::RecommendationJobResourceLimit {
                max_number_of_tests: self.max_number_of_tests,
                max_parallel_of_tests: self.max_parallel_of_tests,
            }
        }
    }
}
impl RecommendationJobResourceLimit {
    /// Creates a new builder-style object to manufacture [`RecommendationJobResourceLimit`](crate::model::RecommendationJobResourceLimit).
    pub fn builder() -> crate::model::recommendation_job_resource_limit::Builder {
        crate::model::recommendation_job_resource_limit::Builder::default()
    }
}

/// <p>Defines the traffic pattern of the load test.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrafficPattern {
    /// <p>Defines the traffic patterns.</p>
    #[doc(hidden)]
    pub traffic_type: std::option::Option<crate::model::TrafficType>,
    /// <p>Defines the phases traffic specification.</p>
    #[doc(hidden)]
    pub phases: std::option::Option<std::vec::Vec<crate::model::Phase>>,
}
impl TrafficPattern {
    /// <p>Defines the traffic patterns.</p>
    pub fn traffic_type(&self) -> std::option::Option<&crate::model::TrafficType> {
        self.traffic_type.as_ref()
    }
    /// <p>Defines the phases traffic specification.</p>
    pub fn phases(&self) -> std::option::Option<&[crate::model::Phase]> {
        self.phases.as_deref()
    }
}
/// See [`TrafficPattern`](crate::model::TrafficPattern).
pub mod traffic_pattern {

    /// A builder for [`TrafficPattern`](crate::model::TrafficPattern).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) traffic_type: std::option::Option<crate::model::TrafficType>,
        pub(crate) phases: std::option::Option<std::vec::Vec<crate::model::Phase>>,
    }
    impl Builder {
        /// <p>Defines the traffic patterns.</p>
        pub fn traffic_type(mut self, input: crate::model::TrafficType) -> Self {
            self.traffic_type = Some(input);
            self
        }
        /// <p>Defines the traffic patterns.</p>
        pub fn set_traffic_type(
            mut self,
            input: std::option::Option<crate::model::TrafficType>,
        ) -> Self {
            self.traffic_type = input;
            self
        }
        /// Appends an item to `phases`.
        ///
        /// To override the contents of this collection use [`set_phases`](Self::set_phases).
        ///
        /// <p>Defines the phases traffic specification.</p>
        pub fn phases(mut self, input: crate::model::Phase) -> Self {
            let mut v = self.phases.unwrap_or_default();
            v.push(input);
            self.phases = Some(v);
            self
        }
        /// <p>Defines the phases traffic specification.</p>
        pub fn set_phases(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Phase>>,
        ) -> Self {
            self.phases = input;
            self
        }
        /// Consumes the builder and constructs a [`TrafficPattern`](crate::model::TrafficPattern).
        pub fn build(self) -> crate::model::TrafficPattern {
            crate::model::TrafficPattern {
                traffic_type: self.traffic_type,
                phases: self.phases,
            }
        }
    }
}
impl TrafficPattern {
    /// Creates a new builder-style object to manufacture [`TrafficPattern`](crate::model::TrafficPattern).
    pub fn builder() -> crate::model::traffic_pattern::Builder {
        crate::model::traffic_pattern::Builder::default()
    }
}

/// <p>Defines the traffic pattern.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct Phase {
    /// <p>Specifies how many concurrent users to start with.</p>
    #[doc(hidden)]
    pub initial_number_of_users: std::option::Option<i32>,
    /// <p>Specified how many new users to spawn in a minute.</p>
    #[doc(hidden)]
    pub spawn_rate: std::option::Option<i32>,
    /// <p>Specifies how long traffic phase should be.</p>
    #[doc(hidden)]
    pub duration_in_seconds: std::option::Option<i32>,
}
impl Phase {
    /// <p>Specifies how many concurrent users to start with.</p>
    pub fn initial_number_of_users(&self) -> std::option::Option<i32> {
        self.initial_number_of_users
    }
    /// <p>Specified how many new users to spawn in a minute.</p>
    pub fn spawn_rate(&self) -> std::option::Option<i32> {
        self.spawn_rate
    }
    /// <p>Specifies how long traffic phase should be.</p>
    pub fn duration_in_seconds(&self) -> std::option::Option<i32> {
        self.duration_in_seconds
    }
}
/// See [`Phase`](crate::model::Phase).
pub mod phase {

    /// A builder for [`Phase`](crate::model::Phase).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) initial_number_of_users: std::option::Option<i32>,
        pub(crate) spawn_rate: std::option::Option<i32>,
        pub(crate) duration_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>Specifies how many concurrent users to start with.</p>
        pub fn initial_number_of_users(mut self, input: i32) -> Self {
            self.initial_number_of_users = Some(input);
            self
        }
        /// <p>Specifies how many concurrent users to start with.</p>
        pub fn set_initial_number_of_users(mut self, input: std::option::Option<i32>) -> Self {
            self.initial_number_of_users = input;
            self
        }
        /// <p>Specified how many new users to spawn in a minute.</p>
        pub fn spawn_rate(mut self, input: i32) -> Self {
            self.spawn_rate = Some(input);
            self
        }
        /// <p>Specified how many new users to spawn in a minute.</p>
        pub fn set_spawn_rate(mut self, input: std::option::Option<i32>) -> Self {
            self.spawn_rate = input;
            self
        }
        /// <p>Specifies how long traffic phase should be.</p>
        pub fn duration_in_seconds(mut self, input: i32) -> Self {
            self.duration_in_seconds = Some(input);
            self
        }
        /// <p>Specifies how long traffic phase should be.</p>
        pub fn set_duration_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.duration_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`Phase`](crate::model::Phase).
        pub fn build(self) -> crate::model::Phase {
            crate::model::Phase {
                initial_number_of_users: self.initial_number_of_users,
                spawn_rate: self.spawn_rate,
                duration_in_seconds: self.duration_in_seconds,
            }
        }
    }
}
impl Phase {
    /// Creates a new builder-style object to manufacture [`Phase`](crate::model::Phase).
    pub fn builder() -> crate::model::phase::Builder {
        crate::model::phase::Builder::default()
    }
}

/// When writing a match expression against `TrafficType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let traffictype = unimplemented!();
/// match traffictype {
///     TrafficType::Phases => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `traffictype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `TrafficType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `TrafficType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `TrafficType::NewFeature` is defined.
/// Specifically, when `traffictype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `TrafficType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum TrafficType {
    #[allow(missing_docs)] // documentation missing in model
    Phases,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for TrafficType {
    fn from(s: &str) -> Self {
        match s {
            "PHASES" => TrafficType::Phases,
            other => TrafficType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for TrafficType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(TrafficType::from(s))
    }
}
impl TrafficType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            TrafficType::Phases => "PHASES",
            TrafficType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["PHASES"]
    }
}
impl AsRef<str> for TrafficType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Summary of the deployment configuration of a model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelVariantConfigSummary {
    /// <p>The name of the Amazon SageMaker Model entity.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The name of the variant.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>The configuration of the infrastructure that the model has been deployed to.</p>
    #[doc(hidden)]
    pub infrastructure_config: std::option::Option<crate::model::ModelInfrastructureConfig>,
    /// <p>The status of deployment for the model variant on the hosted inference endpoint.</p>
    /// <ul>
    /// <li> <p> <code>Creating</code> - Amazon SageMaker is preparing the model variant on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>InService</code> - The model variant is running on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>Updating</code> - Amazon SageMaker is updating the model variant on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>Deleting</code> - Amazon SageMaker is deleting the model variant on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>Deleted</code> - The model variant has been deleted on the hosted inference endpoint. This can only happen after stopping the experiment. </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::ModelVariantStatus>,
}
impl ModelVariantConfigSummary {
    /// <p>The name of the Amazon SageMaker Model entity.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The name of the variant.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>The configuration of the infrastructure that the model has been deployed to.</p>
    pub fn infrastructure_config(
        &self,
    ) -> std::option::Option<&crate::model::ModelInfrastructureConfig> {
        self.infrastructure_config.as_ref()
    }
    /// <p>The status of deployment for the model variant on the hosted inference endpoint.</p>
    /// <ul>
    /// <li> <p> <code>Creating</code> - Amazon SageMaker is preparing the model variant on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>InService</code> - The model variant is running on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>Updating</code> - Amazon SageMaker is updating the model variant on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>Deleting</code> - Amazon SageMaker is deleting the model variant on the hosted inference endpoint. </p> </li>
    /// <li> <p> <code>Deleted</code> - The model variant has been deleted on the hosted inference endpoint. This can only happen after stopping the experiment. </p> </li>
    /// </ul>
    pub fn status(&self) -> std::option::Option<&crate::model::ModelVariantStatus> {
        self.status.as_ref()
    }
}
/// See [`ModelVariantConfigSummary`](crate::model::ModelVariantConfigSummary).
pub mod model_variant_config_summary {

    /// A builder for [`ModelVariantConfigSummary`](crate::model::ModelVariantConfigSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) infrastructure_config:
            std::option::Option<crate::model::ModelInfrastructureConfig>,
        pub(crate) status: std::option::Option<crate::model::ModelVariantStatus>,
    }
    impl Builder {
        /// <p>The name of the Amazon SageMaker Model entity.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the Amazon SageMaker Model entity.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The name of the variant.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the variant.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// <p>The configuration of the infrastructure that the model has been deployed to.</p>
        pub fn infrastructure_config(
            mut self,
            input: crate::model::ModelInfrastructureConfig,
        ) -> Self {
            self.infrastructure_config = Some(input);
            self
        }
        /// <p>The configuration of the infrastructure that the model has been deployed to.</p>
        pub fn set_infrastructure_config(
            mut self,
            input: std::option::Option<crate::model::ModelInfrastructureConfig>,
        ) -> Self {
            self.infrastructure_config = input;
            self
        }
        /// <p>The status of deployment for the model variant on the hosted inference endpoint.</p>
        /// <ul>
        /// <li> <p> <code>Creating</code> - Amazon SageMaker is preparing the model variant on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>InService</code> - The model variant is running on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>Updating</code> - Amazon SageMaker is updating the model variant on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>Deleting</code> - Amazon SageMaker is deleting the model variant on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>Deleted</code> - The model variant has been deleted on the hosted inference endpoint. This can only happen after stopping the experiment. </p> </li>
        /// </ul>
        pub fn status(mut self, input: crate::model::ModelVariantStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of deployment for the model variant on the hosted inference endpoint.</p>
        /// <ul>
        /// <li> <p> <code>Creating</code> - Amazon SageMaker is preparing the model variant on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>InService</code> - The model variant is running on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>Updating</code> - Amazon SageMaker is updating the model variant on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>Deleting</code> - Amazon SageMaker is deleting the model variant on the hosted inference endpoint. </p> </li>
        /// <li> <p> <code>Deleted</code> - The model variant has been deleted on the hosted inference endpoint. This can only happen after stopping the experiment. </p> </li>
        /// </ul>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::ModelVariantStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelVariantConfigSummary`](crate::model::ModelVariantConfigSummary).
        pub fn build(self) -> crate::model::ModelVariantConfigSummary {
            crate::model::ModelVariantConfigSummary {
                model_name: self.model_name,
                variant_name: self.variant_name,
                infrastructure_config: self.infrastructure_config,
                status: self.status,
            }
        }
    }
}
impl ModelVariantConfigSummary {
    /// Creates a new builder-style object to manufacture [`ModelVariantConfigSummary`](crate::model::ModelVariantConfigSummary).
    pub fn builder() -> crate::model::model_variant_config_summary::Builder {
        crate::model::model_variant_config_summary::Builder::default()
    }
}

/// When writing a match expression against `ModelVariantStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let modelvariantstatus = unimplemented!();
/// match modelvariantstatus {
///     ModelVariantStatus::Creating => { /* ... */ },
///     ModelVariantStatus::Deleted => { /* ... */ },
///     ModelVariantStatus::Deleting => { /* ... */ },
///     ModelVariantStatus::InService => { /* ... */ },
///     ModelVariantStatus::Updating => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `modelvariantstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ModelVariantStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ModelVariantStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ModelVariantStatus::NewFeature` is defined.
/// Specifically, when `modelvariantstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ModelVariantStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ModelVariantStatus {
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    Deleted,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    #[allow(missing_docs)] // documentation missing in model
    InService,
    #[allow(missing_docs)] // documentation missing in model
    Updating,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ModelVariantStatus {
    fn from(s: &str) -> Self {
        match s {
            "Creating" => ModelVariantStatus::Creating,
            "Deleted" => ModelVariantStatus::Deleted,
            "Deleting" => ModelVariantStatus::Deleting,
            "InService" => ModelVariantStatus::InService,
            "Updating" => ModelVariantStatus::Updating,
            other => {
                ModelVariantStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ModelVariantStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ModelVariantStatus::from(s))
    }
}
impl ModelVariantStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ModelVariantStatus::Creating => "Creating",
            ModelVariantStatus::Deleted => "Deleted",
            ModelVariantStatus::Deleting => "Deleting",
            ModelVariantStatus::InService => "InService",
            ModelVariantStatus::Updating => "Updating",
            ModelVariantStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Creating", "Deleted", "Deleting", "InService", "Updating"]
    }
}
impl AsRef<str> for ModelVariantStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The metadata of the endpoint.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EndpointMetadata {
    /// <p>The name of the endpoint.</p>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
    /// <p>The name of the endpoint configuration.</p>
    #[doc(hidden)]
    pub endpoint_config_name: std::option::Option<std::string::String>,
    /// <p> The status of the endpoint. For possible values of the status of an endpoint, see <code>EndpointSummary$EndpointStatus</code>. </p>
    #[doc(hidden)]
    pub endpoint_status: std::option::Option<crate::model::EndpointStatus>,
    /// <p> If the status of the endpoint is <code>Failed</code>, or the status is <code>InService</code> but update operation fails, this provides the reason why it failed. </p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl EndpointMetadata {
    /// <p>The name of the endpoint.</p>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
    /// <p>The name of the endpoint configuration.</p>
    pub fn endpoint_config_name(&self) -> std::option::Option<&str> {
        self.endpoint_config_name.as_deref()
    }
    /// <p> The status of the endpoint. For possible values of the status of an endpoint, see <code>EndpointSummary$EndpointStatus</code>. </p>
    pub fn endpoint_status(&self) -> std::option::Option<&crate::model::EndpointStatus> {
        self.endpoint_status.as_ref()
    }
    /// <p> If the status of the endpoint is <code>Failed</code>, or the status is <code>InService</code> but update operation fails, this provides the reason why it failed. </p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`EndpointMetadata`](crate::model::EndpointMetadata).
pub mod endpoint_metadata {

    /// A builder for [`EndpointMetadata`](crate::model::EndpointMetadata).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
        pub(crate) endpoint_config_name: std::option::Option<std::string::String>,
        pub(crate) endpoint_status: std::option::Option<crate::model::EndpointStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the endpoint.</p>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint.</p>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// <p>The name of the endpoint configuration.</p>
        pub fn endpoint_config_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_config_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint configuration.</p>
        pub fn set_endpoint_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_config_name = input;
            self
        }
        /// <p> The status of the endpoint. For possible values of the status of an endpoint, see <code>EndpointSummary$EndpointStatus</code>. </p>
        pub fn endpoint_status(mut self, input: crate::model::EndpointStatus) -> Self {
            self.endpoint_status = Some(input);
            self
        }
        /// <p> The status of the endpoint. For possible values of the status of an endpoint, see <code>EndpointSummary$EndpointStatus</code>. </p>
        pub fn set_endpoint_status(
            mut self,
            input: std::option::Option<crate::model::EndpointStatus>,
        ) -> Self {
            self.endpoint_status = input;
            self
        }
        /// <p> If the status of the endpoint is <code>Failed</code>, or the status is <code>InService</code> but update operation fails, this provides the reason why it failed. </p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p> If the status of the endpoint is <code>Failed</code>, or the status is <code>InService</code> but update operation fails, this provides the reason why it failed. </p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`EndpointMetadata`](crate::model::EndpointMetadata).
        pub fn build(self) -> crate::model::EndpointMetadata {
            crate::model::EndpointMetadata {
                endpoint_name: self.endpoint_name,
                endpoint_config_name: self.endpoint_config_name,
                endpoint_status: self.endpoint_status,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl EndpointMetadata {
    /// Creates a new builder-style object to manufacture [`EndpointMetadata`](crate::model::EndpointMetadata).
    pub fn builder() -> crate::model::endpoint_metadata::Builder {
        crate::model::endpoint_metadata::Builder::default()
    }
}

/// <p>Container for user interface template information.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct UiTemplateInfo {
    /// <p>The URL for the user interface template.</p>
    #[doc(hidden)]
    pub url: std::option::Option<std::string::String>,
    /// <p>The SHA-256 digest of the contents of the template.</p>
    #[doc(hidden)]
    pub content_sha256: std::option::Option<std::string::String>,
}
impl UiTemplateInfo {
    /// <p>The URL for the user interface template.</p>
    pub fn url(&self) -> std::option::Option<&str> {
        self.url.as_deref()
    }
    /// <p>The SHA-256 digest of the contents of the template.</p>
    pub fn content_sha256(&self) -> std::option::Option<&str> {
        self.content_sha256.as_deref()
    }
}
/// See [`UiTemplateInfo`](crate::model::UiTemplateInfo).
pub mod ui_template_info {

    /// A builder for [`UiTemplateInfo`](crate::model::UiTemplateInfo).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) url: std::option::Option<std::string::String>,
        pub(crate) content_sha256: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The URL for the user interface template.</p>
        pub fn url(mut self, input: impl Into<std::string::String>) -> Self {
            self.url = Some(input.into());
            self
        }
        /// <p>The URL for the user interface template.</p>
        pub fn set_url(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.url = input;
            self
        }
        /// <p>The SHA-256 digest of the contents of the template.</p>
        pub fn content_sha256(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_sha256 = Some(input.into());
            self
        }
        /// <p>The SHA-256 digest of the contents of the template.</p>
        pub fn set_content_sha256(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.content_sha256 = input;
            self
        }
        /// Consumes the builder and constructs a [`UiTemplateInfo`](crate::model::UiTemplateInfo).
        pub fn build(self) -> crate::model::UiTemplateInfo {
            crate::model::UiTemplateInfo {
                url: self.url,
                content_sha256: self.content_sha256,
            }
        }
    }
}
impl UiTemplateInfo {
    /// Creates a new builder-style object to manufacture [`UiTemplateInfo`](crate::model::UiTemplateInfo).
    pub fn builder() -> crate::model::ui_template_info::Builder {
        crate::model::ui_template_info::Builder::default()
    }
}

/// When writing a match expression against `HumanTaskUiStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let humantaskuistatus = unimplemented!();
/// match humantaskuistatus {
///     HumanTaskUiStatus::Active => { /* ... */ },
///     HumanTaskUiStatus::Deleting => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `humantaskuistatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `HumanTaskUiStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `HumanTaskUiStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `HumanTaskUiStatus::NewFeature` is defined.
/// Specifically, when `humantaskuistatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `HumanTaskUiStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum HumanTaskUiStatus {
    #[allow(missing_docs)] // documentation missing in model
    Active,
    #[allow(missing_docs)] // documentation missing in model
    Deleting,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for HumanTaskUiStatus {
    fn from(s: &str) -> Self {
        match s {
            "Active" => HumanTaskUiStatus::Active,
            "Deleting" => HumanTaskUiStatus::Deleting,
            other => {
                HumanTaskUiStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for HumanTaskUiStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(HumanTaskUiStatus::from(s))
    }
}
impl HumanTaskUiStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            HumanTaskUiStatus::Active => "Active",
            HumanTaskUiStatus::Deleting => "Deleting",
            HumanTaskUiStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Active", "Deleting"]
    }
}
impl AsRef<str> for HumanTaskUiStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Any dependencies related to hub content, such as scripts, model artifacts, datasets, or notebooks.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HubContentDependency {
    /// <p>The hub content dependency origin path.</p>
    #[doc(hidden)]
    pub dependency_origin_path: std::option::Option<std::string::String>,
    /// <p>The hub content dependency copy path.</p>
    #[doc(hidden)]
    pub dependency_copy_path: std::option::Option<std::string::String>,
}
impl HubContentDependency {
    /// <p>The hub content dependency origin path.</p>
    pub fn dependency_origin_path(&self) -> std::option::Option<&str> {
        self.dependency_origin_path.as_deref()
    }
    /// <p>The hub content dependency copy path.</p>
    pub fn dependency_copy_path(&self) -> std::option::Option<&str> {
        self.dependency_copy_path.as_deref()
    }
}
/// See [`HubContentDependency`](crate::model::HubContentDependency).
pub mod hub_content_dependency {

    /// A builder for [`HubContentDependency`](crate::model::HubContentDependency).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) dependency_origin_path: std::option::Option<std::string::String>,
        pub(crate) dependency_copy_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The hub content dependency origin path.</p>
        pub fn dependency_origin_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.dependency_origin_path = Some(input.into());
            self
        }
        /// <p>The hub content dependency origin path.</p>
        pub fn set_dependency_origin_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.dependency_origin_path = input;
            self
        }
        /// <p>The hub content dependency copy path.</p>
        pub fn dependency_copy_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.dependency_copy_path = Some(input.into());
            self
        }
        /// <p>The hub content dependency copy path.</p>
        pub fn set_dependency_copy_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.dependency_copy_path = input;
            self
        }
        /// Consumes the builder and constructs a [`HubContentDependency`](crate::model::HubContentDependency).
        pub fn build(self) -> crate::model::HubContentDependency {
            crate::model::HubContentDependency {
                dependency_origin_path: self.dependency_origin_path,
                dependency_copy_path: self.dependency_copy_path,
            }
        }
    }
}
impl HubContentDependency {
    /// Creates a new builder-style object to manufacture [`HubContentDependency`](crate::model::HubContentDependency).
    pub fn builder() -> crate::model::hub_content_dependency::Builder {
        crate::model::hub_content_dependency::Builder::default()
    }
}

/// <p>The Amazon S3 storage configuration of a hub.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HubS3StorageConfig {
    /// <p>The Amazon S3 output path for the hub.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
}
impl HubS3StorageConfig {
    /// <p>The Amazon S3 output path for the hub.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
}
/// See [`HubS3StorageConfig`](crate::model::HubS3StorageConfig).
pub mod hub_s3_storage_config {

    /// A builder for [`HubS3StorageConfig`](crate::model::HubS3StorageConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 output path for the hub.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 output path for the hub.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// Consumes the builder and constructs a [`HubS3StorageConfig`](crate::model::HubS3StorageConfig).
        pub fn build(self) -> crate::model::HubS3StorageConfig {
            crate::model::HubS3StorageConfig {
                s3_output_path: self.s3_output_path,
            }
        }
    }
}
impl HubS3StorageConfig {
    /// Creates a new builder-style object to manufacture [`HubS3StorageConfig`](crate::model::HubS3StorageConfig).
    pub fn builder() -> crate::model::hub_s3_storage_config::Builder {
        crate::model::hub_s3_storage_config::Builder::default()
    }
}

/// <p>Contains information about where human output will be stored.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct FlowDefinitionOutputConfig {
    /// <p>The Amazon S3 path where the object containing human output will be made available.</p>
    /// <p>To learn more about the format of Amazon A2I output data, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-output-data.html">Amazon A2I Output Data</a>.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>The Amazon Key Management Service (KMS) key ID for server-side encryption.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl FlowDefinitionOutputConfig {
    /// <p>The Amazon S3 path where the object containing human output will be made available.</p>
    /// <p>To learn more about the format of Amazon A2I output data, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-output-data.html">Amazon A2I Output Data</a>.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>The Amazon Key Management Service (KMS) key ID for server-side encryption.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`FlowDefinitionOutputConfig`](crate::model::FlowDefinitionOutputConfig).
pub mod flow_definition_output_config {

    /// A builder for [`FlowDefinitionOutputConfig`](crate::model::FlowDefinitionOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 path where the object containing human output will be made available.</p>
        /// <p>To learn more about the format of Amazon A2I output data, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-output-data.html">Amazon A2I Output Data</a>.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 path where the object containing human output will be made available.</p>
        /// <p>To learn more about the format of Amazon A2I output data, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-output-data.html">Amazon A2I Output Data</a>.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>The Amazon Key Management Service (KMS) key ID for server-side encryption.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Key Management Service (KMS) key ID for server-side encryption.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`FlowDefinitionOutputConfig`](crate::model::FlowDefinitionOutputConfig).
        pub fn build(self) -> crate::model::FlowDefinitionOutputConfig {
            crate::model::FlowDefinitionOutputConfig {
                s3_output_path: self.s3_output_path,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl FlowDefinitionOutputConfig {
    /// Creates a new builder-style object to manufacture [`FlowDefinitionOutputConfig`](crate::model::FlowDefinitionOutputConfig).
    pub fn builder() -> crate::model::flow_definition_output_config::Builder {
        crate::model::flow_definition_output_config::Builder::default()
    }
}

/// <p>Describes the work to be performed by human workers.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HumanLoopConfig {
    /// <p>Amazon Resource Name (ARN) of a team of workers. To learn more about the types of workforces and work teams you can create and use with Amazon A2I, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-workforce-management.html">Create and Manage Workforces</a>.</p>
    #[doc(hidden)]
    pub workteam_arn: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
    /// <p>You can use standard HTML and Crowd HTML Elements to create a custom worker task template. You use this template to create a human task UI.</p>
    /// <p>To learn how to create a custom HTML template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-custom-templates.html">Create Custom Worker Task Template</a>.</p>
    /// <p>To learn how to create a human task UI, which is a worker task template that can be used in a flow definition, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-worker-template-console.html">Create and Delete a Worker Task Templates</a>.</p>
    #[doc(hidden)]
    pub human_task_ui_arn: std::option::Option<std::string::String>,
    /// <p>A title for the human worker task.</p>
    #[doc(hidden)]
    pub task_title: std::option::Option<std::string::String>,
    /// <p>A description for the human worker task.</p>
    #[doc(hidden)]
    pub task_description: std::option::Option<std::string::String>,
    /// <p>The number of distinct workers who will perform the same task on each object. For example, if <code>TaskCount</code> is set to <code>3</code> for an image classification labeling job, three workers will classify each input image. Increasing <code>TaskCount</code> can improve label accuracy.</p>
    #[doc(hidden)]
    pub task_count: std::option::Option<i32>,
    /// <p>The length of time that a task remains available for review by human workers.</p>
    #[doc(hidden)]
    pub task_availability_lifetime_in_seconds: std::option::Option<i32>,
    /// <p>The amount of time that a worker has to complete a task. The default value is 3,600 seconds (1 hour).</p>
    #[doc(hidden)]
    pub task_time_limit_in_seconds: std::option::Option<i32>,
    /// <p>Keywords used to describe the task so that workers can discover the task.</p>
    #[doc(hidden)]
    pub task_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker for each task performed. </p>
    /// <p>Use one of the following prices for bounding box tasks. Prices are in US dollars and should be based on the complexity of the task; the longer it takes in your initial testing, the more you should offer.</p>
    /// <ul>
    /// <li> <p>0.036</p> </li>
    /// <li> <p>0.048</p> </li>
    /// <li> <p>0.060</p> </li>
    /// <li> <p>0.072</p> </li>
    /// <li> <p>0.120</p> </li>
    /// <li> <p>0.240</p> </li>
    /// <li> <p>0.360</p> </li>
    /// <li> <p>0.480</p> </li>
    /// <li> <p>0.600</p> </li>
    /// <li> <p>0.720</p> </li>
    /// <li> <p>0.840</p> </li>
    /// <li> <p>0.960</p> </li>
    /// <li> <p>1.080</p> </li>
    /// <li> <p>1.200</p> </li>
    /// </ul>
    /// <p>Use one of the following prices for image classification, text classification, and custom tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>0.012</p> </li>
    /// <li> <p>0.024</p> </li>
    /// <li> <p>0.036</p> </li>
    /// <li> <p>0.048</p> </li>
    /// <li> <p>0.060</p> </li>
    /// <li> <p>0.072</p> </li>
    /// <li> <p>0.120</p> </li>
    /// <li> <p>0.240</p> </li>
    /// <li> <p>0.360</p> </li>
    /// <li> <p>0.480</p> </li>
    /// <li> <p>0.600</p> </li>
    /// <li> <p>0.720</p> </li>
    /// <li> <p>0.840</p> </li>
    /// <li> <p>0.960</p> </li>
    /// <li> <p>1.080</p> </li>
    /// <li> <p>1.200</p> </li>
    /// </ul>
    /// <p>Use one of the following prices for semantic segmentation tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>0.840</p> </li>
    /// <li> <p>0.960</p> </li>
    /// <li> <p>1.080</p> </li>
    /// <li> <p>1.200</p> </li>
    /// </ul>
    /// <p>Use one of the following prices for Textract AnalyzeDocument Important Form Key Amazon Augmented AI review tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>2.400 </p> </li>
    /// <li> <p>2.280 </p> </li>
    /// <li> <p>2.160 </p> </li>
    /// <li> <p>2.040 </p> </li>
    /// <li> <p>1.920 </p> </li>
    /// <li> <p>1.800 </p> </li>
    /// <li> <p>1.680 </p> </li>
    /// <li> <p>1.560 </p> </li>
    /// <li> <p>1.440 </p> </li>
    /// <li> <p>1.320 </p> </li>
    /// <li> <p>1.200 </p> </li>
    /// <li> <p>1.080 </p> </li>
    /// <li> <p>0.960 </p> </li>
    /// <li> <p>0.840 </p> </li>
    /// <li> <p>0.720 </p> </li>
    /// <li> <p>0.600 </p> </li>
    /// <li> <p>0.480 </p> </li>
    /// <li> <p>0.360 </p> </li>
    /// <li> <p>0.240 </p> </li>
    /// <li> <p>0.120 </p> </li>
    /// <li> <p>0.072 </p> </li>
    /// <li> <p>0.060 </p> </li>
    /// <li> <p>0.048 </p> </li>
    /// <li> <p>0.036 </p> </li>
    /// <li> <p>0.024 </p> </li>
    /// <li> <p>0.012 </p> </li>
    /// </ul>
    /// <p>Use one of the following prices for Rekognition DetectModerationLabels Amazon Augmented AI review tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>1.200 </p> </li>
    /// <li> <p>1.080 </p> </li>
    /// <li> <p>0.960 </p> </li>
    /// <li> <p>0.840 </p> </li>
    /// <li> <p>0.720 </p> </li>
    /// <li> <p>0.600 </p> </li>
    /// <li> <p>0.480 </p> </li>
    /// <li> <p>0.360 </p> </li>
    /// <li> <p>0.240 </p> </li>
    /// <li> <p>0.120 </p> </li>
    /// <li> <p>0.072 </p> </li>
    /// <li> <p>0.060 </p> </li>
    /// <li> <p>0.048 </p> </li>
    /// <li> <p>0.036 </p> </li>
    /// <li> <p>0.024 </p> </li>
    /// <li> <p>0.012 </p> </li>
    /// </ul>
    /// <p>Use one of the following prices for Amazon Augmented AI custom human review tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>1.200 </p> </li>
    /// <li> <p>1.080 </p> </li>
    /// <li> <p>0.960 </p> </li>
    /// <li> <p>0.840 </p> </li>
    /// <li> <p>0.720 </p> </li>
    /// <li> <p>0.600 </p> </li>
    /// <li> <p>0.480 </p> </li>
    /// <li> <p>0.360 </p> </li>
    /// <li> <p>0.240 </p> </li>
    /// <li> <p>0.120 </p> </li>
    /// <li> <p>0.072 </p> </li>
    /// <li> <p>0.060 </p> </li>
    /// <li> <p>0.048 </p> </li>
    /// <li> <p>0.036 </p> </li>
    /// <li> <p>0.024 </p> </li>
    /// <li> <p>0.012 </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub public_workforce_task_price: std::option::Option<crate::model::PublicWorkforceTaskPrice>,
}
impl HumanLoopConfig {
    /// <p>Amazon Resource Name (ARN) of a team of workers. To learn more about the types of workforces and work teams you can create and use with Amazon A2I, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-workforce-management.html">Create and Manage Workforces</a>.</p>
    pub fn workteam_arn(&self) -> std::option::Option<&str> {
        self.workteam_arn.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
    /// <p>You can use standard HTML and Crowd HTML Elements to create a custom worker task template. You use this template to create a human task UI.</p>
    /// <p>To learn how to create a custom HTML template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-custom-templates.html">Create Custom Worker Task Template</a>.</p>
    /// <p>To learn how to create a human task UI, which is a worker task template that can be used in a flow definition, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-worker-template-console.html">Create and Delete a Worker Task Templates</a>.</p>
    pub fn human_task_ui_arn(&self) -> std::option::Option<&str> {
        self.human_task_ui_arn.as_deref()
    }
    /// <p>A title for the human worker task.</p>
    pub fn task_title(&self) -> std::option::Option<&str> {
        self.task_title.as_deref()
    }
    /// <p>A description for the human worker task.</p>
    pub fn task_description(&self) -> std::option::Option<&str> {
        self.task_description.as_deref()
    }
    /// <p>The number of distinct workers who will perform the same task on each object. For example, if <code>TaskCount</code> is set to <code>3</code> for an image classification labeling job, three workers will classify each input image. Increasing <code>TaskCount</code> can improve label accuracy.</p>
    pub fn task_count(&self) -> std::option::Option<i32> {
        self.task_count
    }
    /// <p>The length of time that a task remains available for review by human workers.</p>
    pub fn task_availability_lifetime_in_seconds(&self) -> std::option::Option<i32> {
        self.task_availability_lifetime_in_seconds
    }
    /// <p>The amount of time that a worker has to complete a task. The default value is 3,600 seconds (1 hour).</p>
    pub fn task_time_limit_in_seconds(&self) -> std::option::Option<i32> {
        self.task_time_limit_in_seconds
    }
    /// <p>Keywords used to describe the task so that workers can discover the task.</p>
    pub fn task_keywords(&self) -> std::option::Option<&[std::string::String]> {
        self.task_keywords.as_deref()
    }
    /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker for each task performed. </p>
    /// <p>Use one of the following prices for bounding box tasks. Prices are in US dollars and should be based on the complexity of the task; the longer it takes in your initial testing, the more you should offer.</p>
    /// <ul>
    /// <li> <p>0.036</p> </li>
    /// <li> <p>0.048</p> </li>
    /// <li> <p>0.060</p> </li>
    /// <li> <p>0.072</p> </li>
    /// <li> <p>0.120</p> </li>
    /// <li> <p>0.240</p> </li>
    /// <li> <p>0.360</p> </li>
    /// <li> <p>0.480</p> </li>
    /// <li> <p>0.600</p> </li>
    /// <li> <p>0.720</p> </li>
    /// <li> <p>0.840</p> </li>
    /// <li> <p>0.960</p> </li>
    /// <li> <p>1.080</p> </li>
    /// <li> <p>1.200</p> </li>
    /// </ul>
    /// <p>Use one of the following prices for image classification, text classification, and custom tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>0.012</p> </li>
    /// <li> <p>0.024</p> </li>
    /// <li> <p>0.036</p> </li>
    /// <li> <p>0.048</p> </li>
    /// <li> <p>0.060</p> </li>
    /// <li> <p>0.072</p> </li>
    /// <li> <p>0.120</p> </li>
    /// <li> <p>0.240</p> </li>
    /// <li> <p>0.360</p> </li>
    /// <li> <p>0.480</p> </li>
    /// <li> <p>0.600</p> </li>
    /// <li> <p>0.720</p> </li>
    /// <li> <p>0.840</p> </li>
    /// <li> <p>0.960</p> </li>
    /// <li> <p>1.080</p> </li>
    /// <li> <p>1.200</p> </li>
    /// </ul>
    /// <p>Use one of the following prices for semantic segmentation tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>0.840</p> </li>
    /// <li> <p>0.960</p> </li>
    /// <li> <p>1.080</p> </li>
    /// <li> <p>1.200</p> </li>
    /// </ul>
    /// <p>Use one of the following prices for Textract AnalyzeDocument Important Form Key Amazon Augmented AI review tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>2.400 </p> </li>
    /// <li> <p>2.280 </p> </li>
    /// <li> <p>2.160 </p> </li>
    /// <li> <p>2.040 </p> </li>
    /// <li> <p>1.920 </p> </li>
    /// <li> <p>1.800 </p> </li>
    /// <li> <p>1.680 </p> </li>
    /// <li> <p>1.560 </p> </li>
    /// <li> <p>1.440 </p> </li>
    /// <li> <p>1.320 </p> </li>
    /// <li> <p>1.200 </p> </li>
    /// <li> <p>1.080 </p> </li>
    /// <li> <p>0.960 </p> </li>
    /// <li> <p>0.840 </p> </li>
    /// <li> <p>0.720 </p> </li>
    /// <li> <p>0.600 </p> </li>
    /// <li> <p>0.480 </p> </li>
    /// <li> <p>0.360 </p> </li>
    /// <li> <p>0.240 </p> </li>
    /// <li> <p>0.120 </p> </li>
    /// <li> <p>0.072 </p> </li>
    /// <li> <p>0.060 </p> </li>
    /// <li> <p>0.048 </p> </li>
    /// <li> <p>0.036 </p> </li>
    /// <li> <p>0.024 </p> </li>
    /// <li> <p>0.012 </p> </li>
    /// </ul>
    /// <p>Use one of the following prices for Rekognition DetectModerationLabels Amazon Augmented AI review tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>1.200 </p> </li>
    /// <li> <p>1.080 </p> </li>
    /// <li> <p>0.960 </p> </li>
    /// <li> <p>0.840 </p> </li>
    /// <li> <p>0.720 </p> </li>
    /// <li> <p>0.600 </p> </li>
    /// <li> <p>0.480 </p> </li>
    /// <li> <p>0.360 </p> </li>
    /// <li> <p>0.240 </p> </li>
    /// <li> <p>0.120 </p> </li>
    /// <li> <p>0.072 </p> </li>
    /// <li> <p>0.060 </p> </li>
    /// <li> <p>0.048 </p> </li>
    /// <li> <p>0.036 </p> </li>
    /// <li> <p>0.024 </p> </li>
    /// <li> <p>0.012 </p> </li>
    /// </ul>
    /// <p>Use one of the following prices for Amazon Augmented AI custom human review tasks. Prices are in US dollars.</p>
    /// <ul>
    /// <li> <p>1.200 </p> </li>
    /// <li> <p>1.080 </p> </li>
    /// <li> <p>0.960 </p> </li>
    /// <li> <p>0.840 </p> </li>
    /// <li> <p>0.720 </p> </li>
    /// <li> <p>0.600 </p> </li>
    /// <li> <p>0.480 </p> </li>
    /// <li> <p>0.360 </p> </li>
    /// <li> <p>0.240 </p> </li>
    /// <li> <p>0.120 </p> </li>
    /// <li> <p>0.072 </p> </li>
    /// <li> <p>0.060 </p> </li>
    /// <li> <p>0.048 </p> </li>
    /// <li> <p>0.036 </p> </li>
    /// <li> <p>0.024 </p> </li>
    /// <li> <p>0.012 </p> </li>
    /// </ul>
    pub fn public_workforce_task_price(
        &self,
    ) -> std::option::Option<&crate::model::PublicWorkforceTaskPrice> {
        self.public_workforce_task_price.as_ref()
    }
}
/// See [`HumanLoopConfig`](crate::model::HumanLoopConfig).
pub mod human_loop_config {

    /// A builder for [`HumanLoopConfig`](crate::model::HumanLoopConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) workteam_arn: std::option::Option<std::string::String>,
        pub(crate) human_task_ui_arn: std::option::Option<std::string::String>,
        pub(crate) task_title: std::option::Option<std::string::String>,
        pub(crate) task_description: std::option::Option<std::string::String>,
        pub(crate) task_count: std::option::Option<i32>,
        pub(crate) task_availability_lifetime_in_seconds: std::option::Option<i32>,
        pub(crate) task_time_limit_in_seconds: std::option::Option<i32>,
        pub(crate) task_keywords: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) public_workforce_task_price:
            std::option::Option<crate::model::PublicWorkforceTaskPrice>,
    }
    impl Builder {
        /// <p>Amazon Resource Name (ARN) of a team of workers. To learn more about the types of workforces and work teams you can create and use with Amazon A2I, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-workforce-management.html">Create and Manage Workforces</a>.</p>
        pub fn workteam_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.workteam_arn = Some(input.into());
            self
        }
        /// <p>Amazon Resource Name (ARN) of a team of workers. To learn more about the types of workforces and work teams you can create and use with Amazon A2I, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/sms-workforce-management.html">Create and Manage Workforces</a>.</p>
        pub fn set_workteam_arn(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.workteam_arn = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
        /// <p>You can use standard HTML and Crowd HTML Elements to create a custom worker task template. You use this template to create a human task UI.</p>
        /// <p>To learn how to create a custom HTML template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-custom-templates.html">Create Custom Worker Task Template</a>.</p>
        /// <p>To learn how to create a human task UI, which is a worker task template that can be used in a flow definition, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-worker-template-console.html">Create and Delete a Worker Task Templates</a>.</p>
        pub fn human_task_ui_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.human_task_ui_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the human task user interface.</p>
        /// <p>You can use standard HTML and Crowd HTML Elements to create a custom worker task template. You use this template to create a human task UI.</p>
        /// <p>To learn how to create a custom HTML template, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-custom-templates.html">Create Custom Worker Task Template</a>.</p>
        /// <p>To learn how to create a human task UI, which is a worker task template that can be used in a flow definition, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-worker-template-console.html">Create and Delete a Worker Task Templates</a>.</p>
        pub fn set_human_task_ui_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.human_task_ui_arn = input;
            self
        }
        /// <p>A title for the human worker task.</p>
        pub fn task_title(mut self, input: impl Into<std::string::String>) -> Self {
            self.task_title = Some(input.into());
            self
        }
        /// <p>A title for the human worker task.</p>
        pub fn set_task_title(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.task_title = input;
            self
        }
        /// <p>A description for the human worker task.</p>
        pub fn task_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.task_description = Some(input.into());
            self
        }
        /// <p>A description for the human worker task.</p>
        pub fn set_task_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.task_description = input;
            self
        }
        /// <p>The number of distinct workers who will perform the same task on each object. For example, if <code>TaskCount</code> is set to <code>3</code> for an image classification labeling job, three workers will classify each input image. Increasing <code>TaskCount</code> can improve label accuracy.</p>
        pub fn task_count(mut self, input: i32) -> Self {
            self.task_count = Some(input);
            self
        }
        /// <p>The number of distinct workers who will perform the same task on each object. For example, if <code>TaskCount</code> is set to <code>3</code> for an image classification labeling job, three workers will classify each input image. Increasing <code>TaskCount</code> can improve label accuracy.</p>
        pub fn set_task_count(mut self, input: std::option::Option<i32>) -> Self {
            self.task_count = input;
            self
        }
        /// <p>The length of time that a task remains available for review by human workers.</p>
        pub fn task_availability_lifetime_in_seconds(mut self, input: i32) -> Self {
            self.task_availability_lifetime_in_seconds = Some(input);
            self
        }
        /// <p>The length of time that a task remains available for review by human workers.</p>
        pub fn set_task_availability_lifetime_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.task_availability_lifetime_in_seconds = input;
            self
        }
        /// <p>The amount of time that a worker has to complete a task. The default value is 3,600 seconds (1 hour).</p>
        pub fn task_time_limit_in_seconds(mut self, input: i32) -> Self {
            self.task_time_limit_in_seconds = Some(input);
            self
        }
        /// <p>The amount of time that a worker has to complete a task. The default value is 3,600 seconds (1 hour).</p>
        pub fn set_task_time_limit_in_seconds(mut self, input: std::option::Option<i32>) -> Self {
            self.task_time_limit_in_seconds = input;
            self
        }
        /// Appends an item to `task_keywords`.
        ///
        /// To override the contents of this collection use [`set_task_keywords`](Self::set_task_keywords).
        ///
        /// <p>Keywords used to describe the task so that workers can discover the task.</p>
        pub fn task_keywords(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.task_keywords.unwrap_or_default();
            v.push(input.into());
            self.task_keywords = Some(v);
            self
        }
        /// <p>Keywords used to describe the task so that workers can discover the task.</p>
        pub fn set_task_keywords(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.task_keywords = input;
            self
        }
        /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker for each task performed. </p>
        /// <p>Use one of the following prices for bounding box tasks. Prices are in US dollars and should be based on the complexity of the task; the longer it takes in your initial testing, the more you should offer.</p>
        /// <ul>
        /// <li> <p>0.036</p> </li>
        /// <li> <p>0.048</p> </li>
        /// <li> <p>0.060</p> </li>
        /// <li> <p>0.072</p> </li>
        /// <li> <p>0.120</p> </li>
        /// <li> <p>0.240</p> </li>
        /// <li> <p>0.360</p> </li>
        /// <li> <p>0.480</p> </li>
        /// <li> <p>0.600</p> </li>
        /// <li> <p>0.720</p> </li>
        /// <li> <p>0.840</p> </li>
        /// <li> <p>0.960</p> </li>
        /// <li> <p>1.080</p> </li>
        /// <li> <p>1.200</p> </li>
        /// </ul>
        /// <p>Use one of the following prices for image classification, text classification, and custom tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>0.012</p> </li>
        /// <li> <p>0.024</p> </li>
        /// <li> <p>0.036</p> </li>
        /// <li> <p>0.048</p> </li>
        /// <li> <p>0.060</p> </li>
        /// <li> <p>0.072</p> </li>
        /// <li> <p>0.120</p> </li>
        /// <li> <p>0.240</p> </li>
        /// <li> <p>0.360</p> </li>
        /// <li> <p>0.480</p> </li>
        /// <li> <p>0.600</p> </li>
        /// <li> <p>0.720</p> </li>
        /// <li> <p>0.840</p> </li>
        /// <li> <p>0.960</p> </li>
        /// <li> <p>1.080</p> </li>
        /// <li> <p>1.200</p> </li>
        /// </ul>
        /// <p>Use one of the following prices for semantic segmentation tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>0.840</p> </li>
        /// <li> <p>0.960</p> </li>
        /// <li> <p>1.080</p> </li>
        /// <li> <p>1.200</p> </li>
        /// </ul>
        /// <p>Use one of the following prices for Textract AnalyzeDocument Important Form Key Amazon Augmented AI review tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>2.400 </p> </li>
        /// <li> <p>2.280 </p> </li>
        /// <li> <p>2.160 </p> </li>
        /// <li> <p>2.040 </p> </li>
        /// <li> <p>1.920 </p> </li>
        /// <li> <p>1.800 </p> </li>
        /// <li> <p>1.680 </p> </li>
        /// <li> <p>1.560 </p> </li>
        /// <li> <p>1.440 </p> </li>
        /// <li> <p>1.320 </p> </li>
        /// <li> <p>1.200 </p> </li>
        /// <li> <p>1.080 </p> </li>
        /// <li> <p>0.960 </p> </li>
        /// <li> <p>0.840 </p> </li>
        /// <li> <p>0.720 </p> </li>
        /// <li> <p>0.600 </p> </li>
        /// <li> <p>0.480 </p> </li>
        /// <li> <p>0.360 </p> </li>
        /// <li> <p>0.240 </p> </li>
        /// <li> <p>0.120 </p> </li>
        /// <li> <p>0.072 </p> </li>
        /// <li> <p>0.060 </p> </li>
        /// <li> <p>0.048 </p> </li>
        /// <li> <p>0.036 </p> </li>
        /// <li> <p>0.024 </p> </li>
        /// <li> <p>0.012 </p> </li>
        /// </ul>
        /// <p>Use one of the following prices for Rekognition DetectModerationLabels Amazon Augmented AI review tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>1.200 </p> </li>
        /// <li> <p>1.080 </p> </li>
        /// <li> <p>0.960 </p> </li>
        /// <li> <p>0.840 </p> </li>
        /// <li> <p>0.720 </p> </li>
        /// <li> <p>0.600 </p> </li>
        /// <li> <p>0.480 </p> </li>
        /// <li> <p>0.360 </p> </li>
        /// <li> <p>0.240 </p> </li>
        /// <li> <p>0.120 </p> </li>
        /// <li> <p>0.072 </p> </li>
        /// <li> <p>0.060 </p> </li>
        /// <li> <p>0.048 </p> </li>
        /// <li> <p>0.036 </p> </li>
        /// <li> <p>0.024 </p> </li>
        /// <li> <p>0.012 </p> </li>
        /// </ul>
        /// <p>Use one of the following prices for Amazon Augmented AI custom human review tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>1.200 </p> </li>
        /// <li> <p>1.080 </p> </li>
        /// <li> <p>0.960 </p> </li>
        /// <li> <p>0.840 </p> </li>
        /// <li> <p>0.720 </p> </li>
        /// <li> <p>0.600 </p> </li>
        /// <li> <p>0.480 </p> </li>
        /// <li> <p>0.360 </p> </li>
        /// <li> <p>0.240 </p> </li>
        /// <li> <p>0.120 </p> </li>
        /// <li> <p>0.072 </p> </li>
        /// <li> <p>0.060 </p> </li>
        /// <li> <p>0.048 </p> </li>
        /// <li> <p>0.036 </p> </li>
        /// <li> <p>0.024 </p> </li>
        /// <li> <p>0.012 </p> </li>
        /// </ul>
        pub fn public_workforce_task_price(
            mut self,
            input: crate::model::PublicWorkforceTaskPrice,
        ) -> Self {
            self.public_workforce_task_price = Some(input);
            self
        }
        /// <p>Defines the amount of money paid to an Amazon Mechanical Turk worker for each task performed. </p>
        /// <p>Use one of the following prices for bounding box tasks. Prices are in US dollars and should be based on the complexity of the task; the longer it takes in your initial testing, the more you should offer.</p>
        /// <ul>
        /// <li> <p>0.036</p> </li>
        /// <li> <p>0.048</p> </li>
        /// <li> <p>0.060</p> </li>
        /// <li> <p>0.072</p> </li>
        /// <li> <p>0.120</p> </li>
        /// <li> <p>0.240</p> </li>
        /// <li> <p>0.360</p> </li>
        /// <li> <p>0.480</p> </li>
        /// <li> <p>0.600</p> </li>
        /// <li> <p>0.720</p> </li>
        /// <li> <p>0.840</p> </li>
        /// <li> <p>0.960</p> </li>
        /// <li> <p>1.080</p> </li>
        /// <li> <p>1.200</p> </li>
        /// </ul>
        /// <p>Use one of the following prices for image classification, text classification, and custom tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>0.012</p> </li>
        /// <li> <p>0.024</p> </li>
        /// <li> <p>0.036</p> </li>
        /// <li> <p>0.048</p> </li>
        /// <li> <p>0.060</p> </li>
        /// <li> <p>0.072</p> </li>
        /// <li> <p>0.120</p> </li>
        /// <li> <p>0.240</p> </li>
        /// <li> <p>0.360</p> </li>
        /// <li> <p>0.480</p> </li>
        /// <li> <p>0.600</p> </li>
        /// <li> <p>0.720</p> </li>
        /// <li> <p>0.840</p> </li>
        /// <li> <p>0.960</p> </li>
        /// <li> <p>1.080</p> </li>
        /// <li> <p>1.200</p> </li>
        /// </ul>
        /// <p>Use one of the following prices for semantic segmentation tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>0.840</p> </li>
        /// <li> <p>0.960</p> </li>
        /// <li> <p>1.080</p> </li>
        /// <li> <p>1.200</p> </li>
        /// </ul>
        /// <p>Use one of the following prices for Textract AnalyzeDocument Important Form Key Amazon Augmented AI review tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>2.400 </p> </li>
        /// <li> <p>2.280 </p> </li>
        /// <li> <p>2.160 </p> </li>
        /// <li> <p>2.040 </p> </li>
        /// <li> <p>1.920 </p> </li>
        /// <li> <p>1.800 </p> </li>
        /// <li> <p>1.680 </p> </li>
        /// <li> <p>1.560 </p> </li>
        /// <li> <p>1.440 </p> </li>
        /// <li> <p>1.320 </p> </li>
        /// <li> <p>1.200 </p> </li>
        /// <li> <p>1.080 </p> </li>
        /// <li> <p>0.960 </p> </li>
        /// <li> <p>0.840 </p> </li>
        /// <li> <p>0.720 </p> </li>
        /// <li> <p>0.600 </p> </li>
        /// <li> <p>0.480 </p> </li>
        /// <li> <p>0.360 </p> </li>
        /// <li> <p>0.240 </p> </li>
        /// <li> <p>0.120 </p> </li>
        /// <li> <p>0.072 </p> </li>
        /// <li> <p>0.060 </p> </li>
        /// <li> <p>0.048 </p> </li>
        /// <li> <p>0.036 </p> </li>
        /// <li> <p>0.024 </p> </li>
        /// <li> <p>0.012 </p> </li>
        /// </ul>
        /// <p>Use one of the following prices for Rekognition DetectModerationLabels Amazon Augmented AI review tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>1.200 </p> </li>
        /// <li> <p>1.080 </p> </li>
        /// <li> <p>0.960 </p> </li>
        /// <li> <p>0.840 </p> </li>
        /// <li> <p>0.720 </p> </li>
        /// <li> <p>0.600 </p> </li>
        /// <li> <p>0.480 </p> </li>
        /// <li> <p>0.360 </p> </li>
        /// <li> <p>0.240 </p> </li>
        /// <li> <p>0.120 </p> </li>
        /// <li> <p>0.072 </p> </li>
        /// <li> <p>0.060 </p> </li>
        /// <li> <p>0.048 </p> </li>
        /// <li> <p>0.036 </p> </li>
        /// <li> <p>0.024 </p> </li>
        /// <li> <p>0.012 </p> </li>
        /// </ul>
        /// <p>Use one of the following prices for Amazon Augmented AI custom human review tasks. Prices are in US dollars.</p>
        /// <ul>
        /// <li> <p>1.200 </p> </li>
        /// <li> <p>1.080 </p> </li>
        /// <li> <p>0.960 </p> </li>
        /// <li> <p>0.840 </p> </li>
        /// <li> <p>0.720 </p> </li>
        /// <li> <p>0.600 </p> </li>
        /// <li> <p>0.480 </p> </li>
        /// <li> <p>0.360 </p> </li>
        /// <li> <p>0.240 </p> </li>
        /// <li> <p>0.120 </p> </li>
        /// <li> <p>0.072 </p> </li>
        /// <li> <p>0.060 </p> </li>
        /// <li> <p>0.048 </p> </li>
        /// <li> <p>0.036 </p> </li>
        /// <li> <p>0.024 </p> </li>
        /// <li> <p>0.012 </p> </li>
        /// </ul>
        pub fn set_public_workforce_task_price(
            mut self,
            input: std::option::Option<crate::model::PublicWorkforceTaskPrice>,
        ) -> Self {
            self.public_workforce_task_price = input;
            self
        }
        /// Consumes the builder and constructs a [`HumanLoopConfig`](crate::model::HumanLoopConfig).
        pub fn build(self) -> crate::model::HumanLoopConfig {
            crate::model::HumanLoopConfig {
                workteam_arn: self.workteam_arn,
                human_task_ui_arn: self.human_task_ui_arn,
                task_title: self.task_title,
                task_description: self.task_description,
                task_count: self.task_count,
                task_availability_lifetime_in_seconds: self.task_availability_lifetime_in_seconds,
                task_time_limit_in_seconds: self.task_time_limit_in_seconds,
                task_keywords: self.task_keywords,
                public_workforce_task_price: self.public_workforce_task_price,
            }
        }
    }
}
impl HumanLoopConfig {
    /// Creates a new builder-style object to manufacture [`HumanLoopConfig`](crate::model::HumanLoopConfig).
    pub fn builder() -> crate::model::human_loop_config::Builder {
        crate::model::human_loop_config::Builder::default()
    }
}

/// <p>Provides information about how and under what conditions SageMaker creates a human loop. If <code>HumanLoopActivationConfig</code> is not given, then all requests go to humans.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HumanLoopActivationConfig {
    /// <p>Container structure for defining under what conditions SageMaker creates a human loop.</p>
    #[doc(hidden)]
    pub human_loop_activation_conditions_config:
        std::option::Option<crate::model::HumanLoopActivationConditionsConfig>,
}
impl HumanLoopActivationConfig {
    /// <p>Container structure for defining under what conditions SageMaker creates a human loop.</p>
    pub fn human_loop_activation_conditions_config(
        &self,
    ) -> std::option::Option<&crate::model::HumanLoopActivationConditionsConfig> {
        self.human_loop_activation_conditions_config.as_ref()
    }
}
/// See [`HumanLoopActivationConfig`](crate::model::HumanLoopActivationConfig).
pub mod human_loop_activation_config {

    /// A builder for [`HumanLoopActivationConfig`](crate::model::HumanLoopActivationConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) human_loop_activation_conditions_config:
            std::option::Option<crate::model::HumanLoopActivationConditionsConfig>,
    }
    impl Builder {
        /// <p>Container structure for defining under what conditions SageMaker creates a human loop.</p>
        pub fn human_loop_activation_conditions_config(
            mut self,
            input: crate::model::HumanLoopActivationConditionsConfig,
        ) -> Self {
            self.human_loop_activation_conditions_config = Some(input);
            self
        }
        /// <p>Container structure for defining under what conditions SageMaker creates a human loop.</p>
        pub fn set_human_loop_activation_conditions_config(
            mut self,
            input: std::option::Option<crate::model::HumanLoopActivationConditionsConfig>,
        ) -> Self {
            self.human_loop_activation_conditions_config = input;
            self
        }
        /// Consumes the builder and constructs a [`HumanLoopActivationConfig`](crate::model::HumanLoopActivationConfig).
        pub fn build(self) -> crate::model::HumanLoopActivationConfig {
            crate::model::HumanLoopActivationConfig {
                human_loop_activation_conditions_config: self
                    .human_loop_activation_conditions_config,
            }
        }
    }
}
impl HumanLoopActivationConfig {
    /// Creates a new builder-style object to manufacture [`HumanLoopActivationConfig`](crate::model::HumanLoopActivationConfig).
    pub fn builder() -> crate::model::human_loop_activation_config::Builder {
        crate::model::human_loop_activation_config::Builder::default()
    }
}

/// <p>Defines under what conditions SageMaker creates a human loop. Used within . See for the required format of activation conditions.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HumanLoopActivationConditionsConfig {
    /// <p>JSON expressing use-case specific conditions declaratively. If any condition is matched, atomic tasks are created against the configured work team. The set of conditions is different for Rekognition and Textract. For more information about how to structure the JSON, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-human-fallback-conditions-json-schema.html">JSON Schema for Human Loop Activation Conditions in Amazon Augmented AI</a> in the <i>Amazon SageMaker Developer Guide</i>.</p>
    #[doc(hidden)]
    pub human_loop_activation_conditions: std::option::Option<std::string::String>,
}
impl HumanLoopActivationConditionsConfig {
    /// <p>JSON expressing use-case specific conditions declaratively. If any condition is matched, atomic tasks are created against the configured work team. The set of conditions is different for Rekognition and Textract. For more information about how to structure the JSON, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-human-fallback-conditions-json-schema.html">JSON Schema for Human Loop Activation Conditions in Amazon Augmented AI</a> in the <i>Amazon SageMaker Developer Guide</i>.</p>
    pub fn human_loop_activation_conditions(&self) -> std::option::Option<&str> {
        self.human_loop_activation_conditions.as_deref()
    }
}
/// See [`HumanLoopActivationConditionsConfig`](crate::model::HumanLoopActivationConditionsConfig).
pub mod human_loop_activation_conditions_config {

    /// A builder for [`HumanLoopActivationConditionsConfig`](crate::model::HumanLoopActivationConditionsConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) human_loop_activation_conditions: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>JSON expressing use-case specific conditions declaratively. If any condition is matched, atomic tasks are created against the configured work team. The set of conditions is different for Rekognition and Textract. For more information about how to structure the JSON, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-human-fallback-conditions-json-schema.html">JSON Schema for Human Loop Activation Conditions in Amazon Augmented AI</a> in the <i>Amazon SageMaker Developer Guide</i>.</p>
        pub fn human_loop_activation_conditions(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.human_loop_activation_conditions = Some(input.into());
            self
        }
        /// <p>JSON expressing use-case specific conditions declaratively. If any condition is matched, atomic tasks are created against the configured work team. The set of conditions is different for Rekognition and Textract. For more information about how to structure the JSON, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/a2i-human-fallback-conditions-json-schema.html">JSON Schema for Human Loop Activation Conditions in Amazon Augmented AI</a> in the <i>Amazon SageMaker Developer Guide</i>.</p>
        pub fn set_human_loop_activation_conditions(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.human_loop_activation_conditions = input;
            self
        }
        /// Consumes the builder and constructs a [`HumanLoopActivationConditionsConfig`](crate::model::HumanLoopActivationConditionsConfig).
        pub fn build(self) -> crate::model::HumanLoopActivationConditionsConfig {
            crate::model::HumanLoopActivationConditionsConfig {
                human_loop_activation_conditions: self.human_loop_activation_conditions,
            }
        }
    }
}
impl HumanLoopActivationConditionsConfig {
    /// Creates a new builder-style object to manufacture [`HumanLoopActivationConditionsConfig`](crate::model::HumanLoopActivationConditionsConfig).
    pub fn builder() -> crate::model::human_loop_activation_conditions_config::Builder {
        crate::model::human_loop_activation_conditions_config::Builder::default()
    }
}

/// <p>Container for configuring the source of human task requests.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HumanLoopRequestSource {
    /// <p>Specifies whether Amazon Rekognition or Amazon Textract are used as the integration source. The default field settings and JSON parsing rules are different based on the integration source. Valid values:</p>
    #[doc(hidden)]
    pub aws_managed_human_loop_request_source:
        std::option::Option<crate::model::AwsManagedHumanLoopRequestSource>,
}
impl HumanLoopRequestSource {
    /// <p>Specifies whether Amazon Rekognition or Amazon Textract are used as the integration source. The default field settings and JSON parsing rules are different based on the integration source. Valid values:</p>
    pub fn aws_managed_human_loop_request_source(
        &self,
    ) -> std::option::Option<&crate::model::AwsManagedHumanLoopRequestSource> {
        self.aws_managed_human_loop_request_source.as_ref()
    }
}
/// See [`HumanLoopRequestSource`](crate::model::HumanLoopRequestSource).
pub mod human_loop_request_source {

    /// A builder for [`HumanLoopRequestSource`](crate::model::HumanLoopRequestSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) aws_managed_human_loop_request_source:
            std::option::Option<crate::model::AwsManagedHumanLoopRequestSource>,
    }
    impl Builder {
        /// <p>Specifies whether Amazon Rekognition or Amazon Textract are used as the integration source. The default field settings and JSON parsing rules are different based on the integration source. Valid values:</p>
        pub fn aws_managed_human_loop_request_source(
            mut self,
            input: crate::model::AwsManagedHumanLoopRequestSource,
        ) -> Self {
            self.aws_managed_human_loop_request_source = Some(input);
            self
        }
        /// <p>Specifies whether Amazon Rekognition or Amazon Textract are used as the integration source. The default field settings and JSON parsing rules are different based on the integration source. Valid values:</p>
        pub fn set_aws_managed_human_loop_request_source(
            mut self,
            input: std::option::Option<crate::model::AwsManagedHumanLoopRequestSource>,
        ) -> Self {
            self.aws_managed_human_loop_request_source = input;
            self
        }
        /// Consumes the builder and constructs a [`HumanLoopRequestSource`](crate::model::HumanLoopRequestSource).
        pub fn build(self) -> crate::model::HumanLoopRequestSource {
            crate::model::HumanLoopRequestSource {
                aws_managed_human_loop_request_source: self.aws_managed_human_loop_request_source,
            }
        }
    }
}
impl HumanLoopRequestSource {
    /// Creates a new builder-style object to manufacture [`HumanLoopRequestSource`](crate::model::HumanLoopRequestSource).
    pub fn builder() -> crate::model::human_loop_request_source::Builder {
        crate::model::human_loop_request_source::Builder::default()
    }
}

/// When writing a match expression against `AwsManagedHumanLoopRequestSource`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let awsmanagedhumanlooprequestsource = unimplemented!();
/// match awsmanagedhumanlooprequestsource {
///     AwsManagedHumanLoopRequestSource::RekognitionDetectModerationLabelsImageV3 => { /* ... */ },
///     AwsManagedHumanLoopRequestSource::TextractAnalyzeDocumentFormsV1 => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `awsmanagedhumanlooprequestsource` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AwsManagedHumanLoopRequestSource::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AwsManagedHumanLoopRequestSource::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AwsManagedHumanLoopRequestSource::NewFeature` is defined.
/// Specifically, when `awsmanagedhumanlooprequestsource` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AwsManagedHumanLoopRequestSource::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AwsManagedHumanLoopRequestSource {
    #[allow(missing_docs)] // documentation missing in model
    RekognitionDetectModerationLabelsImageV3,
    #[allow(missing_docs)] // documentation missing in model
    TextractAnalyzeDocumentFormsV1,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AwsManagedHumanLoopRequestSource {
    fn from(s: &str) -> Self {
        match s {
            "AWS/Rekognition/DetectModerationLabels/Image/V3" => {
                AwsManagedHumanLoopRequestSource::RekognitionDetectModerationLabelsImageV3
            }
            "AWS/Textract/AnalyzeDocument/Forms/V1" => {
                AwsManagedHumanLoopRequestSource::TextractAnalyzeDocumentFormsV1
            }
            other => AwsManagedHumanLoopRequestSource::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for AwsManagedHumanLoopRequestSource {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AwsManagedHumanLoopRequestSource::from(s))
    }
}
impl AwsManagedHumanLoopRequestSource {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AwsManagedHumanLoopRequestSource::RekognitionDetectModerationLabelsImageV3 => {
                "AWS/Rekognition/DetectModerationLabels/Image/V3"
            }
            AwsManagedHumanLoopRequestSource::TextractAnalyzeDocumentFormsV1 => {
                "AWS/Textract/AnalyzeDocument/Forms/V1"
            }
            AwsManagedHumanLoopRequestSource::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "AWS/Rekognition/DetectModerationLabels/Image/V3",
            "AWS/Textract/AnalyzeDocument/Forms/V1",
        ]
    }
}
impl AsRef<str> for AwsManagedHumanLoopRequestSource {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Identifies a model that you want to host and the resources chosen to deploy for hosting it. If you are deploying multiple models, tell SageMaker how to distribute traffic among the models by specifying variant weights. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProductionVariant {
    /// <p>The name of the production variant.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>The name of the model that you want to host. This is the name that you specified when creating the model.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>Number of instances to launch initially.</p>
    #[doc(hidden)]
    pub initial_instance_count: std::option::Option<i32>,
    /// <p>The ML compute instance type.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
    /// <p>Determines initial traffic distribution among all of the models that you specify in the endpoint configuration. The traffic to a production variant is determined by the ratio of the <code>VariantWeight</code> to the sum of all <code>VariantWeight</code> values across all ProductionVariants. If unspecified, it defaults to 1.0. </p>
    #[doc(hidden)]
    pub initial_variant_weight: std::option::Option<f32>,
    /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
    #[doc(hidden)]
    pub accelerator_type: std::option::Option<crate::model::ProductionVariantAcceleratorType>,
    /// <p>Specifies configuration for a core dump from the model container when the process crashes.</p>
    #[doc(hidden)]
    pub core_dump_config: std::option::Option<crate::model::ProductionVariantCoreDumpConfig>,
    /// <p>The serverless configuration for an endpoint. Specifies a serverless endpoint configuration instead of an instance-based endpoint configuration.</p>
    #[doc(hidden)]
    pub serverless_config: std::option::Option<crate::model::ProductionVariantServerlessConfig>,
    /// <p>The size, in GB, of the ML storage volume attached to individual inference instance associated with the production variant. Currently only Amazon EBS gp2 storage volumes are supported.</p>
    #[doc(hidden)]
    pub volume_size_in_gb: std::option::Option<i32>,
    /// <p>The timeout value, in seconds, to download and extract the model that you want to host from Amazon S3 to the individual inference instance associated with this production variant.</p>
    #[doc(hidden)]
    pub model_data_download_timeout_in_seconds: std::option::Option<i32>,
    /// <p>The timeout value, in seconds, for your inference container to pass health check by SageMaker Hosting. For more information about health check, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-inference-code.html#your-algorithms-inference-algo-ping-requests">How Your Container Should Respond to Health Check (Ping) Requests</a>.</p>
    #[doc(hidden)]
    pub container_startup_health_check_timeout_in_seconds: std::option::Option<i32>,
}
impl ProductionVariant {
    /// <p>The name of the production variant.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>The name of the model that you want to host. This is the name that you specified when creating the model.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>Number of instances to launch initially.</p>
    pub fn initial_instance_count(&self) -> std::option::Option<i32> {
        self.initial_instance_count
    }
    /// <p>The ML compute instance type.</p>
    pub fn instance_type(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>Determines initial traffic distribution among all of the models that you specify in the endpoint configuration. The traffic to a production variant is determined by the ratio of the <code>VariantWeight</code> to the sum of all <code>VariantWeight</code> values across all ProductionVariants. If unspecified, it defaults to 1.0. </p>
    pub fn initial_variant_weight(&self) -> std::option::Option<f32> {
        self.initial_variant_weight
    }
    /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
    pub fn accelerator_type(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantAcceleratorType> {
        self.accelerator_type.as_ref()
    }
    /// <p>Specifies configuration for a core dump from the model container when the process crashes.</p>
    pub fn core_dump_config(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantCoreDumpConfig> {
        self.core_dump_config.as_ref()
    }
    /// <p>The serverless configuration for an endpoint. Specifies a serverless endpoint configuration instead of an instance-based endpoint configuration.</p>
    pub fn serverless_config(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantServerlessConfig> {
        self.serverless_config.as_ref()
    }
    /// <p>The size, in GB, of the ML storage volume attached to individual inference instance associated with the production variant. Currently only Amazon EBS gp2 storage volumes are supported.</p>
    pub fn volume_size_in_gb(&self) -> std::option::Option<i32> {
        self.volume_size_in_gb
    }
    /// <p>The timeout value, in seconds, to download and extract the model that you want to host from Amazon S3 to the individual inference instance associated with this production variant.</p>
    pub fn model_data_download_timeout_in_seconds(&self) -> std::option::Option<i32> {
        self.model_data_download_timeout_in_seconds
    }
    /// <p>The timeout value, in seconds, for your inference container to pass health check by SageMaker Hosting. For more information about health check, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-inference-code.html#your-algorithms-inference-algo-ping-requests">How Your Container Should Respond to Health Check (Ping) Requests</a>.</p>
    pub fn container_startup_health_check_timeout_in_seconds(&self) -> std::option::Option<i32> {
        self.container_startup_health_check_timeout_in_seconds
    }
}
/// See [`ProductionVariant`](crate::model::ProductionVariant).
pub mod production_variant {

    /// A builder for [`ProductionVariant`](crate::model::ProductionVariant).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) initial_instance_count: std::option::Option<i32>,
        pub(crate) instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
        pub(crate) initial_variant_weight: std::option::Option<f32>,
        pub(crate) accelerator_type:
            std::option::Option<crate::model::ProductionVariantAcceleratorType>,
        pub(crate) core_dump_config:
            std::option::Option<crate::model::ProductionVariantCoreDumpConfig>,
        pub(crate) serverless_config:
            std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        pub(crate) volume_size_in_gb: std::option::Option<i32>,
        pub(crate) model_data_download_timeout_in_seconds: std::option::Option<i32>,
        pub(crate) container_startup_health_check_timeout_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The name of the production variant.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the production variant.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// <p>The name of the model that you want to host. This is the name that you specified when creating the model.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model that you want to host. This is the name that you specified when creating the model.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>Number of instances to launch initially.</p>
        pub fn initial_instance_count(mut self, input: i32) -> Self {
            self.initial_instance_count = Some(input);
            self
        }
        /// <p>Number of instances to launch initially.</p>
        pub fn set_initial_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.initial_instance_count = input;
            self
        }
        /// <p>The ML compute instance type.</p>
        pub fn instance_type(mut self, input: crate::model::ProductionVariantInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The ML compute instance type.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>Determines initial traffic distribution among all of the models that you specify in the endpoint configuration. The traffic to a production variant is determined by the ratio of the <code>VariantWeight</code> to the sum of all <code>VariantWeight</code> values across all ProductionVariants. If unspecified, it defaults to 1.0. </p>
        pub fn initial_variant_weight(mut self, input: f32) -> Self {
            self.initial_variant_weight = Some(input);
            self
        }
        /// <p>Determines initial traffic distribution among all of the models that you specify in the endpoint configuration. The traffic to a production variant is determined by the ratio of the <code>VariantWeight</code> to the sum of all <code>VariantWeight</code> values across all ProductionVariants. If unspecified, it defaults to 1.0. </p>
        pub fn set_initial_variant_weight(mut self, input: std::option::Option<f32>) -> Self {
            self.initial_variant_weight = input;
            self
        }
        /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
        pub fn accelerator_type(
            mut self,
            input: crate::model::ProductionVariantAcceleratorType,
        ) -> Self {
            self.accelerator_type = Some(input);
            self
        }
        /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
        pub fn set_accelerator_type(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantAcceleratorType>,
        ) -> Self {
            self.accelerator_type = input;
            self
        }
        /// <p>Specifies configuration for a core dump from the model container when the process crashes.</p>
        pub fn core_dump_config(
            mut self,
            input: crate::model::ProductionVariantCoreDumpConfig,
        ) -> Self {
            self.core_dump_config = Some(input);
            self
        }
        /// <p>Specifies configuration for a core dump from the model container when the process crashes.</p>
        pub fn set_core_dump_config(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantCoreDumpConfig>,
        ) -> Self {
            self.core_dump_config = input;
            self
        }
        /// <p>The serverless configuration for an endpoint. Specifies a serverless endpoint configuration instead of an instance-based endpoint configuration.</p>
        pub fn serverless_config(
            mut self,
            input: crate::model::ProductionVariantServerlessConfig,
        ) -> Self {
            self.serverless_config = Some(input);
            self
        }
        /// <p>The serverless configuration for an endpoint. Specifies a serverless endpoint configuration instead of an instance-based endpoint configuration.</p>
        pub fn set_serverless_config(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        ) -> Self {
            self.serverless_config = input;
            self
        }
        /// <p>The size, in GB, of the ML storage volume attached to individual inference instance associated with the production variant. Currently only Amazon EBS gp2 storage volumes are supported.</p>
        pub fn volume_size_in_gb(mut self, input: i32) -> Self {
            self.volume_size_in_gb = Some(input);
            self
        }
        /// <p>The size, in GB, of the ML storage volume attached to individual inference instance associated with the production variant. Currently only Amazon EBS gp2 storage volumes are supported.</p>
        pub fn set_volume_size_in_gb(mut self, input: std::option::Option<i32>) -> Self {
            self.volume_size_in_gb = input;
            self
        }
        /// <p>The timeout value, in seconds, to download and extract the model that you want to host from Amazon S3 to the individual inference instance associated with this production variant.</p>
        pub fn model_data_download_timeout_in_seconds(mut self, input: i32) -> Self {
            self.model_data_download_timeout_in_seconds = Some(input);
            self
        }
        /// <p>The timeout value, in seconds, to download and extract the model that you want to host from Amazon S3 to the individual inference instance associated with this production variant.</p>
        pub fn set_model_data_download_timeout_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.model_data_download_timeout_in_seconds = input;
            self
        }
        /// <p>The timeout value, in seconds, for your inference container to pass health check by SageMaker Hosting. For more information about health check, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-inference-code.html#your-algorithms-inference-algo-ping-requests">How Your Container Should Respond to Health Check (Ping) Requests</a>.</p>
        pub fn container_startup_health_check_timeout_in_seconds(mut self, input: i32) -> Self {
            self.container_startup_health_check_timeout_in_seconds = Some(input);
            self
        }
        /// <p>The timeout value, in seconds, for your inference container to pass health check by SageMaker Hosting. For more information about health check, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-inference-code.html#your-algorithms-inference-algo-ping-requests">How Your Container Should Respond to Health Check (Ping) Requests</a>.</p>
        pub fn set_container_startup_health_check_timeout_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.container_startup_health_check_timeout_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`ProductionVariant`](crate::model::ProductionVariant).
        pub fn build(self) -> crate::model::ProductionVariant {
            crate::model::ProductionVariant {
                variant_name: self.variant_name,
                model_name: self.model_name,
                initial_instance_count: self.initial_instance_count,
                instance_type: self.instance_type,
                initial_variant_weight: self.initial_variant_weight,
                accelerator_type: self.accelerator_type,
                core_dump_config: self.core_dump_config,
                serverless_config: self.serverless_config,
                volume_size_in_gb: self.volume_size_in_gb,
                model_data_download_timeout_in_seconds: self.model_data_download_timeout_in_seconds,
                container_startup_health_check_timeout_in_seconds: self
                    .container_startup_health_check_timeout_in_seconds,
            }
        }
    }
}
impl ProductionVariant {
    /// Creates a new builder-style object to manufacture [`ProductionVariant`](crate::model::ProductionVariant).
    pub fn builder() -> crate::model::production_variant::Builder {
        crate::model::production_variant::Builder::default()
    }
}

/// <p>Specifies configuration for a core dump from the model container when the process crashes.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ProductionVariantCoreDumpConfig {
    /// <p>The Amazon S3 bucket to send the core dump to.</p>
    #[doc(hidden)]
    pub destination_s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the core dump data at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
    /// </ul>
    /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateEndpoint</code> and <code>UpdateEndpoint</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl ProductionVariantCoreDumpConfig {
    /// <p>The Amazon S3 bucket to send the core dump to.</p>
    pub fn destination_s3_uri(&self) -> std::option::Option<&str> {
        self.destination_s3_uri.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the core dump data at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
    /// </ul>
    /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateEndpoint</code> and <code>UpdateEndpoint</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`ProductionVariantCoreDumpConfig`](crate::model::ProductionVariantCoreDumpConfig).
pub mod production_variant_core_dump_config {

    /// A builder for [`ProductionVariantCoreDumpConfig`](crate::model::ProductionVariantCoreDumpConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) destination_s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Amazon S3 bucket to send the core dump to.</p>
        pub fn destination_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 bucket to send the core dump to.</p>
        pub fn set_destination_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_s3_uri = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the core dump data at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
        /// </ul>
        /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateEndpoint</code> and <code>UpdateEndpoint</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the core dump data at rest using Amazon S3 server-side encryption. The <code>KmsKeyId</code> can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"</code> </p> </li>
        /// </ul>
        /// <p>If you use a KMS key ID or an alias of your KMS key, the SageMaker execution role must include permissions to call <code>kms:Encrypt</code>. If you don't provide a KMS key ID, SageMaker uses the default KMS key for Amazon S3 for your role's account. SageMaker uses server-side encryption with KMS-managed keys for <code>OutputDataConfig</code>. If you use a bucket policy with an <code>s3:PutObject</code> permission that only allows objects with server-side encryption, set the condition key of <code>s3:x-amz-server-side-encryption</code> to <code>"aws:kms"</code>. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KMS key policy must grant permission to the IAM role that you specify in your <code>CreateEndpoint</code> and <code>UpdateEndpoint</code> requests. For more information, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html">Using Key Policies in Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`ProductionVariantCoreDumpConfig`](crate::model::ProductionVariantCoreDumpConfig).
        pub fn build(self) -> crate::model::ProductionVariantCoreDumpConfig {
            crate::model::ProductionVariantCoreDumpConfig {
                destination_s3_uri: self.destination_s3_uri,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl ProductionVariantCoreDumpConfig {
    /// Creates a new builder-style object to manufacture [`ProductionVariantCoreDumpConfig`](crate::model::ProductionVariantCoreDumpConfig).
    pub fn builder() -> crate::model::production_variant_core_dump_config::Builder {
        crate::model::production_variant_core_dump_config::Builder::default()
    }
}

/// When writing a match expression against `ProductionVariantAcceleratorType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let productionvariantacceleratortype = unimplemented!();
/// match productionvariantacceleratortype {
///     ProductionVariantAcceleratorType::MlEia1Large => { /* ... */ },
///     ProductionVariantAcceleratorType::MlEia1Medium => { /* ... */ },
///     ProductionVariantAcceleratorType::MlEia1Xlarge => { /* ... */ },
///     ProductionVariantAcceleratorType::MlEia2Large => { /* ... */ },
///     ProductionVariantAcceleratorType::MlEia2Medium => { /* ... */ },
///     ProductionVariantAcceleratorType::MlEia2Xlarge => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `productionvariantacceleratortype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProductionVariantAcceleratorType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProductionVariantAcceleratorType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProductionVariantAcceleratorType::NewFeature` is defined.
/// Specifically, when `productionvariantacceleratortype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProductionVariantAcceleratorType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProductionVariantAcceleratorType {
    #[allow(missing_docs)] // documentation missing in model
    MlEia1Large,
    #[allow(missing_docs)] // documentation missing in model
    MlEia1Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlEia1Xlarge,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2Large,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2Medium,
    #[allow(missing_docs)] // documentation missing in model
    MlEia2Xlarge,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProductionVariantAcceleratorType {
    fn from(s: &str) -> Self {
        match s {
            "ml.eia1.large" => ProductionVariantAcceleratorType::MlEia1Large,
            "ml.eia1.medium" => ProductionVariantAcceleratorType::MlEia1Medium,
            "ml.eia1.xlarge" => ProductionVariantAcceleratorType::MlEia1Xlarge,
            "ml.eia2.large" => ProductionVariantAcceleratorType::MlEia2Large,
            "ml.eia2.medium" => ProductionVariantAcceleratorType::MlEia2Medium,
            "ml.eia2.xlarge" => ProductionVariantAcceleratorType::MlEia2Xlarge,
            other => ProductionVariantAcceleratorType::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for ProductionVariantAcceleratorType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProductionVariantAcceleratorType::from(s))
    }
}
impl ProductionVariantAcceleratorType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProductionVariantAcceleratorType::MlEia1Large => "ml.eia1.large",
            ProductionVariantAcceleratorType::MlEia1Medium => "ml.eia1.medium",
            ProductionVariantAcceleratorType::MlEia1Xlarge => "ml.eia1.xlarge",
            ProductionVariantAcceleratorType::MlEia2Large => "ml.eia2.large",
            ProductionVariantAcceleratorType::MlEia2Medium => "ml.eia2.medium",
            ProductionVariantAcceleratorType::MlEia2Xlarge => "ml.eia2.xlarge",
            ProductionVariantAcceleratorType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "ml.eia1.large",
            "ml.eia1.medium",
            "ml.eia1.xlarge",
            "ml.eia2.large",
            "ml.eia2.medium",
            "ml.eia2.xlarge",
        ]
    }
}
impl AsRef<str> for ProductionVariantAcceleratorType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>A parameter to activate explainers.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ExplainerConfig {
    /// <p>A member of <code>ExplainerConfig</code> that contains configuration parameters for the SageMaker Clarify explainer.</p>
    #[doc(hidden)]
    pub clarify_explainer_config: std::option::Option<crate::model::ClarifyExplainerConfig>,
}
impl ExplainerConfig {
    /// <p>A member of <code>ExplainerConfig</code> that contains configuration parameters for the SageMaker Clarify explainer.</p>
    pub fn clarify_explainer_config(
        &self,
    ) -> std::option::Option<&crate::model::ClarifyExplainerConfig> {
        self.clarify_explainer_config.as_ref()
    }
}
/// See [`ExplainerConfig`](crate::model::ExplainerConfig).
pub mod explainer_config {

    /// A builder for [`ExplainerConfig`](crate::model::ExplainerConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) clarify_explainer_config:
            std::option::Option<crate::model::ClarifyExplainerConfig>,
    }
    impl Builder {
        /// <p>A member of <code>ExplainerConfig</code> that contains configuration parameters for the SageMaker Clarify explainer.</p>
        pub fn clarify_explainer_config(
            mut self,
            input: crate::model::ClarifyExplainerConfig,
        ) -> Self {
            self.clarify_explainer_config = Some(input);
            self
        }
        /// <p>A member of <code>ExplainerConfig</code> that contains configuration parameters for the SageMaker Clarify explainer.</p>
        pub fn set_clarify_explainer_config(
            mut self,
            input: std::option::Option<crate::model::ClarifyExplainerConfig>,
        ) -> Self {
            self.clarify_explainer_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ExplainerConfig`](crate::model::ExplainerConfig).
        pub fn build(self) -> crate::model::ExplainerConfig {
            crate::model::ExplainerConfig {
                clarify_explainer_config: self.clarify_explainer_config,
            }
        }
    }
}
impl ExplainerConfig {
    /// Creates a new builder-style object to manufacture [`ExplainerConfig`](crate::model::ExplainerConfig).
    pub fn builder() -> crate::model::explainer_config::Builder {
        crate::model::explainer_config::Builder::default()
    }
}

/// <p>The configuration parameters for the SageMaker Clarify explainer.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ClarifyExplainerConfig {
    /// <p>A JMESPath boolean expression used to filter which records to explain. Explanations are activated by default. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-enable"> <code>EnableExplanations</code> </a>for additional information.</p>
    #[doc(hidden)]
    pub enable_explanations: std::option::Option<std::string::String>,
    /// <p>The inference configuration parameter for the model container.</p>
    #[doc(hidden)]
    pub inference_config: std::option::Option<crate::model::ClarifyInferenceConfig>,
    /// <p>The configuration for SHAP analysis.</p>
    #[doc(hidden)]
    pub shap_config: std::option::Option<crate::model::ClarifyShapConfig>,
}
impl ClarifyExplainerConfig {
    /// <p>A JMESPath boolean expression used to filter which records to explain. Explanations are activated by default. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-enable"> <code>EnableExplanations</code> </a>for additional information.</p>
    pub fn enable_explanations(&self) -> std::option::Option<&str> {
        self.enable_explanations.as_deref()
    }
    /// <p>The inference configuration parameter for the model container.</p>
    pub fn inference_config(&self) -> std::option::Option<&crate::model::ClarifyInferenceConfig> {
        self.inference_config.as_ref()
    }
    /// <p>The configuration for SHAP analysis.</p>
    pub fn shap_config(&self) -> std::option::Option<&crate::model::ClarifyShapConfig> {
        self.shap_config.as_ref()
    }
}
/// See [`ClarifyExplainerConfig`](crate::model::ClarifyExplainerConfig).
pub mod clarify_explainer_config {

    /// A builder for [`ClarifyExplainerConfig`](crate::model::ClarifyExplainerConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) enable_explanations: std::option::Option<std::string::String>,
        pub(crate) inference_config: std::option::Option<crate::model::ClarifyInferenceConfig>,
        pub(crate) shap_config: std::option::Option<crate::model::ClarifyShapConfig>,
    }
    impl Builder {
        /// <p>A JMESPath boolean expression used to filter which records to explain. Explanations are activated by default. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-enable"> <code>EnableExplanations</code> </a>for additional information.</p>
        pub fn enable_explanations(mut self, input: impl Into<std::string::String>) -> Self {
            self.enable_explanations = Some(input.into());
            self
        }
        /// <p>A JMESPath boolean expression used to filter which records to explain. Explanations are activated by default. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-enable"> <code>EnableExplanations</code> </a>for additional information.</p>
        pub fn set_enable_explanations(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.enable_explanations = input;
            self
        }
        /// <p>The inference configuration parameter for the model container.</p>
        pub fn inference_config(mut self, input: crate::model::ClarifyInferenceConfig) -> Self {
            self.inference_config = Some(input);
            self
        }
        /// <p>The inference configuration parameter for the model container.</p>
        pub fn set_inference_config(
            mut self,
            input: std::option::Option<crate::model::ClarifyInferenceConfig>,
        ) -> Self {
            self.inference_config = input;
            self
        }
        /// <p>The configuration for SHAP analysis.</p>
        pub fn shap_config(mut self, input: crate::model::ClarifyShapConfig) -> Self {
            self.shap_config = Some(input);
            self
        }
        /// <p>The configuration for SHAP analysis.</p>
        pub fn set_shap_config(
            mut self,
            input: std::option::Option<crate::model::ClarifyShapConfig>,
        ) -> Self {
            self.shap_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ClarifyExplainerConfig`](crate::model::ClarifyExplainerConfig).
        pub fn build(self) -> crate::model::ClarifyExplainerConfig {
            crate::model::ClarifyExplainerConfig {
                enable_explanations: self.enable_explanations,
                inference_config: self.inference_config,
                shap_config: self.shap_config,
            }
        }
    }
}
impl ClarifyExplainerConfig {
    /// Creates a new builder-style object to manufacture [`ClarifyExplainerConfig`](crate::model::ClarifyExplainerConfig).
    pub fn builder() -> crate::model::clarify_explainer_config::Builder {
        crate::model::clarify_explainer_config::Builder::default()
    }
}

/// <p>The configuration for SHAP analysis using SageMaker Clarify Explainer.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ClarifyShapConfig {
    /// <p>The configuration for the SHAP baseline of the Kernal SHAP algorithm.</p>
    #[doc(hidden)]
    pub shap_baseline_config: std::option::Option<crate::model::ClarifyShapBaselineConfig>,
    /// <p>The number of samples to be used for analysis by the Kernal SHAP algorithm. </p> <note>
    /// <p>The number of samples determines the size of the synthetic dataset, which has an impact on latency of explainability requests. For more information, see the <b>Synthetic data</b> of <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html">Configure and create an endpoint</a>.</p>
    /// </note>
    #[doc(hidden)]
    pub number_of_samples: std::option::Option<i32>,
    /// <p>A Boolean toggle to indicate if you want to use the logit function (true) or log-odds units (false) for model predictions. Defaults to false.</p>
    #[doc(hidden)]
    pub use_logit: std::option::Option<bool>,
    /// <p>The starting value used to initialize the random number generator in the explainer. Provide a value for this parameter to obtain a deterministic SHAP result.</p>
    #[doc(hidden)]
    pub seed: std::option::Option<i32>,
    /// <p>A parameter that indicates if text features are treated as text and explanations are provided for individual units of text. Required for natural language processing (NLP) explainability only.</p>
    #[doc(hidden)]
    pub text_config: std::option::Option<crate::model::ClarifyTextConfig>,
}
impl ClarifyShapConfig {
    /// <p>The configuration for the SHAP baseline of the Kernal SHAP algorithm.</p>
    pub fn shap_baseline_config(
        &self,
    ) -> std::option::Option<&crate::model::ClarifyShapBaselineConfig> {
        self.shap_baseline_config.as_ref()
    }
    /// <p>The number of samples to be used for analysis by the Kernal SHAP algorithm. </p> <note>
    /// <p>The number of samples determines the size of the synthetic dataset, which has an impact on latency of explainability requests. For more information, see the <b>Synthetic data</b> of <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html">Configure and create an endpoint</a>.</p>
    /// </note>
    pub fn number_of_samples(&self) -> std::option::Option<i32> {
        self.number_of_samples
    }
    /// <p>A Boolean toggle to indicate if you want to use the logit function (true) or log-odds units (false) for model predictions. Defaults to false.</p>
    pub fn use_logit(&self) -> std::option::Option<bool> {
        self.use_logit
    }
    /// <p>The starting value used to initialize the random number generator in the explainer. Provide a value for this parameter to obtain a deterministic SHAP result.</p>
    pub fn seed(&self) -> std::option::Option<i32> {
        self.seed
    }
    /// <p>A parameter that indicates if text features are treated as text and explanations are provided for individual units of text. Required for natural language processing (NLP) explainability only.</p>
    pub fn text_config(&self) -> std::option::Option<&crate::model::ClarifyTextConfig> {
        self.text_config.as_ref()
    }
}
/// See [`ClarifyShapConfig`](crate::model::ClarifyShapConfig).
pub mod clarify_shap_config {

    /// A builder for [`ClarifyShapConfig`](crate::model::ClarifyShapConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) shap_baseline_config:
            std::option::Option<crate::model::ClarifyShapBaselineConfig>,
        pub(crate) number_of_samples: std::option::Option<i32>,
        pub(crate) use_logit: std::option::Option<bool>,
        pub(crate) seed: std::option::Option<i32>,
        pub(crate) text_config: std::option::Option<crate::model::ClarifyTextConfig>,
    }
    impl Builder {
        /// <p>The configuration for the SHAP baseline of the Kernal SHAP algorithm.</p>
        pub fn shap_baseline_config(
            mut self,
            input: crate::model::ClarifyShapBaselineConfig,
        ) -> Self {
            self.shap_baseline_config = Some(input);
            self
        }
        /// <p>The configuration for the SHAP baseline of the Kernal SHAP algorithm.</p>
        pub fn set_shap_baseline_config(
            mut self,
            input: std::option::Option<crate::model::ClarifyShapBaselineConfig>,
        ) -> Self {
            self.shap_baseline_config = input;
            self
        }
        /// <p>The number of samples to be used for analysis by the Kernal SHAP algorithm. </p> <note>
        /// <p>The number of samples determines the size of the synthetic dataset, which has an impact on latency of explainability requests. For more information, see the <b>Synthetic data</b> of <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html">Configure and create an endpoint</a>.</p>
        /// </note>
        pub fn number_of_samples(mut self, input: i32) -> Self {
            self.number_of_samples = Some(input);
            self
        }
        /// <p>The number of samples to be used for analysis by the Kernal SHAP algorithm. </p> <note>
        /// <p>The number of samples determines the size of the synthetic dataset, which has an impact on latency of explainability requests. For more information, see the <b>Synthetic data</b> of <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html">Configure and create an endpoint</a>.</p>
        /// </note>
        pub fn set_number_of_samples(mut self, input: std::option::Option<i32>) -> Self {
            self.number_of_samples = input;
            self
        }
        /// <p>A Boolean toggle to indicate if you want to use the logit function (true) or log-odds units (false) for model predictions. Defaults to false.</p>
        pub fn use_logit(mut self, input: bool) -> Self {
            self.use_logit = Some(input);
            self
        }
        /// <p>A Boolean toggle to indicate if you want to use the logit function (true) or log-odds units (false) for model predictions. Defaults to false.</p>
        pub fn set_use_logit(mut self, input: std::option::Option<bool>) -> Self {
            self.use_logit = input;
            self
        }
        /// <p>The starting value used to initialize the random number generator in the explainer. Provide a value for this parameter to obtain a deterministic SHAP result.</p>
        pub fn seed(mut self, input: i32) -> Self {
            self.seed = Some(input);
            self
        }
        /// <p>The starting value used to initialize the random number generator in the explainer. Provide a value for this parameter to obtain a deterministic SHAP result.</p>
        pub fn set_seed(mut self, input: std::option::Option<i32>) -> Self {
            self.seed = input;
            self
        }
        /// <p>A parameter that indicates if text features are treated as text and explanations are provided for individual units of text. Required for natural language processing (NLP) explainability only.</p>
        pub fn text_config(mut self, input: crate::model::ClarifyTextConfig) -> Self {
            self.text_config = Some(input);
            self
        }
        /// <p>A parameter that indicates if text features are treated as text and explanations are provided for individual units of text. Required for natural language processing (NLP) explainability only.</p>
        pub fn set_text_config(
            mut self,
            input: std::option::Option<crate::model::ClarifyTextConfig>,
        ) -> Self {
            self.text_config = input;
            self
        }
        /// Consumes the builder and constructs a [`ClarifyShapConfig`](crate::model::ClarifyShapConfig).
        pub fn build(self) -> crate::model::ClarifyShapConfig {
            crate::model::ClarifyShapConfig {
                shap_baseline_config: self.shap_baseline_config,
                number_of_samples: self.number_of_samples,
                use_logit: self.use_logit,
                seed: self.seed,
                text_config: self.text_config,
            }
        }
    }
}
impl ClarifyShapConfig {
    /// Creates a new builder-style object to manufacture [`ClarifyShapConfig`](crate::model::ClarifyShapConfig).
    pub fn builder() -> crate::model::clarify_shap_config::Builder {
        crate::model::clarify_shap_config::Builder::default()
    }
}

/// <p>A parameter used to configure the SageMaker Clarify explainer to treat text features as text so that explanations are provided for individual units of text. Required only for natural language processing (NLP) explainability. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ClarifyTextConfig {
    /// <p>Specifies the language of the text features in <a href=" https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a> or <a href="https://en.wikipedia.org/wiki/ISO_639-3">ISO 639-3</a> code of a supported language. </p> <note>
    /// <p>For a mix of multiple languages, use code <code>'xx'</code>.</p>
    /// </note>
    #[doc(hidden)]
    pub language: std::option::Option<crate::model::ClarifyTextLanguage>,
    /// <p>The unit of granularity for the analysis of text features. For example, if the unit is <code>'token'</code>, then each token (like a word in English) of the text is treated as a feature. SHAP values are computed for each unit/feature.</p>
    #[doc(hidden)]
    pub granularity: std::option::Option<crate::model::ClarifyTextGranularity>,
}
impl ClarifyTextConfig {
    /// <p>Specifies the language of the text features in <a href=" https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a> or <a href="https://en.wikipedia.org/wiki/ISO_639-3">ISO 639-3</a> code of a supported language. </p> <note>
    /// <p>For a mix of multiple languages, use code <code>'xx'</code>.</p>
    /// </note>
    pub fn language(&self) -> std::option::Option<&crate::model::ClarifyTextLanguage> {
        self.language.as_ref()
    }
    /// <p>The unit of granularity for the analysis of text features. For example, if the unit is <code>'token'</code>, then each token (like a word in English) of the text is treated as a feature. SHAP values are computed for each unit/feature.</p>
    pub fn granularity(&self) -> std::option::Option<&crate::model::ClarifyTextGranularity> {
        self.granularity.as_ref()
    }
}
/// See [`ClarifyTextConfig`](crate::model::ClarifyTextConfig).
pub mod clarify_text_config {

    /// A builder for [`ClarifyTextConfig`](crate::model::ClarifyTextConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) language: std::option::Option<crate::model::ClarifyTextLanguage>,
        pub(crate) granularity: std::option::Option<crate::model::ClarifyTextGranularity>,
    }
    impl Builder {
        /// <p>Specifies the language of the text features in <a href=" https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a> or <a href="https://en.wikipedia.org/wiki/ISO_639-3">ISO 639-3</a> code of a supported language. </p> <note>
        /// <p>For a mix of multiple languages, use code <code>'xx'</code>.</p>
        /// </note>
        pub fn language(mut self, input: crate::model::ClarifyTextLanguage) -> Self {
            self.language = Some(input);
            self
        }
        /// <p>Specifies the language of the text features in <a href=" https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a> or <a href="https://en.wikipedia.org/wiki/ISO_639-3">ISO 639-3</a> code of a supported language. </p> <note>
        /// <p>For a mix of multiple languages, use code <code>'xx'</code>.</p>
        /// </note>
        pub fn set_language(
            mut self,
            input: std::option::Option<crate::model::ClarifyTextLanguage>,
        ) -> Self {
            self.language = input;
            self
        }
        /// <p>The unit of granularity for the analysis of text features. For example, if the unit is <code>'token'</code>, then each token (like a word in English) of the text is treated as a feature. SHAP values are computed for each unit/feature.</p>
        pub fn granularity(mut self, input: crate::model::ClarifyTextGranularity) -> Self {
            self.granularity = Some(input);
            self
        }
        /// <p>The unit of granularity for the analysis of text features. For example, if the unit is <code>'token'</code>, then each token (like a word in English) of the text is treated as a feature. SHAP values are computed for each unit/feature.</p>
        pub fn set_granularity(
            mut self,
            input: std::option::Option<crate::model::ClarifyTextGranularity>,
        ) -> Self {
            self.granularity = input;
            self
        }
        /// Consumes the builder and constructs a [`ClarifyTextConfig`](crate::model::ClarifyTextConfig).
        pub fn build(self) -> crate::model::ClarifyTextConfig {
            crate::model::ClarifyTextConfig {
                language: self.language,
                granularity: self.granularity,
            }
        }
    }
}
impl ClarifyTextConfig {
    /// Creates a new builder-style object to manufacture [`ClarifyTextConfig`](crate::model::ClarifyTextConfig).
    pub fn builder() -> crate::model::clarify_text_config::Builder {
        crate::model::clarify_text_config::Builder::default()
    }
}

/// When writing a match expression against `ClarifyTextGranularity`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let clarifytextgranularity = unimplemented!();
/// match clarifytextgranularity {
///     ClarifyTextGranularity::Paragraph => { /* ... */ },
///     ClarifyTextGranularity::Sentence => { /* ... */ },
///     ClarifyTextGranularity::Token => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `clarifytextgranularity` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ClarifyTextGranularity::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ClarifyTextGranularity::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ClarifyTextGranularity::NewFeature` is defined.
/// Specifically, when `clarifytextgranularity` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ClarifyTextGranularity::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ClarifyTextGranularity {
    #[allow(missing_docs)] // documentation missing in model
    Paragraph,
    #[allow(missing_docs)] // documentation missing in model
    Sentence,
    #[allow(missing_docs)] // documentation missing in model
    Token,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ClarifyTextGranularity {
    fn from(s: &str) -> Self {
        match s {
            "paragraph" => ClarifyTextGranularity::Paragraph,
            "sentence" => ClarifyTextGranularity::Sentence,
            "token" => ClarifyTextGranularity::Token,
            other => {
                ClarifyTextGranularity::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ClarifyTextGranularity {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ClarifyTextGranularity::from(s))
    }
}
impl ClarifyTextGranularity {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ClarifyTextGranularity::Paragraph => "paragraph",
            ClarifyTextGranularity::Sentence => "sentence",
            ClarifyTextGranularity::Token => "token",
            ClarifyTextGranularity::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["paragraph", "sentence", "token"]
    }
}
impl AsRef<str> for ClarifyTextGranularity {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `ClarifyTextLanguage`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let clarifytextlanguage = unimplemented!();
/// match clarifytextlanguage {
///     ClarifyTextLanguage::Afrikaans => { /* ... */ },
///     ClarifyTextLanguage::Arabic => { /* ... */ },
///     ClarifyTextLanguage::Bulgarian => { /* ... */ },
///     ClarifyTextLanguage::Bengali => { /* ... */ },
///     ClarifyTextLanguage::Catalan => { /* ... */ },
///     ClarifyTextLanguage::Czech => { /* ... */ },
///     ClarifyTextLanguage::Danish => { /* ... */ },
///     ClarifyTextLanguage::German => { /* ... */ },
///     ClarifyTextLanguage::Greek => { /* ... */ },
///     ClarifyTextLanguage::English => { /* ... */ },
///     ClarifyTextLanguage::Spanish => { /* ... */ },
///     ClarifyTextLanguage::Estonian => { /* ... */ },
///     ClarifyTextLanguage::Basque => { /* ... */ },
///     ClarifyTextLanguage::Persian => { /* ... */ },
///     ClarifyTextLanguage::Finnish => { /* ... */ },
///     ClarifyTextLanguage::French => { /* ... */ },
///     ClarifyTextLanguage::Irish => { /* ... */ },
///     ClarifyTextLanguage::Gujarati => { /* ... */ },
///     ClarifyTextLanguage::Hebrew => { /* ... */ },
///     ClarifyTextLanguage::Hindi => { /* ... */ },
///     ClarifyTextLanguage::Croatian => { /* ... */ },
///     ClarifyTextLanguage::Hungarian => { /* ... */ },
///     ClarifyTextLanguage::Armenian => { /* ... */ },
///     ClarifyTextLanguage::Indonesian => { /* ... */ },
///     ClarifyTextLanguage::Icelandic => { /* ... */ },
///     ClarifyTextLanguage::Italian => { /* ... */ },
///     ClarifyTextLanguage::Kannada => { /* ... */ },
///     ClarifyTextLanguage::Kyrgyz => { /* ... */ },
///     ClarifyTextLanguage::Luxembourgish => { /* ... */ },
///     ClarifyTextLanguage::Ligurian => { /* ... */ },
///     ClarifyTextLanguage::Lithuanian => { /* ... */ },
///     ClarifyTextLanguage::Latvian => { /* ... */ },
///     ClarifyTextLanguage::Macedonian => { /* ... */ },
///     ClarifyTextLanguage::Malayalam => { /* ... */ },
///     ClarifyTextLanguage::Marathi => { /* ... */ },
///     ClarifyTextLanguage::NorwegianBokmal => { /* ... */ },
///     ClarifyTextLanguage::Nepali => { /* ... */ },
///     ClarifyTextLanguage::Dutch => { /* ... */ },
///     ClarifyTextLanguage::Polish => { /* ... */ },
///     ClarifyTextLanguage::Portuguese => { /* ... */ },
///     ClarifyTextLanguage::Romanian => { /* ... */ },
///     ClarifyTextLanguage::Russian => { /* ... */ },
///     ClarifyTextLanguage::Sanskrit => { /* ... */ },
///     ClarifyTextLanguage::Sinhala => { /* ... */ },
///     ClarifyTextLanguage::Slovak => { /* ... */ },
///     ClarifyTextLanguage::Slovenian => { /* ... */ },
///     ClarifyTextLanguage::Albanian => { /* ... */ },
///     ClarifyTextLanguage::Serbian => { /* ... */ },
///     ClarifyTextLanguage::Swedish => { /* ... */ },
///     ClarifyTextLanguage::Tamil => { /* ... */ },
///     ClarifyTextLanguage::Telugu => { /* ... */ },
///     ClarifyTextLanguage::Tagalog => { /* ... */ },
///     ClarifyTextLanguage::Setswana => { /* ... */ },
///     ClarifyTextLanguage::Turkish => { /* ... */ },
///     ClarifyTextLanguage::Tatar => { /* ... */ },
///     ClarifyTextLanguage::Ukrainian => { /* ... */ },
///     ClarifyTextLanguage::Urdu => { /* ... */ },
///     ClarifyTextLanguage::MultiLanguage => { /* ... */ },
///     ClarifyTextLanguage::Yoruba => { /* ... */ },
///     ClarifyTextLanguage::Chinese => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `clarifytextlanguage` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ClarifyTextLanguage::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ClarifyTextLanguage::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ClarifyTextLanguage::NewFeature` is defined.
/// Specifically, when `clarifytextlanguage` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ClarifyTextLanguage::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ClarifyTextLanguage {
    #[allow(missing_docs)] // documentation missing in model
    Afrikaans,
    #[allow(missing_docs)] // documentation missing in model
    Arabic,
    #[allow(missing_docs)] // documentation missing in model
    Bulgarian,
    #[allow(missing_docs)] // documentation missing in model
    Bengali,
    #[allow(missing_docs)] // documentation missing in model
    Catalan,
    #[allow(missing_docs)] // documentation missing in model
    Czech,
    #[allow(missing_docs)] // documentation missing in model
    Danish,
    #[allow(missing_docs)] // documentation missing in model
    German,
    #[allow(missing_docs)] // documentation missing in model
    Greek,
    #[allow(missing_docs)] // documentation missing in model
    English,
    #[allow(missing_docs)] // documentation missing in model
    Spanish,
    #[allow(missing_docs)] // documentation missing in model
    Estonian,
    #[allow(missing_docs)] // documentation missing in model
    Basque,
    #[allow(missing_docs)] // documentation missing in model
    Persian,
    #[allow(missing_docs)] // documentation missing in model
    Finnish,
    #[allow(missing_docs)] // documentation missing in model
    French,
    #[allow(missing_docs)] // documentation missing in model
    Irish,
    #[allow(missing_docs)] // documentation missing in model
    Gujarati,
    #[allow(missing_docs)] // documentation missing in model
    Hebrew,
    #[allow(missing_docs)] // documentation missing in model
    Hindi,
    #[allow(missing_docs)] // documentation missing in model
    Croatian,
    #[allow(missing_docs)] // documentation missing in model
    Hungarian,
    #[allow(missing_docs)] // documentation missing in model
    Armenian,
    #[allow(missing_docs)] // documentation missing in model
    Indonesian,
    #[allow(missing_docs)] // documentation missing in model
    Icelandic,
    #[allow(missing_docs)] // documentation missing in model
    Italian,
    #[allow(missing_docs)] // documentation missing in model
    Kannada,
    #[allow(missing_docs)] // documentation missing in model
    Kyrgyz,
    #[allow(missing_docs)] // documentation missing in model
    Luxembourgish,
    #[allow(missing_docs)] // documentation missing in model
    Ligurian,
    #[allow(missing_docs)] // documentation missing in model
    Lithuanian,
    #[allow(missing_docs)] // documentation missing in model
    Latvian,
    #[allow(missing_docs)] // documentation missing in model
    Macedonian,
    #[allow(missing_docs)] // documentation missing in model
    Malayalam,
    #[allow(missing_docs)] // documentation missing in model
    Marathi,
    #[allow(missing_docs)] // documentation missing in model
    NorwegianBokmal,
    #[allow(missing_docs)] // documentation missing in model
    Nepali,
    #[allow(missing_docs)] // documentation missing in model
    Dutch,
    #[allow(missing_docs)] // documentation missing in model
    Polish,
    #[allow(missing_docs)] // documentation missing in model
    Portuguese,
    #[allow(missing_docs)] // documentation missing in model
    Romanian,
    #[allow(missing_docs)] // documentation missing in model
    Russian,
    #[allow(missing_docs)] // documentation missing in model
    Sanskrit,
    #[allow(missing_docs)] // documentation missing in model
    Sinhala,
    #[allow(missing_docs)] // documentation missing in model
    Slovak,
    #[allow(missing_docs)] // documentation missing in model
    Slovenian,
    #[allow(missing_docs)] // documentation missing in model
    Albanian,
    #[allow(missing_docs)] // documentation missing in model
    Serbian,
    #[allow(missing_docs)] // documentation missing in model
    Swedish,
    #[allow(missing_docs)] // documentation missing in model
    Tamil,
    #[allow(missing_docs)] // documentation missing in model
    Telugu,
    #[allow(missing_docs)] // documentation missing in model
    Tagalog,
    #[allow(missing_docs)] // documentation missing in model
    Setswana,
    #[allow(missing_docs)] // documentation missing in model
    Turkish,
    #[allow(missing_docs)] // documentation missing in model
    Tatar,
    #[allow(missing_docs)] // documentation missing in model
    Ukrainian,
    #[allow(missing_docs)] // documentation missing in model
    Urdu,
    #[allow(missing_docs)] // documentation missing in model
    MultiLanguage,
    #[allow(missing_docs)] // documentation missing in model
    Yoruba,
    #[allow(missing_docs)] // documentation missing in model
    Chinese,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ClarifyTextLanguage {
    fn from(s: &str) -> Self {
        match s {
            "af" => ClarifyTextLanguage::Afrikaans,
            "ar" => ClarifyTextLanguage::Arabic,
            "bg" => ClarifyTextLanguage::Bulgarian,
            "bn" => ClarifyTextLanguage::Bengali,
            "ca" => ClarifyTextLanguage::Catalan,
            "cs" => ClarifyTextLanguage::Czech,
            "da" => ClarifyTextLanguage::Danish,
            "de" => ClarifyTextLanguage::German,
            "el" => ClarifyTextLanguage::Greek,
            "en" => ClarifyTextLanguage::English,
            "es" => ClarifyTextLanguage::Spanish,
            "et" => ClarifyTextLanguage::Estonian,
            "eu" => ClarifyTextLanguage::Basque,
            "fa" => ClarifyTextLanguage::Persian,
            "fi" => ClarifyTextLanguage::Finnish,
            "fr" => ClarifyTextLanguage::French,
            "ga" => ClarifyTextLanguage::Irish,
            "gu" => ClarifyTextLanguage::Gujarati,
            "he" => ClarifyTextLanguage::Hebrew,
            "hi" => ClarifyTextLanguage::Hindi,
            "hr" => ClarifyTextLanguage::Croatian,
            "hu" => ClarifyTextLanguage::Hungarian,
            "hy" => ClarifyTextLanguage::Armenian,
            "id" => ClarifyTextLanguage::Indonesian,
            "is" => ClarifyTextLanguage::Icelandic,
            "it" => ClarifyTextLanguage::Italian,
            "kn" => ClarifyTextLanguage::Kannada,
            "ky" => ClarifyTextLanguage::Kyrgyz,
            "lb" => ClarifyTextLanguage::Luxembourgish,
            "lij" => ClarifyTextLanguage::Ligurian,
            "lt" => ClarifyTextLanguage::Lithuanian,
            "lv" => ClarifyTextLanguage::Latvian,
            "mk" => ClarifyTextLanguage::Macedonian,
            "ml" => ClarifyTextLanguage::Malayalam,
            "mr" => ClarifyTextLanguage::Marathi,
            "nb" => ClarifyTextLanguage::NorwegianBokmal,
            "ne" => ClarifyTextLanguage::Nepali,
            "nl" => ClarifyTextLanguage::Dutch,
            "pl" => ClarifyTextLanguage::Polish,
            "pt" => ClarifyTextLanguage::Portuguese,
            "ro" => ClarifyTextLanguage::Romanian,
            "ru" => ClarifyTextLanguage::Russian,
            "sa" => ClarifyTextLanguage::Sanskrit,
            "si" => ClarifyTextLanguage::Sinhala,
            "sk" => ClarifyTextLanguage::Slovak,
            "sl" => ClarifyTextLanguage::Slovenian,
            "sq" => ClarifyTextLanguage::Albanian,
            "sr" => ClarifyTextLanguage::Serbian,
            "sv" => ClarifyTextLanguage::Swedish,
            "ta" => ClarifyTextLanguage::Tamil,
            "te" => ClarifyTextLanguage::Telugu,
            "tl" => ClarifyTextLanguage::Tagalog,
            "tn" => ClarifyTextLanguage::Setswana,
            "tr" => ClarifyTextLanguage::Turkish,
            "tt" => ClarifyTextLanguage::Tatar,
            "uk" => ClarifyTextLanguage::Ukrainian,
            "ur" => ClarifyTextLanguage::Urdu,
            "xx" => ClarifyTextLanguage::MultiLanguage,
            "yo" => ClarifyTextLanguage::Yoruba,
            "zh" => ClarifyTextLanguage::Chinese,
            other => {
                ClarifyTextLanguage::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ClarifyTextLanguage {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ClarifyTextLanguage::from(s))
    }
}
impl ClarifyTextLanguage {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ClarifyTextLanguage::Afrikaans => "af",
            ClarifyTextLanguage::Arabic => "ar",
            ClarifyTextLanguage::Bulgarian => "bg",
            ClarifyTextLanguage::Bengali => "bn",
            ClarifyTextLanguage::Catalan => "ca",
            ClarifyTextLanguage::Czech => "cs",
            ClarifyTextLanguage::Danish => "da",
            ClarifyTextLanguage::German => "de",
            ClarifyTextLanguage::Greek => "el",
            ClarifyTextLanguage::English => "en",
            ClarifyTextLanguage::Spanish => "es",
            ClarifyTextLanguage::Estonian => "et",
            ClarifyTextLanguage::Basque => "eu",
            ClarifyTextLanguage::Persian => "fa",
            ClarifyTextLanguage::Finnish => "fi",
            ClarifyTextLanguage::French => "fr",
            ClarifyTextLanguage::Irish => "ga",
            ClarifyTextLanguage::Gujarati => "gu",
            ClarifyTextLanguage::Hebrew => "he",
            ClarifyTextLanguage::Hindi => "hi",
            ClarifyTextLanguage::Croatian => "hr",
            ClarifyTextLanguage::Hungarian => "hu",
            ClarifyTextLanguage::Armenian => "hy",
            ClarifyTextLanguage::Indonesian => "id",
            ClarifyTextLanguage::Icelandic => "is",
            ClarifyTextLanguage::Italian => "it",
            ClarifyTextLanguage::Kannada => "kn",
            ClarifyTextLanguage::Kyrgyz => "ky",
            ClarifyTextLanguage::Luxembourgish => "lb",
            ClarifyTextLanguage::Ligurian => "lij",
            ClarifyTextLanguage::Lithuanian => "lt",
            ClarifyTextLanguage::Latvian => "lv",
            ClarifyTextLanguage::Macedonian => "mk",
            ClarifyTextLanguage::Malayalam => "ml",
            ClarifyTextLanguage::Marathi => "mr",
            ClarifyTextLanguage::NorwegianBokmal => "nb",
            ClarifyTextLanguage::Nepali => "ne",
            ClarifyTextLanguage::Dutch => "nl",
            ClarifyTextLanguage::Polish => "pl",
            ClarifyTextLanguage::Portuguese => "pt",
            ClarifyTextLanguage::Romanian => "ro",
            ClarifyTextLanguage::Russian => "ru",
            ClarifyTextLanguage::Sanskrit => "sa",
            ClarifyTextLanguage::Sinhala => "si",
            ClarifyTextLanguage::Slovak => "sk",
            ClarifyTextLanguage::Slovenian => "sl",
            ClarifyTextLanguage::Albanian => "sq",
            ClarifyTextLanguage::Serbian => "sr",
            ClarifyTextLanguage::Swedish => "sv",
            ClarifyTextLanguage::Tamil => "ta",
            ClarifyTextLanguage::Telugu => "te",
            ClarifyTextLanguage::Tagalog => "tl",
            ClarifyTextLanguage::Setswana => "tn",
            ClarifyTextLanguage::Turkish => "tr",
            ClarifyTextLanguage::Tatar => "tt",
            ClarifyTextLanguage::Ukrainian => "uk",
            ClarifyTextLanguage::Urdu => "ur",
            ClarifyTextLanguage::MultiLanguage => "xx",
            ClarifyTextLanguage::Yoruba => "yo",
            ClarifyTextLanguage::Chinese => "zh",
            ClarifyTextLanguage::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "af", "ar", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "et", "eu", "fa",
            "fi", "fr", "ga", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "kn", "ky",
            "lb", "lij", "lt", "lv", "mk", "ml", "mr", "nb", "ne", "nl", "pl", "pt", "ro", "ru",
            "sa", "si", "sk", "sl", "sq", "sr", "sv", "ta", "te", "tl", "tn", "tr", "tt", "uk",
            "ur", "xx", "yo", "zh",
        ]
    }
}
impl AsRef<str> for ClarifyTextLanguage {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The configuration for the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-feature-attribute-shap-baselines.html">SHAP baseline</a> (also called the background or reference dataset) of the Kernal SHAP algorithm.</p> <note>
/// <ul>
/// <li> <p>The number of records in the baseline data determines the size of the synthetic dataset, which has an impact on latency of explainability requests. For more information, see the <b>Synthetic data</b> of <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html">Configure and create an endpoint</a>.</p> </li>
/// <li> <p> <code>ShapBaseline</code> and <code>ShapBaselineUri</code> are mutually exclusive parameters. One or the either is required to configure a SHAP baseline. </p> </li>
/// </ul>
/// </note>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ClarifyShapBaselineConfig {
    /// <p>The MIME type of the baseline data. Choose from <code>'text/csv'</code> or <code>'application/jsonlines'</code>. Defaults to <code>'text/csv'</code>.</p>
    #[doc(hidden)]
    pub mime_type: std::option::Option<std::string::String>,
    /// <p>The inline SHAP baseline data in string format. <code>ShapBaseline</code> can have one or multiple records to be used as the baseline dataset. The format of the SHAP baseline file should be the same format as the training dataset. For example, if the training dataset is in CSV format and each record contains four features, and all features are numerical, then the format of the baseline data should also share these characteristics. For natural language processing (NLP) of text columns, the baseline value should be the value used to replace the unit of text specified by the <code>Granularity</code> of the <code>TextConfig</code> parameter. The size limit for <code>ShapBasline</code> is 4 KB. Use the <code>ShapBaselineUri</code> parameter if you want to provide more than 4 KB of baseline data.</p>
    #[doc(hidden)]
    pub shap_baseline: std::option::Option<std::string::String>,
    /// <p>The uniform resource identifier (URI) of the S3 bucket where the SHAP baseline file is stored. The format of the SHAP baseline file should be the same format as the format of the training dataset. For example, if the training dataset is in CSV format, and each record in the training dataset has four features, and all features are numerical, then the baseline file should also have this same format. Each record should contain only the features. If you are using a virtual private cloud (VPC), the <code>ShapBaselineUri</code> should be accessible to the VPC. For more information about setting up endpoints with Amazon Virtual Private Cloud, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/infrastructure-give-access.html">Give SageMaker access to Resources in your Amazon Virtual Private Cloud</a>.</p>
    #[doc(hidden)]
    pub shap_baseline_uri: std::option::Option<std::string::String>,
}
impl ClarifyShapBaselineConfig {
    /// <p>The MIME type of the baseline data. Choose from <code>'text/csv'</code> or <code>'application/jsonlines'</code>. Defaults to <code>'text/csv'</code>.</p>
    pub fn mime_type(&self) -> std::option::Option<&str> {
        self.mime_type.as_deref()
    }
    /// <p>The inline SHAP baseline data in string format. <code>ShapBaseline</code> can have one or multiple records to be used as the baseline dataset. The format of the SHAP baseline file should be the same format as the training dataset. For example, if the training dataset is in CSV format and each record contains four features, and all features are numerical, then the format of the baseline data should also share these characteristics. For natural language processing (NLP) of text columns, the baseline value should be the value used to replace the unit of text specified by the <code>Granularity</code> of the <code>TextConfig</code> parameter. The size limit for <code>ShapBasline</code> is 4 KB. Use the <code>ShapBaselineUri</code> parameter if you want to provide more than 4 KB of baseline data.</p>
    pub fn shap_baseline(&self) -> std::option::Option<&str> {
        self.shap_baseline.as_deref()
    }
    /// <p>The uniform resource identifier (URI) of the S3 bucket where the SHAP baseline file is stored. The format of the SHAP baseline file should be the same format as the format of the training dataset. For example, if the training dataset is in CSV format, and each record in the training dataset has four features, and all features are numerical, then the baseline file should also have this same format. Each record should contain only the features. If you are using a virtual private cloud (VPC), the <code>ShapBaselineUri</code> should be accessible to the VPC. For more information about setting up endpoints with Amazon Virtual Private Cloud, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/infrastructure-give-access.html">Give SageMaker access to Resources in your Amazon Virtual Private Cloud</a>.</p>
    pub fn shap_baseline_uri(&self) -> std::option::Option<&str> {
        self.shap_baseline_uri.as_deref()
    }
}
/// See [`ClarifyShapBaselineConfig`](crate::model::ClarifyShapBaselineConfig).
pub mod clarify_shap_baseline_config {

    /// A builder for [`ClarifyShapBaselineConfig`](crate::model::ClarifyShapBaselineConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) mime_type: std::option::Option<std::string::String>,
        pub(crate) shap_baseline: std::option::Option<std::string::String>,
        pub(crate) shap_baseline_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The MIME type of the baseline data. Choose from <code>'text/csv'</code> or <code>'application/jsonlines'</code>. Defaults to <code>'text/csv'</code>.</p>
        pub fn mime_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.mime_type = Some(input.into());
            self
        }
        /// <p>The MIME type of the baseline data. Choose from <code>'text/csv'</code> or <code>'application/jsonlines'</code>. Defaults to <code>'text/csv'</code>.</p>
        pub fn set_mime_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.mime_type = input;
            self
        }
        /// <p>The inline SHAP baseline data in string format. <code>ShapBaseline</code> can have one or multiple records to be used as the baseline dataset. The format of the SHAP baseline file should be the same format as the training dataset. For example, if the training dataset is in CSV format and each record contains four features, and all features are numerical, then the format of the baseline data should also share these characteristics. For natural language processing (NLP) of text columns, the baseline value should be the value used to replace the unit of text specified by the <code>Granularity</code> of the <code>TextConfig</code> parameter. The size limit for <code>ShapBasline</code> is 4 KB. Use the <code>ShapBaselineUri</code> parameter if you want to provide more than 4 KB of baseline data.</p>
        pub fn shap_baseline(mut self, input: impl Into<std::string::String>) -> Self {
            self.shap_baseline = Some(input.into());
            self
        }
        /// <p>The inline SHAP baseline data in string format. <code>ShapBaseline</code> can have one or multiple records to be used as the baseline dataset. The format of the SHAP baseline file should be the same format as the training dataset. For example, if the training dataset is in CSV format and each record contains four features, and all features are numerical, then the format of the baseline data should also share these characteristics. For natural language processing (NLP) of text columns, the baseline value should be the value used to replace the unit of text specified by the <code>Granularity</code> of the <code>TextConfig</code> parameter. The size limit for <code>ShapBasline</code> is 4 KB. Use the <code>ShapBaselineUri</code> parameter if you want to provide more than 4 KB of baseline data.</p>
        pub fn set_shap_baseline(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.shap_baseline = input;
            self
        }
        /// <p>The uniform resource identifier (URI) of the S3 bucket where the SHAP baseline file is stored. The format of the SHAP baseline file should be the same format as the format of the training dataset. For example, if the training dataset is in CSV format, and each record in the training dataset has four features, and all features are numerical, then the baseline file should also have this same format. Each record should contain only the features. If you are using a virtual private cloud (VPC), the <code>ShapBaselineUri</code> should be accessible to the VPC. For more information about setting up endpoints with Amazon Virtual Private Cloud, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/infrastructure-give-access.html">Give SageMaker access to Resources in your Amazon Virtual Private Cloud</a>.</p>
        pub fn shap_baseline_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.shap_baseline_uri = Some(input.into());
            self
        }
        /// <p>The uniform resource identifier (URI) of the S3 bucket where the SHAP baseline file is stored. The format of the SHAP baseline file should be the same format as the format of the training dataset. For example, if the training dataset is in CSV format, and each record in the training dataset has four features, and all features are numerical, then the baseline file should also have this same format. Each record should contain only the features. If you are using a virtual private cloud (VPC), the <code>ShapBaselineUri</code> should be accessible to the VPC. For more information about setting up endpoints with Amazon Virtual Private Cloud, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/infrastructure-give-access.html">Give SageMaker access to Resources in your Amazon Virtual Private Cloud</a>.</p>
        pub fn set_shap_baseline_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.shap_baseline_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`ClarifyShapBaselineConfig`](crate::model::ClarifyShapBaselineConfig).
        pub fn build(self) -> crate::model::ClarifyShapBaselineConfig {
            crate::model::ClarifyShapBaselineConfig {
                mime_type: self.mime_type,
                shap_baseline: self.shap_baseline,
                shap_baseline_uri: self.shap_baseline_uri,
            }
        }
    }
}
impl ClarifyShapBaselineConfig {
    /// Creates a new builder-style object to manufacture [`ClarifyShapBaselineConfig`](crate::model::ClarifyShapBaselineConfig).
    pub fn builder() -> crate::model::clarify_shap_baseline_config::Builder {
        crate::model::clarify_shap_baseline_config::Builder::default()
    }
}

/// <p>The inference configuration parameter for the model container.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ClarifyInferenceConfig {
    /// <p>Provides the JMESPath expression to extract the features from a model container input in JSON Lines format. For example, if <code>FeaturesAttribute</code> is the JMESPath expression <code>'myfeatures'</code>, it extracts a list of features <code>[1,2,3]</code> from request data <code>'{"myfeatures":[1,2,3]}'</code>.</p>
    #[doc(hidden)]
    pub features_attribute: std::option::Option<std::string::String>,
    /// <p>A template string used to format a JSON record into an acceptable model container input. For example, a <code>ContentTemplate</code> string <code>'{"myfeatures":$features}'</code> will format a list of features <code>[1,2,3]</code> into the record string <code>'{"myfeatures":[1,2,3]}'</code>. Required only when the model container input is in JSON Lines format.</p>
    #[doc(hidden)]
    pub content_template: std::option::Option<std::string::String>,
    /// <p>The maximum number of records in a request that the model container can process when querying the model container for the predictions of a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-synthetic">synthetic dataset</a>. A record is a unit of input data that inference can be made on, for example, a single line in CSV data. If <code>MaxRecordCount</code> is <code>1</code>, the model container expects one record per request. A value of 2 or greater means that the model expects batch requests, which can reduce overhead and speed up the inferencing process. If this parameter is not provided, the explainer will tune the record count per request according to the model container's capacity at runtime.</p>
    #[doc(hidden)]
    pub max_record_count: std::option::Option<i32>,
    /// <p>The maximum payload size (MB) allowed of a request from the explainer to the model container. Defaults to <code>6</code> MB.</p>
    #[doc(hidden)]
    pub max_payload_in_mb: std::option::Option<i32>,
    /// <p>A zero-based index used to extract a probability value (score) or list from model container output in CSV format. If this value is not provided, the entire model container output will be treated as a probability value (score) or list.</p>
    /// <p> <b>Example for a single class model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'1,0.6'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability value <code>0.6</code>.</p>
    /// <p> <b>Example for a multiclass model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability values <code>[0.1,0.6,0.3]</code>.</p>
    #[doc(hidden)]
    pub probability_index: std::option::Option<i32>,
    /// <p>A zero-based index used to extract a label header or list of label headers from model container output in CSV format.</p>
    /// <p> <b>Example for a multiclass model:</b> If the model container output consists of label headers followed by probabilities: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>LabelIndex</code> to <code>0</code> to select the label headers <code>['cat','dog','fish']</code>.</p>
    #[doc(hidden)]
    pub label_index: std::option::Option<i32>,
    /// <p>A JMESPath expression used to extract the probability (or score) from the model container output if the model container is in JSON Lines format.</p>
    /// <p> <b>Example</b>: If the model container output of a single request is <code>'{"predicted_label":1,"probability":0.6}'</code>, then set <code>ProbabilityAttribute</code> to <code>'probability'</code>.</p>
    #[doc(hidden)]
    pub probability_attribute: std::option::Option<std::string::String>,
    /// <p>A JMESPath expression used to locate the list of label headers in the model container output.</p>
    /// <p> <b>Example</b>: If the model container output of a batch request is <code>'{"labels":["cat","dog","fish"],"probability":[0.6,0.3,0.1]}'</code>, then set <code>LabelAttribute</code> to <code>'labels'</code> to extract the list of label headers <code>["cat","dog","fish"]</code> </p>
    #[doc(hidden)]
    pub label_attribute: std::option::Option<std::string::String>,
    /// <p>For multiclass classification problems, the label headers are the names of the classes. Otherwise, the label header is the name of the predicted label. These are used to help readability for the output of the <code>InvokeEndpoint</code> API. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information. If there are no label headers in the model container output, provide them manually using this parameter.</p>
    #[doc(hidden)]
    pub label_headers: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The names of the features. If provided, these are included in the endpoint response payload to help readability of the <code>InvokeEndpoint</code> output. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">Response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
    #[doc(hidden)]
    pub feature_headers: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A list of data types of the features (optional). Applicable only to NLP explainability. If provided, <code>FeatureTypes</code> must have at least one <code>'text'</code> string (for example, <code>['text']</code>). If <code>FeatureTypes</code> is not provided, the explainer infers the feature types based on the baseline data. The feature types are included in the endpoint response payload. For additional information see the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
    #[doc(hidden)]
    pub feature_types: std::option::Option<std::vec::Vec<crate::model::ClarifyFeatureType>>,
}
impl ClarifyInferenceConfig {
    /// <p>Provides the JMESPath expression to extract the features from a model container input in JSON Lines format. For example, if <code>FeaturesAttribute</code> is the JMESPath expression <code>'myfeatures'</code>, it extracts a list of features <code>[1,2,3]</code> from request data <code>'{"myfeatures":[1,2,3]}'</code>.</p>
    pub fn features_attribute(&self) -> std::option::Option<&str> {
        self.features_attribute.as_deref()
    }
    /// <p>A template string used to format a JSON record into an acceptable model container input. For example, a <code>ContentTemplate</code> string <code>'{"myfeatures":$features}'</code> will format a list of features <code>[1,2,3]</code> into the record string <code>'{"myfeatures":[1,2,3]}'</code>. Required only when the model container input is in JSON Lines format.</p>
    pub fn content_template(&self) -> std::option::Option<&str> {
        self.content_template.as_deref()
    }
    /// <p>The maximum number of records in a request that the model container can process when querying the model container for the predictions of a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-synthetic">synthetic dataset</a>. A record is a unit of input data that inference can be made on, for example, a single line in CSV data. If <code>MaxRecordCount</code> is <code>1</code>, the model container expects one record per request. A value of 2 or greater means that the model expects batch requests, which can reduce overhead and speed up the inferencing process. If this parameter is not provided, the explainer will tune the record count per request according to the model container's capacity at runtime.</p>
    pub fn max_record_count(&self) -> std::option::Option<i32> {
        self.max_record_count
    }
    /// <p>The maximum payload size (MB) allowed of a request from the explainer to the model container. Defaults to <code>6</code> MB.</p>
    pub fn max_payload_in_mb(&self) -> std::option::Option<i32> {
        self.max_payload_in_mb
    }
    /// <p>A zero-based index used to extract a probability value (score) or list from model container output in CSV format. If this value is not provided, the entire model container output will be treated as a probability value (score) or list.</p>
    /// <p> <b>Example for a single class model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'1,0.6'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability value <code>0.6</code>.</p>
    /// <p> <b>Example for a multiclass model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability values <code>[0.1,0.6,0.3]</code>.</p>
    pub fn probability_index(&self) -> std::option::Option<i32> {
        self.probability_index
    }
    /// <p>A zero-based index used to extract a label header or list of label headers from model container output in CSV format.</p>
    /// <p> <b>Example for a multiclass model:</b> If the model container output consists of label headers followed by probabilities: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>LabelIndex</code> to <code>0</code> to select the label headers <code>['cat','dog','fish']</code>.</p>
    pub fn label_index(&self) -> std::option::Option<i32> {
        self.label_index
    }
    /// <p>A JMESPath expression used to extract the probability (or score) from the model container output if the model container is in JSON Lines format.</p>
    /// <p> <b>Example</b>: If the model container output of a single request is <code>'{"predicted_label":1,"probability":0.6}'</code>, then set <code>ProbabilityAttribute</code> to <code>'probability'</code>.</p>
    pub fn probability_attribute(&self) -> std::option::Option<&str> {
        self.probability_attribute.as_deref()
    }
    /// <p>A JMESPath expression used to locate the list of label headers in the model container output.</p>
    /// <p> <b>Example</b>: If the model container output of a batch request is <code>'{"labels":["cat","dog","fish"],"probability":[0.6,0.3,0.1]}'</code>, then set <code>LabelAttribute</code> to <code>'labels'</code> to extract the list of label headers <code>["cat","dog","fish"]</code> </p>
    pub fn label_attribute(&self) -> std::option::Option<&str> {
        self.label_attribute.as_deref()
    }
    /// <p>For multiclass classification problems, the label headers are the names of the classes. Otherwise, the label header is the name of the predicted label. These are used to help readability for the output of the <code>InvokeEndpoint</code> API. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information. If there are no label headers in the model container output, provide them manually using this parameter.</p>
    pub fn label_headers(&self) -> std::option::Option<&[std::string::String]> {
        self.label_headers.as_deref()
    }
    /// <p>The names of the features. If provided, these are included in the endpoint response payload to help readability of the <code>InvokeEndpoint</code> output. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">Response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
    pub fn feature_headers(&self) -> std::option::Option<&[std::string::String]> {
        self.feature_headers.as_deref()
    }
    /// <p>A list of data types of the features (optional). Applicable only to NLP explainability. If provided, <code>FeatureTypes</code> must have at least one <code>'text'</code> string (for example, <code>['text']</code>). If <code>FeatureTypes</code> is not provided, the explainer infers the feature types based on the baseline data. The feature types are included in the endpoint response payload. For additional information see the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
    pub fn feature_types(&self) -> std::option::Option<&[crate::model::ClarifyFeatureType]> {
        self.feature_types.as_deref()
    }
}
/// See [`ClarifyInferenceConfig`](crate::model::ClarifyInferenceConfig).
pub mod clarify_inference_config {

    /// A builder for [`ClarifyInferenceConfig`](crate::model::ClarifyInferenceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) features_attribute: std::option::Option<std::string::String>,
        pub(crate) content_template: std::option::Option<std::string::String>,
        pub(crate) max_record_count: std::option::Option<i32>,
        pub(crate) max_payload_in_mb: std::option::Option<i32>,
        pub(crate) probability_index: std::option::Option<i32>,
        pub(crate) label_index: std::option::Option<i32>,
        pub(crate) probability_attribute: std::option::Option<std::string::String>,
        pub(crate) label_attribute: std::option::Option<std::string::String>,
        pub(crate) label_headers: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) feature_headers: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) feature_types:
            std::option::Option<std::vec::Vec<crate::model::ClarifyFeatureType>>,
    }
    impl Builder {
        /// <p>Provides the JMESPath expression to extract the features from a model container input in JSON Lines format. For example, if <code>FeaturesAttribute</code> is the JMESPath expression <code>'myfeatures'</code>, it extracts a list of features <code>[1,2,3]</code> from request data <code>'{"myfeatures":[1,2,3]}'</code>.</p>
        pub fn features_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.features_attribute = Some(input.into());
            self
        }
        /// <p>Provides the JMESPath expression to extract the features from a model container input in JSON Lines format. For example, if <code>FeaturesAttribute</code> is the JMESPath expression <code>'myfeatures'</code>, it extracts a list of features <code>[1,2,3]</code> from request data <code>'{"myfeatures":[1,2,3]}'</code>.</p>
        pub fn set_features_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.features_attribute = input;
            self
        }
        /// <p>A template string used to format a JSON record into an acceptable model container input. For example, a <code>ContentTemplate</code> string <code>'{"myfeatures":$features}'</code> will format a list of features <code>[1,2,3]</code> into the record string <code>'{"myfeatures":[1,2,3]}'</code>. Required only when the model container input is in JSON Lines format.</p>
        pub fn content_template(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_template = Some(input.into());
            self
        }
        /// <p>A template string used to format a JSON record into an acceptable model container input. For example, a <code>ContentTemplate</code> string <code>'{"myfeatures":$features}'</code> will format a list of features <code>[1,2,3]</code> into the record string <code>'{"myfeatures":[1,2,3]}'</code>. Required only when the model container input is in JSON Lines format.</p>
        pub fn set_content_template(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.content_template = input;
            self
        }
        /// <p>The maximum number of records in a request that the model container can process when querying the model container for the predictions of a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-synthetic">synthetic dataset</a>. A record is a unit of input data that inference can be made on, for example, a single line in CSV data. If <code>MaxRecordCount</code> is <code>1</code>, the model container expects one record per request. A value of 2 or greater means that the model expects batch requests, which can reduce overhead and speed up the inferencing process. If this parameter is not provided, the explainer will tune the record count per request according to the model container's capacity at runtime.</p>
        pub fn max_record_count(mut self, input: i32) -> Self {
            self.max_record_count = Some(input);
            self
        }
        /// <p>The maximum number of records in a request that the model container can process when querying the model container for the predictions of a <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-create-endpoint.html#clarify-online-explainability-create-endpoint-synthetic">synthetic dataset</a>. A record is a unit of input data that inference can be made on, for example, a single line in CSV data. If <code>MaxRecordCount</code> is <code>1</code>, the model container expects one record per request. A value of 2 or greater means that the model expects batch requests, which can reduce overhead and speed up the inferencing process. If this parameter is not provided, the explainer will tune the record count per request according to the model container's capacity at runtime.</p>
        pub fn set_max_record_count(mut self, input: std::option::Option<i32>) -> Self {
            self.max_record_count = input;
            self
        }
        /// <p>The maximum payload size (MB) allowed of a request from the explainer to the model container. Defaults to <code>6</code> MB.</p>
        pub fn max_payload_in_mb(mut self, input: i32) -> Self {
            self.max_payload_in_mb = Some(input);
            self
        }
        /// <p>The maximum payload size (MB) allowed of a request from the explainer to the model container. Defaults to <code>6</code> MB.</p>
        pub fn set_max_payload_in_mb(mut self, input: std::option::Option<i32>) -> Self {
            self.max_payload_in_mb = input;
            self
        }
        /// <p>A zero-based index used to extract a probability value (score) or list from model container output in CSV format. If this value is not provided, the entire model container output will be treated as a probability value (score) or list.</p>
        /// <p> <b>Example for a single class model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'1,0.6'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability value <code>0.6</code>.</p>
        /// <p> <b>Example for a multiclass model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability values <code>[0.1,0.6,0.3]</code>.</p>
        pub fn probability_index(mut self, input: i32) -> Self {
            self.probability_index = Some(input);
            self
        }
        /// <p>A zero-based index used to extract a probability value (score) or list from model container output in CSV format. If this value is not provided, the entire model container output will be treated as a probability value (score) or list.</p>
        /// <p> <b>Example for a single class model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'1,0.6'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability value <code>0.6</code>.</p>
        /// <p> <b>Example for a multiclass model:</b> If the model container output consists of a string-formatted prediction label followed by its probability: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>ProbabilityIndex</code> to <code>1</code> to select the probability values <code>[0.1,0.6,0.3]</code>.</p>
        pub fn set_probability_index(mut self, input: std::option::Option<i32>) -> Self {
            self.probability_index = input;
            self
        }
        /// <p>A zero-based index used to extract a label header or list of label headers from model container output in CSV format.</p>
        /// <p> <b>Example for a multiclass model:</b> If the model container output consists of label headers followed by probabilities: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>LabelIndex</code> to <code>0</code> to select the label headers <code>['cat','dog','fish']</code>.</p>
        pub fn label_index(mut self, input: i32) -> Self {
            self.label_index = Some(input);
            self
        }
        /// <p>A zero-based index used to extract a label header or list of label headers from model container output in CSV format.</p>
        /// <p> <b>Example for a multiclass model:</b> If the model container output consists of label headers followed by probabilities: <code>'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'</code>, set <code>LabelIndex</code> to <code>0</code> to select the label headers <code>['cat','dog','fish']</code>.</p>
        pub fn set_label_index(mut self, input: std::option::Option<i32>) -> Self {
            self.label_index = input;
            self
        }
        /// <p>A JMESPath expression used to extract the probability (or score) from the model container output if the model container is in JSON Lines format.</p>
        /// <p> <b>Example</b>: If the model container output of a single request is <code>'{"predicted_label":1,"probability":0.6}'</code>, then set <code>ProbabilityAttribute</code> to <code>'probability'</code>.</p>
        pub fn probability_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.probability_attribute = Some(input.into());
            self
        }
        /// <p>A JMESPath expression used to extract the probability (or score) from the model container output if the model container is in JSON Lines format.</p>
        /// <p> <b>Example</b>: If the model container output of a single request is <code>'{"predicted_label":1,"probability":0.6}'</code>, then set <code>ProbabilityAttribute</code> to <code>'probability'</code>.</p>
        pub fn set_probability_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.probability_attribute = input;
            self
        }
        /// <p>A JMESPath expression used to locate the list of label headers in the model container output.</p>
        /// <p> <b>Example</b>: If the model container output of a batch request is <code>'{"labels":["cat","dog","fish"],"probability":[0.6,0.3,0.1]}'</code>, then set <code>LabelAttribute</code> to <code>'labels'</code> to extract the list of label headers <code>["cat","dog","fish"]</code> </p>
        pub fn label_attribute(mut self, input: impl Into<std::string::String>) -> Self {
            self.label_attribute = Some(input.into());
            self
        }
        /// <p>A JMESPath expression used to locate the list of label headers in the model container output.</p>
        /// <p> <b>Example</b>: If the model container output of a batch request is <code>'{"labels":["cat","dog","fish"],"probability":[0.6,0.3,0.1]}'</code>, then set <code>LabelAttribute</code> to <code>'labels'</code> to extract the list of label headers <code>["cat","dog","fish"]</code> </p>
        pub fn set_label_attribute(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.label_attribute = input;
            self
        }
        /// Appends an item to `label_headers`.
        ///
        /// To override the contents of this collection use [`set_label_headers`](Self::set_label_headers).
        ///
        /// <p>For multiclass classification problems, the label headers are the names of the classes. Otherwise, the label header is the name of the predicted label. These are used to help readability for the output of the <code>InvokeEndpoint</code> API. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information. If there are no label headers in the model container output, provide them manually using this parameter.</p>
        pub fn label_headers(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.label_headers.unwrap_or_default();
            v.push(input.into());
            self.label_headers = Some(v);
            self
        }
        /// <p>For multiclass classification problems, the label headers are the names of the classes. Otherwise, the label header is the name of the predicted label. These are used to help readability for the output of the <code>InvokeEndpoint</code> API. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information. If there are no label headers in the model container output, provide them manually using this parameter.</p>
        pub fn set_label_headers(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.label_headers = input;
            self
        }
        /// Appends an item to `feature_headers`.
        ///
        /// To override the contents of this collection use [`set_feature_headers`](Self::set_feature_headers).
        ///
        /// <p>The names of the features. If provided, these are included in the endpoint response payload to help readability of the <code>InvokeEndpoint</code> output. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">Response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
        pub fn feature_headers(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.feature_headers.unwrap_or_default();
            v.push(input.into());
            self.feature_headers = Some(v);
            self
        }
        /// <p>The names of the features. If provided, these are included in the endpoint response payload to help readability of the <code>InvokeEndpoint</code> output. See the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">Response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
        pub fn set_feature_headers(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.feature_headers = input;
            self
        }
        /// Appends an item to `feature_types`.
        ///
        /// To override the contents of this collection use [`set_feature_types`](Self::set_feature_types).
        ///
        /// <p>A list of data types of the features (optional). Applicable only to NLP explainability. If provided, <code>FeatureTypes</code> must have at least one <code>'text'</code> string (for example, <code>['text']</code>). If <code>FeatureTypes</code> is not provided, the explainer infers the feature types based on the baseline data. The feature types are included in the endpoint response payload. For additional information see the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
        pub fn feature_types(mut self, input: crate::model::ClarifyFeatureType) -> Self {
            let mut v = self.feature_types.unwrap_or_default();
            v.push(input);
            self.feature_types = Some(v);
            self
        }
        /// <p>A list of data types of the features (optional). Applicable only to NLP explainability. If provided, <code>FeatureTypes</code> must have at least one <code>'text'</code> string (for example, <code>['text']</code>). If <code>FeatureTypes</code> is not provided, the explainer infers the feature types based on the baseline data. The feature types are included in the endpoint response payload. For additional information see the <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-online-explainability-invoke-endpoint.html#clarify-online-explainability-response">response</a> section under <b>Invoke the endpoint</b> in the Developer Guide for more information.</p>
        pub fn set_feature_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ClarifyFeatureType>>,
        ) -> Self {
            self.feature_types = input;
            self
        }
        /// Consumes the builder and constructs a [`ClarifyInferenceConfig`](crate::model::ClarifyInferenceConfig).
        pub fn build(self) -> crate::model::ClarifyInferenceConfig {
            crate::model::ClarifyInferenceConfig {
                features_attribute: self.features_attribute,
                content_template: self.content_template,
                max_record_count: self.max_record_count,
                max_payload_in_mb: self.max_payload_in_mb,
                probability_index: self.probability_index,
                label_index: self.label_index,
                probability_attribute: self.probability_attribute,
                label_attribute: self.label_attribute,
                label_headers: self.label_headers,
                feature_headers: self.feature_headers,
                feature_types: self.feature_types,
            }
        }
    }
}
impl ClarifyInferenceConfig {
    /// Creates a new builder-style object to manufacture [`ClarifyInferenceConfig`](crate::model::ClarifyInferenceConfig).
    pub fn builder() -> crate::model::clarify_inference_config::Builder {
        crate::model::clarify_inference_config::Builder::default()
    }
}

/// When writing a match expression against `ClarifyFeatureType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let clarifyfeaturetype = unimplemented!();
/// match clarifyfeaturetype {
///     ClarifyFeatureType::Categorical => { /* ... */ },
///     ClarifyFeatureType::Numerical => { /* ... */ },
///     ClarifyFeatureType::Text => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `clarifyfeaturetype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ClarifyFeatureType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ClarifyFeatureType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ClarifyFeatureType::NewFeature` is defined.
/// Specifically, when `clarifyfeaturetype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ClarifyFeatureType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ClarifyFeatureType {
    #[allow(missing_docs)] // documentation missing in model
    Categorical,
    #[allow(missing_docs)] // documentation missing in model
    Numerical,
    #[allow(missing_docs)] // documentation missing in model
    Text,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ClarifyFeatureType {
    fn from(s: &str) -> Self {
        match s {
            "categorical" => ClarifyFeatureType::Categorical,
            "numerical" => ClarifyFeatureType::Numerical,
            "text" => ClarifyFeatureType::Text,
            other => {
                ClarifyFeatureType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for ClarifyFeatureType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ClarifyFeatureType::from(s))
    }
}
impl ClarifyFeatureType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ClarifyFeatureType::Categorical => "categorical",
            ClarifyFeatureType::Numerical => "numerical",
            ClarifyFeatureType::Text => "text",
            ClarifyFeatureType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["categorical", "numerical", "text"]
    }
}
impl AsRef<str> for ClarifyFeatureType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies configuration for how an endpoint performs asynchronous inference.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AsyncInferenceConfig {
    /// <p>Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.</p>
    #[doc(hidden)]
    pub client_config: std::option::Option<crate::model::AsyncInferenceClientConfig>,
    /// <p>Specifies the configuration for asynchronous inference invocation outputs.</p>
    #[doc(hidden)]
    pub output_config: std::option::Option<crate::model::AsyncInferenceOutputConfig>,
}
impl AsyncInferenceConfig {
    /// <p>Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.</p>
    pub fn client_config(&self) -> std::option::Option<&crate::model::AsyncInferenceClientConfig> {
        self.client_config.as_ref()
    }
    /// <p>Specifies the configuration for asynchronous inference invocation outputs.</p>
    pub fn output_config(&self) -> std::option::Option<&crate::model::AsyncInferenceOutputConfig> {
        self.output_config.as_ref()
    }
}
/// See [`AsyncInferenceConfig`](crate::model::AsyncInferenceConfig).
pub mod async_inference_config {

    /// A builder for [`AsyncInferenceConfig`](crate::model::AsyncInferenceConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) client_config: std::option::Option<crate::model::AsyncInferenceClientConfig>,
        pub(crate) output_config: std::option::Option<crate::model::AsyncInferenceOutputConfig>,
    }
    impl Builder {
        /// <p>Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.</p>
        pub fn client_config(mut self, input: crate::model::AsyncInferenceClientConfig) -> Self {
            self.client_config = Some(input);
            self
        }
        /// <p>Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.</p>
        pub fn set_client_config(
            mut self,
            input: std::option::Option<crate::model::AsyncInferenceClientConfig>,
        ) -> Self {
            self.client_config = input;
            self
        }
        /// <p>Specifies the configuration for asynchronous inference invocation outputs.</p>
        pub fn output_config(mut self, input: crate::model::AsyncInferenceOutputConfig) -> Self {
            self.output_config = Some(input);
            self
        }
        /// <p>Specifies the configuration for asynchronous inference invocation outputs.</p>
        pub fn set_output_config(
            mut self,
            input: std::option::Option<crate::model::AsyncInferenceOutputConfig>,
        ) -> Self {
            self.output_config = input;
            self
        }
        /// Consumes the builder and constructs a [`AsyncInferenceConfig`](crate::model::AsyncInferenceConfig).
        pub fn build(self) -> crate::model::AsyncInferenceConfig {
            crate::model::AsyncInferenceConfig {
                client_config: self.client_config,
                output_config: self.output_config,
            }
        }
    }
}
impl AsyncInferenceConfig {
    /// Creates a new builder-style object to manufacture [`AsyncInferenceConfig`](crate::model::AsyncInferenceConfig).
    pub fn builder() -> crate::model::async_inference_config::Builder {
        crate::model::async_inference_config::Builder::default()
    }
}

/// <p>Specifies the configuration for asynchronous inference invocation outputs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AsyncInferenceOutputConfig {
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the asynchronous inference output in Amazon S3.</p>
    /// <p></p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 location to upload inference responses to.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
    /// <p>Specifies the configuration for notifications of inference results for asynchronous inference.</p>
    #[doc(hidden)]
    pub notification_config: std::option::Option<crate::model::AsyncInferenceNotificationConfig>,
}
impl AsyncInferenceOutputConfig {
    /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the asynchronous inference output in Amazon S3.</p>
    /// <p></p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>The Amazon S3 location to upload inference responses to.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
    /// <p>Specifies the configuration for notifications of inference results for asynchronous inference.</p>
    pub fn notification_config(
        &self,
    ) -> std::option::Option<&crate::model::AsyncInferenceNotificationConfig> {
        self.notification_config.as_ref()
    }
}
/// See [`AsyncInferenceOutputConfig`](crate::model::AsyncInferenceOutputConfig).
pub mod async_inference_output_config {

    /// A builder for [`AsyncInferenceOutputConfig`](crate::model::AsyncInferenceOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
        pub(crate) notification_config:
            std::option::Option<crate::model::AsyncInferenceNotificationConfig>,
    }
    impl Builder {
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the asynchronous inference output in Amazon S3.</p>
        /// <p></p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service (Amazon Web Services KMS) key that SageMaker uses to encrypt the asynchronous inference output in Amazon S3.</p>
        /// <p></p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>The Amazon S3 location to upload inference responses to.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location to upload inference responses to.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// <p>Specifies the configuration for notifications of inference results for asynchronous inference.</p>
        pub fn notification_config(
            mut self,
            input: crate::model::AsyncInferenceNotificationConfig,
        ) -> Self {
            self.notification_config = Some(input);
            self
        }
        /// <p>Specifies the configuration for notifications of inference results for asynchronous inference.</p>
        pub fn set_notification_config(
            mut self,
            input: std::option::Option<crate::model::AsyncInferenceNotificationConfig>,
        ) -> Self {
            self.notification_config = input;
            self
        }
        /// Consumes the builder and constructs a [`AsyncInferenceOutputConfig`](crate::model::AsyncInferenceOutputConfig).
        pub fn build(self) -> crate::model::AsyncInferenceOutputConfig {
            crate::model::AsyncInferenceOutputConfig {
                kms_key_id: self.kms_key_id,
                s3_output_path: self.s3_output_path,
                notification_config: self.notification_config,
            }
        }
    }
}
impl AsyncInferenceOutputConfig {
    /// Creates a new builder-style object to manufacture [`AsyncInferenceOutputConfig`](crate::model::AsyncInferenceOutputConfig).
    pub fn builder() -> crate::model::async_inference_output_config::Builder {
        crate::model::async_inference_output_config::Builder::default()
    }
}

/// <p>Specifies the configuration for notifications of inference results for asynchronous inference.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AsyncInferenceNotificationConfig {
    /// <p>Amazon SNS topic to post a notification to when inference completes successfully. If no topic is provided, no notification is sent on success.</p>
    #[doc(hidden)]
    pub success_topic: std::option::Option<std::string::String>,
    /// <p>Amazon SNS topic to post a notification to when inference fails. If no topic is provided, no notification is sent on failure.</p>
    #[doc(hidden)]
    pub error_topic: std::option::Option<std::string::String>,
}
impl AsyncInferenceNotificationConfig {
    /// <p>Amazon SNS topic to post a notification to when inference completes successfully. If no topic is provided, no notification is sent on success.</p>
    pub fn success_topic(&self) -> std::option::Option<&str> {
        self.success_topic.as_deref()
    }
    /// <p>Amazon SNS topic to post a notification to when inference fails. If no topic is provided, no notification is sent on failure.</p>
    pub fn error_topic(&self) -> std::option::Option<&str> {
        self.error_topic.as_deref()
    }
}
/// See [`AsyncInferenceNotificationConfig`](crate::model::AsyncInferenceNotificationConfig).
pub mod async_inference_notification_config {

    /// A builder for [`AsyncInferenceNotificationConfig`](crate::model::AsyncInferenceNotificationConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) success_topic: std::option::Option<std::string::String>,
        pub(crate) error_topic: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Amazon SNS topic to post a notification to when inference completes successfully. If no topic is provided, no notification is sent on success.</p>
        pub fn success_topic(mut self, input: impl Into<std::string::String>) -> Self {
            self.success_topic = Some(input.into());
            self
        }
        /// <p>Amazon SNS topic to post a notification to when inference completes successfully. If no topic is provided, no notification is sent on success.</p>
        pub fn set_success_topic(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.success_topic = input;
            self
        }
        /// <p>Amazon SNS topic to post a notification to when inference fails. If no topic is provided, no notification is sent on failure.</p>
        pub fn error_topic(mut self, input: impl Into<std::string::String>) -> Self {
            self.error_topic = Some(input.into());
            self
        }
        /// <p>Amazon SNS topic to post a notification to when inference fails. If no topic is provided, no notification is sent on failure.</p>
        pub fn set_error_topic(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.error_topic = input;
            self
        }
        /// Consumes the builder and constructs a [`AsyncInferenceNotificationConfig`](crate::model::AsyncInferenceNotificationConfig).
        pub fn build(self) -> crate::model::AsyncInferenceNotificationConfig {
            crate::model::AsyncInferenceNotificationConfig {
                success_topic: self.success_topic,
                error_topic: self.error_topic,
            }
        }
    }
}
impl AsyncInferenceNotificationConfig {
    /// Creates a new builder-style object to manufacture [`AsyncInferenceNotificationConfig`](crate::model::AsyncInferenceNotificationConfig).
    pub fn builder() -> crate::model::async_inference_notification_config::Builder {
        crate::model::async_inference_notification_config::Builder::default()
    }
}

/// <p>Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AsyncInferenceClientConfig {
    /// <p>The maximum number of concurrent requests sent by the SageMaker client to the model container. If no value is provided, SageMaker chooses an optimal value.</p>
    #[doc(hidden)]
    pub max_concurrent_invocations_per_instance: std::option::Option<i32>,
}
impl AsyncInferenceClientConfig {
    /// <p>The maximum number of concurrent requests sent by the SageMaker client to the model container. If no value is provided, SageMaker chooses an optimal value.</p>
    pub fn max_concurrent_invocations_per_instance(&self) -> std::option::Option<i32> {
        self.max_concurrent_invocations_per_instance
    }
}
/// See [`AsyncInferenceClientConfig`](crate::model::AsyncInferenceClientConfig).
pub mod async_inference_client_config {

    /// A builder for [`AsyncInferenceClientConfig`](crate::model::AsyncInferenceClientConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_concurrent_invocations_per_instance: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The maximum number of concurrent requests sent by the SageMaker client to the model container. If no value is provided, SageMaker chooses an optimal value.</p>
        pub fn max_concurrent_invocations_per_instance(mut self, input: i32) -> Self {
            self.max_concurrent_invocations_per_instance = Some(input);
            self
        }
        /// <p>The maximum number of concurrent requests sent by the SageMaker client to the model container. If no value is provided, SageMaker chooses an optimal value.</p>
        pub fn set_max_concurrent_invocations_per_instance(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.max_concurrent_invocations_per_instance = input;
            self
        }
        /// Consumes the builder and constructs a [`AsyncInferenceClientConfig`](crate::model::AsyncInferenceClientConfig).
        pub fn build(self) -> crate::model::AsyncInferenceClientConfig {
            crate::model::AsyncInferenceClientConfig {
                max_concurrent_invocations_per_instance: self
                    .max_concurrent_invocations_per_instance,
            }
        }
    }
}
impl AsyncInferenceClientConfig {
    /// Creates a new builder-style object to manufacture [`AsyncInferenceClientConfig`](crate::model::AsyncInferenceClientConfig).
    pub fn builder() -> crate::model::async_inference_client_config::Builder {
        crate::model::async_inference_client_config::Builder::default()
    }
}

/// <p>Configuration to control how SageMaker captures inference data.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataCaptureConfig {
    /// <p>Whether data capture should be enabled or disabled (defaults to enabled).</p>
    #[doc(hidden)]
    pub enable_capture: bool,
    /// <p>The percentage of requests SageMaker will capture. A lower value is recommended for Endpoints with high traffic.</p>
    #[doc(hidden)]
    pub initial_sampling_percentage: std::option::Option<i32>,
    /// <p>The Amazon S3 location used to capture the data.</p>
    #[doc(hidden)]
    pub destination_s3_uri: std::option::Option<std::string::String>,
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt the captured data at rest using Amazon S3 server-side encryption.</p>
    /// <p>The KmsKeyId can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>Specifies data Model Monitor will capture. You can configure whether to collect only input, only output, or both</p>
    #[doc(hidden)]
    pub capture_options: std::option::Option<std::vec::Vec<crate::model::CaptureOption>>,
    /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
    #[doc(hidden)]
    pub capture_content_type_header: std::option::Option<crate::model::CaptureContentTypeHeader>,
}
impl DataCaptureConfig {
    /// <p>Whether data capture should be enabled or disabled (defaults to enabled).</p>
    pub fn enable_capture(&self) -> bool {
        self.enable_capture
    }
    /// <p>The percentage of requests SageMaker will capture. A lower value is recommended for Endpoints with high traffic.</p>
    pub fn initial_sampling_percentage(&self) -> std::option::Option<i32> {
        self.initial_sampling_percentage
    }
    /// <p>The Amazon S3 location used to capture the data.</p>
    pub fn destination_s3_uri(&self) -> std::option::Option<&str> {
        self.destination_s3_uri.as_deref()
    }
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt the captured data at rest using Amazon S3 server-side encryption.</p>
    /// <p>The KmsKeyId can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>Specifies data Model Monitor will capture. You can configure whether to collect only input, only output, or both</p>
    pub fn capture_options(&self) -> std::option::Option<&[crate::model::CaptureOption]> {
        self.capture_options.as_deref()
    }
    /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
    pub fn capture_content_type_header(
        &self,
    ) -> std::option::Option<&crate::model::CaptureContentTypeHeader> {
        self.capture_content_type_header.as_ref()
    }
}
/// See [`DataCaptureConfig`](crate::model::DataCaptureConfig).
pub mod data_capture_config {

    /// A builder for [`DataCaptureConfig`](crate::model::DataCaptureConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) enable_capture: std::option::Option<bool>,
        pub(crate) initial_sampling_percentage: std::option::Option<i32>,
        pub(crate) destination_s3_uri: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) capture_options: std::option::Option<std::vec::Vec<crate::model::CaptureOption>>,
        pub(crate) capture_content_type_header:
            std::option::Option<crate::model::CaptureContentTypeHeader>,
    }
    impl Builder {
        /// <p>Whether data capture should be enabled or disabled (defaults to enabled).</p>
        pub fn enable_capture(mut self, input: bool) -> Self {
            self.enable_capture = Some(input);
            self
        }
        /// <p>Whether data capture should be enabled or disabled (defaults to enabled).</p>
        pub fn set_enable_capture(mut self, input: std::option::Option<bool>) -> Self {
            self.enable_capture = input;
            self
        }
        /// <p>The percentage of requests SageMaker will capture. A lower value is recommended for Endpoints with high traffic.</p>
        pub fn initial_sampling_percentage(mut self, input: i32) -> Self {
            self.initial_sampling_percentage = Some(input);
            self
        }
        /// <p>The percentage of requests SageMaker will capture. A lower value is recommended for Endpoints with high traffic.</p>
        pub fn set_initial_sampling_percentage(mut self, input: std::option::Option<i32>) -> Self {
            self.initial_sampling_percentage = input;
            self
        }
        /// <p>The Amazon S3 location used to capture the data.</p>
        pub fn destination_s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.destination_s3_uri = Some(input.into());
            self
        }
        /// <p>The Amazon S3 location used to capture the data.</p>
        pub fn set_destination_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.destination_s3_uri = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt the captured data at rest using Amazon S3 server-side encryption.</p>
        /// <p>The KmsKeyId can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service key that SageMaker uses to encrypt the captured data at rest using Amazon S3 server-side encryption.</p>
        /// <p>The KmsKeyId can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Appends an item to `capture_options`.
        ///
        /// To override the contents of this collection use [`set_capture_options`](Self::set_capture_options).
        ///
        /// <p>Specifies data Model Monitor will capture. You can configure whether to collect only input, only output, or both</p>
        pub fn capture_options(mut self, input: crate::model::CaptureOption) -> Self {
            let mut v = self.capture_options.unwrap_or_default();
            v.push(input);
            self.capture_options = Some(v);
            self
        }
        /// <p>Specifies data Model Monitor will capture. You can configure whether to collect only input, only output, or both</p>
        pub fn set_capture_options(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CaptureOption>>,
        ) -> Self {
            self.capture_options = input;
            self
        }
        /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
        pub fn capture_content_type_header(
            mut self,
            input: crate::model::CaptureContentTypeHeader,
        ) -> Self {
            self.capture_content_type_header = Some(input);
            self
        }
        /// <p>Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.</p>
        pub fn set_capture_content_type_header(
            mut self,
            input: std::option::Option<crate::model::CaptureContentTypeHeader>,
        ) -> Self {
            self.capture_content_type_header = input;
            self
        }
        /// Consumes the builder and constructs a [`DataCaptureConfig`](crate::model::DataCaptureConfig).
        pub fn build(self) -> crate::model::DataCaptureConfig {
            crate::model::DataCaptureConfig {
                enable_capture: self.enable_capture.unwrap_or_default(),
                initial_sampling_percentage: self.initial_sampling_percentage,
                destination_s3_uri: self.destination_s3_uri,
                kms_key_id: self.kms_key_id,
                capture_options: self.capture_options,
                capture_content_type_header: self.capture_content_type_header,
            }
        }
    }
}
impl DataCaptureConfig {
    /// Creates a new builder-style object to manufacture [`DataCaptureConfig`](crate::model::DataCaptureConfig).
    pub fn builder() -> crate::model::data_capture_config::Builder {
        crate::model::data_capture_config::Builder::default()
    }
}

/// <p>Specifies data Model Monitor will capture.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CaptureOption {
    /// <p>Specify the boundary of data to capture.</p>
    #[doc(hidden)]
    pub capture_mode: std::option::Option<crate::model::CaptureMode>,
}
impl CaptureOption {
    /// <p>Specify the boundary of data to capture.</p>
    pub fn capture_mode(&self) -> std::option::Option<&crate::model::CaptureMode> {
        self.capture_mode.as_ref()
    }
}
/// See [`CaptureOption`](crate::model::CaptureOption).
pub mod capture_option {

    /// A builder for [`CaptureOption`](crate::model::CaptureOption).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) capture_mode: std::option::Option<crate::model::CaptureMode>,
    }
    impl Builder {
        /// <p>Specify the boundary of data to capture.</p>
        pub fn capture_mode(mut self, input: crate::model::CaptureMode) -> Self {
            self.capture_mode = Some(input);
            self
        }
        /// <p>Specify the boundary of data to capture.</p>
        pub fn set_capture_mode(
            mut self,
            input: std::option::Option<crate::model::CaptureMode>,
        ) -> Self {
            self.capture_mode = input;
            self
        }
        /// Consumes the builder and constructs a [`CaptureOption`](crate::model::CaptureOption).
        pub fn build(self) -> crate::model::CaptureOption {
            crate::model::CaptureOption {
                capture_mode: self.capture_mode,
            }
        }
    }
}
impl CaptureOption {
    /// Creates a new builder-style object to manufacture [`CaptureOption`](crate::model::CaptureOption).
    pub fn builder() -> crate::model::capture_option::Builder {
        crate::model::capture_option::Builder::default()
    }
}

/// When writing a match expression against `CaptureMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let capturemode = unimplemented!();
/// match capturemode {
///     CaptureMode::Input => { /* ... */ },
///     CaptureMode::Output => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `capturemode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `CaptureMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `CaptureMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `CaptureMode::NewFeature` is defined.
/// Specifically, when `capturemode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `CaptureMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum CaptureMode {
    #[allow(missing_docs)] // documentation missing in model
    Input,
    #[allow(missing_docs)] // documentation missing in model
    Output,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for CaptureMode {
    fn from(s: &str) -> Self {
        match s {
            "Input" => CaptureMode::Input,
            "Output" => CaptureMode::Output,
            other => CaptureMode::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for CaptureMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(CaptureMode::from(s))
    }
}
impl CaptureMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            CaptureMode::Input => "Input",
            CaptureMode::Output => "Output",
            CaptureMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Input", "Output"]
    }
}
impl AsRef<str> for CaptureMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The summary of an in-progress deployment when an endpoint is creating or updating with a new endpoint configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PendingDeploymentSummary {
    /// <p>The name of the endpoint configuration used in the deployment. </p>
    #[doc(hidden)]
    pub endpoint_config_name: std::option::Option<std::string::String>,
    /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint for the in-progress deployment.</p>
    #[doc(hidden)]
    pub production_variants:
        std::option::Option<std::vec::Vec<crate::model::PendingProductionVariantSummary>>,
    /// <p>The start time of the deployment.</p>
    #[doc(hidden)]
    pub start_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint in shadow mode with production traffic replicated from the model specified on <code>ProductionVariants</code> for the in-progress deployment.</p>
    #[doc(hidden)]
    pub shadow_production_variants:
        std::option::Option<std::vec::Vec<crate::model::PendingProductionVariantSummary>>,
}
impl PendingDeploymentSummary {
    /// <p>The name of the endpoint configuration used in the deployment. </p>
    pub fn endpoint_config_name(&self) -> std::option::Option<&str> {
        self.endpoint_config_name.as_deref()
    }
    /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint for the in-progress deployment.</p>
    pub fn production_variants(
        &self,
    ) -> std::option::Option<&[crate::model::PendingProductionVariantSummary]> {
        self.production_variants.as_deref()
    }
    /// <p>The start time of the deployment.</p>
    pub fn start_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.start_time.as_ref()
    }
    /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint in shadow mode with production traffic replicated from the model specified on <code>ProductionVariants</code> for the in-progress deployment.</p>
    pub fn shadow_production_variants(
        &self,
    ) -> std::option::Option<&[crate::model::PendingProductionVariantSummary]> {
        self.shadow_production_variants.as_deref()
    }
}
/// See [`PendingDeploymentSummary`](crate::model::PendingDeploymentSummary).
pub mod pending_deployment_summary {

    /// A builder for [`PendingDeploymentSummary`](crate::model::PendingDeploymentSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_config_name: std::option::Option<std::string::String>,
        pub(crate) production_variants:
            std::option::Option<std::vec::Vec<crate::model::PendingProductionVariantSummary>>,
        pub(crate) start_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) shadow_production_variants:
            std::option::Option<std::vec::Vec<crate::model::PendingProductionVariantSummary>>,
    }
    impl Builder {
        /// <p>The name of the endpoint configuration used in the deployment. </p>
        pub fn endpoint_config_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_config_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint configuration used in the deployment. </p>
        pub fn set_endpoint_config_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_config_name = input;
            self
        }
        /// Appends an item to `production_variants`.
        ///
        /// To override the contents of this collection use [`set_production_variants`](Self::set_production_variants).
        ///
        /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint for the in-progress deployment.</p>
        pub fn production_variants(
            mut self,
            input: crate::model::PendingProductionVariantSummary,
        ) -> Self {
            let mut v = self.production_variants.unwrap_or_default();
            v.push(input);
            self.production_variants = Some(v);
            self
        }
        /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint for the in-progress deployment.</p>
        pub fn set_production_variants(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::PendingProductionVariantSummary>,
            >,
        ) -> Self {
            self.production_variants = input;
            self
        }
        /// <p>The start time of the deployment.</p>
        pub fn start_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.start_time = Some(input);
            self
        }
        /// <p>The start time of the deployment.</p>
        pub fn set_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.start_time = input;
            self
        }
        /// Appends an item to `shadow_production_variants`.
        ///
        /// To override the contents of this collection use [`set_shadow_production_variants`](Self::set_shadow_production_variants).
        ///
        /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint in shadow mode with production traffic replicated from the model specified on <code>ProductionVariants</code> for the in-progress deployment.</p>
        pub fn shadow_production_variants(
            mut self,
            input: crate::model::PendingProductionVariantSummary,
        ) -> Self {
            let mut v = self.shadow_production_variants.unwrap_or_default();
            v.push(input);
            self.shadow_production_variants = Some(v);
            self
        }
        /// <p>An array of <code>PendingProductionVariantSummary</code> objects, one for each model hosted behind this endpoint in shadow mode with production traffic replicated from the model specified on <code>ProductionVariants</code> for the in-progress deployment.</p>
        pub fn set_shadow_production_variants(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::PendingProductionVariantSummary>,
            >,
        ) -> Self {
            self.shadow_production_variants = input;
            self
        }
        /// Consumes the builder and constructs a [`PendingDeploymentSummary`](crate::model::PendingDeploymentSummary).
        pub fn build(self) -> crate::model::PendingDeploymentSummary {
            crate::model::PendingDeploymentSummary {
                endpoint_config_name: self.endpoint_config_name,
                production_variants: self.production_variants,
                start_time: self.start_time,
                shadow_production_variants: self.shadow_production_variants,
            }
        }
    }
}
impl PendingDeploymentSummary {
    /// Creates a new builder-style object to manufacture [`PendingDeploymentSummary`](crate::model::PendingDeploymentSummary).
    pub fn builder() -> crate::model::pending_deployment_summary::Builder {
        crate::model::pending_deployment_summary::Builder::default()
    }
}

/// <p>The production variant summary for a deployment when an endpoint is creating or updating with the <code> <code>CreateEndpoint</code> </code> or <code> <code>UpdateEndpoint</code> </code> operations. Describes the <code>VariantStatus </code>, weight and capacity for a production variant associated with an endpoint. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct PendingProductionVariantSummary {
    /// <p>The name of the variant.</p>
    #[doc(hidden)]
    pub variant_name: std::option::Option<std::string::String>,
    /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
    #[doc(hidden)]
    pub deployed_images: std::option::Option<std::vec::Vec<crate::model::DeployedImage>>,
    /// <p>The weight associated with the variant.</p>
    #[doc(hidden)]
    pub current_weight: std::option::Option<f32>,
    /// <p>The requested weight for the variant in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
    #[doc(hidden)]
    pub desired_weight: std::option::Option<f32>,
    /// <p>The number of instances associated with the variant.</p>
    #[doc(hidden)]
    pub current_instance_count: std::option::Option<i32>,
    /// <p>The number of instances requested in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
    #[doc(hidden)]
    pub desired_instance_count: std::option::Option<i32>,
    /// <p>The type of instances associated with the variant.</p>
    #[doc(hidden)]
    pub instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
    /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
    #[doc(hidden)]
    pub accelerator_type: std::option::Option<crate::model::ProductionVariantAcceleratorType>,
    /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
    #[doc(hidden)]
    pub variant_status: std::option::Option<std::vec::Vec<crate::model::ProductionVariantStatus>>,
    /// <p>The serverless configuration for the endpoint.</p>
    #[doc(hidden)]
    pub current_serverless_config:
        std::option::Option<crate::model::ProductionVariantServerlessConfig>,
    /// <p>The serverless configuration requested for this deployment, as specified in the endpoint configuration for the endpoint.</p>
    #[doc(hidden)]
    pub desired_serverless_config:
        std::option::Option<crate::model::ProductionVariantServerlessConfig>,
}
impl PendingProductionVariantSummary {
    /// <p>The name of the variant.</p>
    pub fn variant_name(&self) -> std::option::Option<&str> {
        self.variant_name.as_deref()
    }
    /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
    pub fn deployed_images(&self) -> std::option::Option<&[crate::model::DeployedImage]> {
        self.deployed_images.as_deref()
    }
    /// <p>The weight associated with the variant.</p>
    pub fn current_weight(&self) -> std::option::Option<f32> {
        self.current_weight
    }
    /// <p>The requested weight for the variant in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
    pub fn desired_weight(&self) -> std::option::Option<f32> {
        self.desired_weight
    }
    /// <p>The number of instances associated with the variant.</p>
    pub fn current_instance_count(&self) -> std::option::Option<i32> {
        self.current_instance_count
    }
    /// <p>The number of instances requested in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
    pub fn desired_instance_count(&self) -> std::option::Option<i32> {
        self.desired_instance_count
    }
    /// <p>The type of instances associated with the variant.</p>
    pub fn instance_type(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantInstanceType> {
        self.instance_type.as_ref()
    }
    /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
    pub fn accelerator_type(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantAcceleratorType> {
        self.accelerator_type.as_ref()
    }
    /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
    pub fn variant_status(&self) -> std::option::Option<&[crate::model::ProductionVariantStatus]> {
        self.variant_status.as_deref()
    }
    /// <p>The serverless configuration for the endpoint.</p>
    pub fn current_serverless_config(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantServerlessConfig> {
        self.current_serverless_config.as_ref()
    }
    /// <p>The serverless configuration requested for this deployment, as specified in the endpoint configuration for the endpoint.</p>
    pub fn desired_serverless_config(
        &self,
    ) -> std::option::Option<&crate::model::ProductionVariantServerlessConfig> {
        self.desired_serverless_config.as_ref()
    }
}
/// See [`PendingProductionVariantSummary`](crate::model::PendingProductionVariantSummary).
pub mod pending_production_variant_summary {

    /// A builder for [`PendingProductionVariantSummary`](crate::model::PendingProductionVariantSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) variant_name: std::option::Option<std::string::String>,
        pub(crate) deployed_images: std::option::Option<std::vec::Vec<crate::model::DeployedImage>>,
        pub(crate) current_weight: std::option::Option<f32>,
        pub(crate) desired_weight: std::option::Option<f32>,
        pub(crate) current_instance_count: std::option::Option<i32>,
        pub(crate) desired_instance_count: std::option::Option<i32>,
        pub(crate) instance_type: std::option::Option<crate::model::ProductionVariantInstanceType>,
        pub(crate) accelerator_type:
            std::option::Option<crate::model::ProductionVariantAcceleratorType>,
        pub(crate) variant_status:
            std::option::Option<std::vec::Vec<crate::model::ProductionVariantStatus>>,
        pub(crate) current_serverless_config:
            std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        pub(crate) desired_serverless_config:
            std::option::Option<crate::model::ProductionVariantServerlessConfig>,
    }
    impl Builder {
        /// <p>The name of the variant.</p>
        pub fn variant_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.variant_name = Some(input.into());
            self
        }
        /// <p>The name of the variant.</p>
        pub fn set_variant_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.variant_name = input;
            self
        }
        /// Appends an item to `deployed_images`.
        ///
        /// To override the contents of this collection use [`set_deployed_images`](Self::set_deployed_images).
        ///
        /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
        pub fn deployed_images(mut self, input: crate::model::DeployedImage) -> Self {
            let mut v = self.deployed_images.unwrap_or_default();
            v.push(input);
            self.deployed_images = Some(v);
            self
        }
        /// <p>An array of <code>DeployedImage</code> objects that specify the Amazon EC2 Container Registry paths of the inference images deployed on instances of this <code>ProductionVariant</code>.</p>
        pub fn set_deployed_images(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::DeployedImage>>,
        ) -> Self {
            self.deployed_images = input;
            self
        }
        /// <p>The weight associated with the variant.</p>
        pub fn current_weight(mut self, input: f32) -> Self {
            self.current_weight = Some(input);
            self
        }
        /// <p>The weight associated with the variant.</p>
        pub fn set_current_weight(mut self, input: std::option::Option<f32>) -> Self {
            self.current_weight = input;
            self
        }
        /// <p>The requested weight for the variant in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
        pub fn desired_weight(mut self, input: f32) -> Self {
            self.desired_weight = Some(input);
            self
        }
        /// <p>The requested weight for the variant in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
        pub fn set_desired_weight(mut self, input: std::option::Option<f32>) -> Self {
            self.desired_weight = input;
            self
        }
        /// <p>The number of instances associated with the variant.</p>
        pub fn current_instance_count(mut self, input: i32) -> Self {
            self.current_instance_count = Some(input);
            self
        }
        /// <p>The number of instances associated with the variant.</p>
        pub fn set_current_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.current_instance_count = input;
            self
        }
        /// <p>The number of instances requested in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
        pub fn desired_instance_count(mut self, input: i32) -> Self {
            self.desired_instance_count = Some(input);
            self
        }
        /// <p>The number of instances requested in this deployment, as specified in the endpoint configuration for the endpoint. The value is taken from the request to the <code> <code>CreateEndpointConfig</code> </code> operation.</p>
        pub fn set_desired_instance_count(mut self, input: std::option::Option<i32>) -> Self {
            self.desired_instance_count = input;
            self
        }
        /// <p>The type of instances associated with the variant.</p>
        pub fn instance_type(mut self, input: crate::model::ProductionVariantInstanceType) -> Self {
            self.instance_type = Some(input);
            self
        }
        /// <p>The type of instances associated with the variant.</p>
        pub fn set_instance_type(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantInstanceType>,
        ) -> Self {
            self.instance_type = input;
            self
        }
        /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
        pub fn accelerator_type(
            mut self,
            input: crate::model::ProductionVariantAcceleratorType,
        ) -> Self {
            self.accelerator_type = Some(input);
            self
        }
        /// <p>The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html">Using Elastic Inference in Amazon SageMaker</a>.</p>
        pub fn set_accelerator_type(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantAcceleratorType>,
        ) -> Self {
            self.accelerator_type = input;
            self
        }
        /// Appends an item to `variant_status`.
        ///
        /// To override the contents of this collection use [`set_variant_status`](Self::set_variant_status).
        ///
        /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
        pub fn variant_status(mut self, input: crate::model::ProductionVariantStatus) -> Self {
            let mut v = self.variant_status.unwrap_or_default();
            v.push(input);
            self.variant_status = Some(v);
            self
        }
        /// <p>The endpoint variant status which describes the current deployment stage status or operational status.</p>
        pub fn set_variant_status(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ProductionVariantStatus>>,
        ) -> Self {
            self.variant_status = input;
            self
        }
        /// <p>The serverless configuration for the endpoint.</p>
        pub fn current_serverless_config(
            mut self,
            input: crate::model::ProductionVariantServerlessConfig,
        ) -> Self {
            self.current_serverless_config = Some(input);
            self
        }
        /// <p>The serverless configuration for the endpoint.</p>
        pub fn set_current_serverless_config(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        ) -> Self {
            self.current_serverless_config = input;
            self
        }
        /// <p>The serverless configuration requested for this deployment, as specified in the endpoint configuration for the endpoint.</p>
        pub fn desired_serverless_config(
            mut self,
            input: crate::model::ProductionVariantServerlessConfig,
        ) -> Self {
            self.desired_serverless_config = Some(input);
            self
        }
        /// <p>The serverless configuration requested for this deployment, as specified in the endpoint configuration for the endpoint.</p>
        pub fn set_desired_serverless_config(
            mut self,
            input: std::option::Option<crate::model::ProductionVariantServerlessConfig>,
        ) -> Self {
            self.desired_serverless_config = input;
            self
        }
        /// Consumes the builder and constructs a [`PendingProductionVariantSummary`](crate::model::PendingProductionVariantSummary).
        pub fn build(self) -> crate::model::PendingProductionVariantSummary {
            crate::model::PendingProductionVariantSummary {
                variant_name: self.variant_name,
                deployed_images: self.deployed_images,
                current_weight: self.current_weight,
                desired_weight: self.desired_weight,
                current_instance_count: self.current_instance_count,
                desired_instance_count: self.desired_instance_count,
                instance_type: self.instance_type,
                accelerator_type: self.accelerator_type,
                variant_status: self.variant_status,
                current_serverless_config: self.current_serverless_config,
                desired_serverless_config: self.desired_serverless_config,
            }
        }
    }
}
impl PendingProductionVariantSummary {
    /// Creates a new builder-style object to manufacture [`PendingProductionVariantSummary`](crate::model::PendingProductionVariantSummary).
    pub fn builder() -> crate::model::pending_production_variant_summary::Builder {
        crate::model::pending_production_variant_summary::Builder::default()
    }
}

/// <p>The output of a SageMaker Edge Manager deployable resource.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgePresetDeploymentOutput {
    /// <p>The deployment type created by SageMaker Edge Manager. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::EdgePresetDeploymentType>,
    /// <p>The Amazon Resource Name (ARN) of the generated deployable resource.</p>
    #[doc(hidden)]
    pub artifact: std::option::Option<std::string::String>,
    /// <p>The status of the deployable resource.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::EdgePresetDeploymentStatus>,
    /// <p>Returns a message describing the status of the deployed resource.</p>
    #[doc(hidden)]
    pub status_message: std::option::Option<std::string::String>,
}
impl EdgePresetDeploymentOutput {
    /// <p>The deployment type created by SageMaker Edge Manager. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
    pub fn r#type(&self) -> std::option::Option<&crate::model::EdgePresetDeploymentType> {
        self.r#type.as_ref()
    }
    /// <p>The Amazon Resource Name (ARN) of the generated deployable resource.</p>
    pub fn artifact(&self) -> std::option::Option<&str> {
        self.artifact.as_deref()
    }
    /// <p>The status of the deployable resource.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::EdgePresetDeploymentStatus> {
        self.status.as_ref()
    }
    /// <p>Returns a message describing the status of the deployed resource.</p>
    pub fn status_message(&self) -> std::option::Option<&str> {
        self.status_message.as_deref()
    }
}
/// See [`EdgePresetDeploymentOutput`](crate::model::EdgePresetDeploymentOutput).
pub mod edge_preset_deployment_output {

    /// A builder for [`EdgePresetDeploymentOutput`](crate::model::EdgePresetDeploymentOutput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) r#type: std::option::Option<crate::model::EdgePresetDeploymentType>,
        pub(crate) artifact: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::EdgePresetDeploymentStatus>,
        pub(crate) status_message: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The deployment type created by SageMaker Edge Manager. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
        pub fn r#type(mut self, input: crate::model::EdgePresetDeploymentType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>The deployment type created by SageMaker Edge Manager. Currently only supports Amazon Web Services IoT Greengrass Version 2 components.</p>
        pub fn set_type(
            mut self,
            input: std::option::Option<crate::model::EdgePresetDeploymentType>,
        ) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the generated deployable resource.</p>
        pub fn artifact(mut self, input: impl Into<std::string::String>) -> Self {
            self.artifact = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the generated deployable resource.</p>
        pub fn set_artifact(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.artifact = input;
            self
        }
        /// <p>The status of the deployable resource.</p>
        pub fn status(mut self, input: crate::model::EdgePresetDeploymentStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The status of the deployable resource.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::EdgePresetDeploymentStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>Returns a message describing the status of the deployed resource.</p>
        pub fn status_message(mut self, input: impl Into<std::string::String>) -> Self {
            self.status_message = Some(input.into());
            self
        }
        /// <p>Returns a message describing the status of the deployed resource.</p>
        pub fn set_status_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.status_message = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgePresetDeploymentOutput`](crate::model::EdgePresetDeploymentOutput).
        pub fn build(self) -> crate::model::EdgePresetDeploymentOutput {
            crate::model::EdgePresetDeploymentOutput {
                r#type: self.r#type,
                artifact: self.artifact,
                status: self.status,
                status_message: self.status_message,
            }
        }
    }
}
impl EdgePresetDeploymentOutput {
    /// Creates a new builder-style object to manufacture [`EdgePresetDeploymentOutput`](crate::model::EdgePresetDeploymentOutput).
    pub fn builder() -> crate::model::edge_preset_deployment_output::Builder {
        crate::model::edge_preset_deployment_output::Builder::default()
    }
}

/// When writing a match expression against `EdgePresetDeploymentStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let edgepresetdeploymentstatus = unimplemented!();
/// match edgepresetdeploymentstatus {
///     EdgePresetDeploymentStatus::Completed => { /* ... */ },
///     EdgePresetDeploymentStatus::Failed => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `edgepresetdeploymentstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `EdgePresetDeploymentStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `EdgePresetDeploymentStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `EdgePresetDeploymentStatus::NewFeature` is defined.
/// Specifically, when `edgepresetdeploymentstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `EdgePresetDeploymentStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum EdgePresetDeploymentStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for EdgePresetDeploymentStatus {
    fn from(s: &str) -> Self {
        match s {
            "COMPLETED" => EdgePresetDeploymentStatus::Completed,
            "FAILED" => EdgePresetDeploymentStatus::Failed,
            other => EdgePresetDeploymentStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for EdgePresetDeploymentStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(EdgePresetDeploymentStatus::from(s))
    }
}
impl EdgePresetDeploymentStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            EdgePresetDeploymentStatus::Completed => "COMPLETED",
            EdgePresetDeploymentStatus::Failed => "FAILED",
            EdgePresetDeploymentStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["COMPLETED", "FAILED"]
    }
}
impl AsRef<str> for EdgePresetDeploymentStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information summarizing the deployment stage results.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeploymentStageStatusSummary {
    /// <p>The name of the stage.</p>
    #[doc(hidden)]
    pub stage_name: std::option::Option<std::string::String>,
    /// <p>Configuration of the devices in the stage.</p>
    #[doc(hidden)]
    pub device_selection_config: std::option::Option<crate::model::DeviceSelectionConfig>,
    /// <p>Configuration of the deployment details.</p>
    #[doc(hidden)]
    pub deployment_config: std::option::Option<crate::model::EdgeDeploymentConfig>,
    /// <p>General status of the current state.</p>
    #[doc(hidden)]
    pub deployment_status: std::option::Option<crate::model::EdgeDeploymentStatus>,
}
impl DeploymentStageStatusSummary {
    /// <p>The name of the stage.</p>
    pub fn stage_name(&self) -> std::option::Option<&str> {
        self.stage_name.as_deref()
    }
    /// <p>Configuration of the devices in the stage.</p>
    pub fn device_selection_config(
        &self,
    ) -> std::option::Option<&crate::model::DeviceSelectionConfig> {
        self.device_selection_config.as_ref()
    }
    /// <p>Configuration of the deployment details.</p>
    pub fn deployment_config(&self) -> std::option::Option<&crate::model::EdgeDeploymentConfig> {
        self.deployment_config.as_ref()
    }
    /// <p>General status of the current state.</p>
    pub fn deployment_status(&self) -> std::option::Option<&crate::model::EdgeDeploymentStatus> {
        self.deployment_status.as_ref()
    }
}
/// See [`DeploymentStageStatusSummary`](crate::model::DeploymentStageStatusSummary).
pub mod deployment_stage_status_summary {

    /// A builder for [`DeploymentStageStatusSummary`](crate::model::DeploymentStageStatusSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) stage_name: std::option::Option<std::string::String>,
        pub(crate) device_selection_config:
            std::option::Option<crate::model::DeviceSelectionConfig>,
        pub(crate) deployment_config: std::option::Option<crate::model::EdgeDeploymentConfig>,
        pub(crate) deployment_status: std::option::Option<crate::model::EdgeDeploymentStatus>,
    }
    impl Builder {
        /// <p>The name of the stage.</p>
        pub fn stage_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.stage_name = Some(input.into());
            self
        }
        /// <p>The name of the stage.</p>
        pub fn set_stage_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.stage_name = input;
            self
        }
        /// <p>Configuration of the devices in the stage.</p>
        pub fn device_selection_config(
            mut self,
            input: crate::model::DeviceSelectionConfig,
        ) -> Self {
            self.device_selection_config = Some(input);
            self
        }
        /// <p>Configuration of the devices in the stage.</p>
        pub fn set_device_selection_config(
            mut self,
            input: std::option::Option<crate::model::DeviceSelectionConfig>,
        ) -> Self {
            self.device_selection_config = input;
            self
        }
        /// <p>Configuration of the deployment details.</p>
        pub fn deployment_config(mut self, input: crate::model::EdgeDeploymentConfig) -> Self {
            self.deployment_config = Some(input);
            self
        }
        /// <p>Configuration of the deployment details.</p>
        pub fn set_deployment_config(
            mut self,
            input: std::option::Option<crate::model::EdgeDeploymentConfig>,
        ) -> Self {
            self.deployment_config = input;
            self
        }
        /// <p>General status of the current state.</p>
        pub fn deployment_status(mut self, input: crate::model::EdgeDeploymentStatus) -> Self {
            self.deployment_status = Some(input);
            self
        }
        /// <p>General status of the current state.</p>
        pub fn set_deployment_status(
            mut self,
            input: std::option::Option<crate::model::EdgeDeploymentStatus>,
        ) -> Self {
            self.deployment_status = input;
            self
        }
        /// Consumes the builder and constructs a [`DeploymentStageStatusSummary`](crate::model::DeploymentStageStatusSummary).
        pub fn build(self) -> crate::model::DeploymentStageStatusSummary {
            crate::model::DeploymentStageStatusSummary {
                stage_name: self.stage_name,
                device_selection_config: self.device_selection_config,
                deployment_config: self.deployment_config,
                deployment_status: self.deployment_status,
            }
        }
    }
}
impl DeploymentStageStatusSummary {
    /// Creates a new builder-style object to manufacture [`DeploymentStageStatusSummary`](crate::model::DeploymentStageStatusSummary).
    pub fn builder() -> crate::model::deployment_stage_status_summary::Builder {
        crate::model::deployment_stage_status_summary::Builder::default()
    }
}

/// <p>Contains information summarizing the deployment stage results.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeDeploymentStatus {
    /// <p>The general status of the current stage.</p>
    #[doc(hidden)]
    pub stage_status: std::option::Option<crate::model::StageStatus>,
    /// <p>The number of edge devices with the successful deployment in the current stage.</p>
    #[doc(hidden)]
    pub edge_deployment_success_in_stage: i32,
    /// <p>The number of edge devices yet to pick up the deployment in current stage, or in progress.</p>
    #[doc(hidden)]
    pub edge_deployment_pending_in_stage: i32,
    /// <p>The number of edge devices that failed the deployment in current stage.</p>
    #[doc(hidden)]
    pub edge_deployment_failed_in_stage: i32,
    /// <p>A detailed message about deployment status in current stage.</p>
    #[doc(hidden)]
    pub edge_deployment_status_message: std::option::Option<std::string::String>,
    /// <p>The time when the deployment API started.</p>
    #[doc(hidden)]
    pub edge_deployment_stage_start_time: std::option::Option<aws_smithy_types::DateTime>,
}
impl EdgeDeploymentStatus {
    /// <p>The general status of the current stage.</p>
    pub fn stage_status(&self) -> std::option::Option<&crate::model::StageStatus> {
        self.stage_status.as_ref()
    }
    /// <p>The number of edge devices with the successful deployment in the current stage.</p>
    pub fn edge_deployment_success_in_stage(&self) -> i32 {
        self.edge_deployment_success_in_stage
    }
    /// <p>The number of edge devices yet to pick up the deployment in current stage, or in progress.</p>
    pub fn edge_deployment_pending_in_stage(&self) -> i32 {
        self.edge_deployment_pending_in_stage
    }
    /// <p>The number of edge devices that failed the deployment in current stage.</p>
    pub fn edge_deployment_failed_in_stage(&self) -> i32 {
        self.edge_deployment_failed_in_stage
    }
    /// <p>A detailed message about deployment status in current stage.</p>
    pub fn edge_deployment_status_message(&self) -> std::option::Option<&str> {
        self.edge_deployment_status_message.as_deref()
    }
    /// <p>The time when the deployment API started.</p>
    pub fn edge_deployment_stage_start_time(
        &self,
    ) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.edge_deployment_stage_start_time.as_ref()
    }
}
/// See [`EdgeDeploymentStatus`](crate::model::EdgeDeploymentStatus).
pub mod edge_deployment_status {

    /// A builder for [`EdgeDeploymentStatus`](crate::model::EdgeDeploymentStatus).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) stage_status: std::option::Option<crate::model::StageStatus>,
        pub(crate) edge_deployment_success_in_stage: std::option::Option<i32>,
        pub(crate) edge_deployment_pending_in_stage: std::option::Option<i32>,
        pub(crate) edge_deployment_failed_in_stage: std::option::Option<i32>,
        pub(crate) edge_deployment_status_message: std::option::Option<std::string::String>,
        pub(crate) edge_deployment_stage_start_time:
            std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The general status of the current stage.</p>
        pub fn stage_status(mut self, input: crate::model::StageStatus) -> Self {
            self.stage_status = Some(input);
            self
        }
        /// <p>The general status of the current stage.</p>
        pub fn set_stage_status(
            mut self,
            input: std::option::Option<crate::model::StageStatus>,
        ) -> Self {
            self.stage_status = input;
            self
        }
        /// <p>The number of edge devices with the successful deployment in the current stage.</p>
        pub fn edge_deployment_success_in_stage(mut self, input: i32) -> Self {
            self.edge_deployment_success_in_stage = Some(input);
            self
        }
        /// <p>The number of edge devices with the successful deployment in the current stage.</p>
        pub fn set_edge_deployment_success_in_stage(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.edge_deployment_success_in_stage = input;
            self
        }
        /// <p>The number of edge devices yet to pick up the deployment in current stage, or in progress.</p>
        pub fn edge_deployment_pending_in_stage(mut self, input: i32) -> Self {
            self.edge_deployment_pending_in_stage = Some(input);
            self
        }
        /// <p>The number of edge devices yet to pick up the deployment in current stage, or in progress.</p>
        pub fn set_edge_deployment_pending_in_stage(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.edge_deployment_pending_in_stage = input;
            self
        }
        /// <p>The number of edge devices that failed the deployment in current stage.</p>
        pub fn edge_deployment_failed_in_stage(mut self, input: i32) -> Self {
            self.edge_deployment_failed_in_stage = Some(input);
            self
        }
        /// <p>The number of edge devices that failed the deployment in current stage.</p>
        pub fn set_edge_deployment_failed_in_stage(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.edge_deployment_failed_in_stage = input;
            self
        }
        /// <p>A detailed message about deployment status in current stage.</p>
        pub fn edge_deployment_status_message(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.edge_deployment_status_message = Some(input.into());
            self
        }
        /// <p>A detailed message about deployment status in current stage.</p>
        pub fn set_edge_deployment_status_message(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_deployment_status_message = input;
            self
        }
        /// <p>The time when the deployment API started.</p>
        pub fn edge_deployment_stage_start_time(
            mut self,
            input: aws_smithy_types::DateTime,
        ) -> Self {
            self.edge_deployment_stage_start_time = Some(input);
            self
        }
        /// <p>The time when the deployment API started.</p>
        pub fn set_edge_deployment_stage_start_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.edge_deployment_stage_start_time = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeDeploymentStatus`](crate::model::EdgeDeploymentStatus).
        pub fn build(self) -> crate::model::EdgeDeploymentStatus {
            crate::model::EdgeDeploymentStatus {
                stage_status: self.stage_status,
                edge_deployment_success_in_stage: self
                    .edge_deployment_success_in_stage
                    .unwrap_or_default(),
                edge_deployment_pending_in_stage: self
                    .edge_deployment_pending_in_stage
                    .unwrap_or_default(),
                edge_deployment_failed_in_stage: self
                    .edge_deployment_failed_in_stage
                    .unwrap_or_default(),
                edge_deployment_status_message: self.edge_deployment_status_message,
                edge_deployment_stage_start_time: self.edge_deployment_stage_start_time,
            }
        }
    }
}
impl EdgeDeploymentStatus {
    /// Creates a new builder-style object to manufacture [`EdgeDeploymentStatus`](crate::model::EdgeDeploymentStatus).
    pub fn builder() -> crate::model::edge_deployment_status::Builder {
        crate::model::edge_deployment_status::Builder::default()
    }
}

/// When writing a match expression against `StageStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let stagestatus = unimplemented!();
/// match stagestatus {
///     StageStatus::Creating => { /* ... */ },
///     StageStatus::Deployed => { /* ... */ },
///     StageStatus::Failed => { /* ... */ },
///     StageStatus::InProgress => { /* ... */ },
///     StageStatus::ReadyToDeploy => { /* ... */ },
///     StageStatus::Starting => { /* ... */ },
///     StageStatus::Stopped => { /* ... */ },
///     StageStatus::Stopping => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `stagestatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `StageStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `StageStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `StageStatus::NewFeature` is defined.
/// Specifically, when `stagestatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `StageStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum StageStatus {
    #[allow(missing_docs)] // documentation missing in model
    Creating,
    #[allow(missing_docs)] // documentation missing in model
    Deployed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    ReadyToDeploy,
    #[allow(missing_docs)] // documentation missing in model
    Starting,
    #[allow(missing_docs)] // documentation missing in model
    Stopped,
    #[allow(missing_docs)] // documentation missing in model
    Stopping,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for StageStatus {
    fn from(s: &str) -> Self {
        match s {
            "CREATING" => StageStatus::Creating,
            "DEPLOYED" => StageStatus::Deployed,
            "FAILED" => StageStatus::Failed,
            "INPROGRESS" => StageStatus::InProgress,
            "READYTODEPLOY" => StageStatus::ReadyToDeploy,
            "STARTING" => StageStatus::Starting,
            "STOPPED" => StageStatus::Stopped,
            "STOPPING" => StageStatus::Stopping,
            other => StageStatus::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for StageStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(StageStatus::from(s))
    }
}
impl StageStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            StageStatus::Creating => "CREATING",
            StageStatus::Deployed => "DEPLOYED",
            StageStatus::Failed => "FAILED",
            StageStatus::InProgress => "INPROGRESS",
            StageStatus::ReadyToDeploy => "READYTODEPLOY",
            StageStatus::Starting => "STARTING",
            StageStatus::Stopped => "STOPPED",
            StageStatus::Stopping => "STOPPING",
            StageStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "CREATING",
            "DEPLOYED",
            "FAILED",
            "INPROGRESS",
            "READYTODEPLOY",
            "STARTING",
            "STOPPED",
            "STOPPING",
        ]
    }
}
impl AsRef<str> for StageStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information about the configuration of a deployment.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeDeploymentConfig {
    /// <p>Toggle that determines whether to rollback to previous configuration if the current deployment fails. By default this is turned on. You may turn this off if you want to investigate the errors yourself.</p>
    #[doc(hidden)]
    pub failure_handling_policy: std::option::Option<crate::model::FailureHandlingPolicy>,
}
impl EdgeDeploymentConfig {
    /// <p>Toggle that determines whether to rollback to previous configuration if the current deployment fails. By default this is turned on. You may turn this off if you want to investigate the errors yourself.</p>
    pub fn failure_handling_policy(
        &self,
    ) -> std::option::Option<&crate::model::FailureHandlingPolicy> {
        self.failure_handling_policy.as_ref()
    }
}
/// See [`EdgeDeploymentConfig`](crate::model::EdgeDeploymentConfig).
pub mod edge_deployment_config {

    /// A builder for [`EdgeDeploymentConfig`](crate::model::EdgeDeploymentConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) failure_handling_policy:
            std::option::Option<crate::model::FailureHandlingPolicy>,
    }
    impl Builder {
        /// <p>Toggle that determines whether to rollback to previous configuration if the current deployment fails. By default this is turned on. You may turn this off if you want to investigate the errors yourself.</p>
        pub fn failure_handling_policy(
            mut self,
            input: crate::model::FailureHandlingPolicy,
        ) -> Self {
            self.failure_handling_policy = Some(input);
            self
        }
        /// <p>Toggle that determines whether to rollback to previous configuration if the current deployment fails. By default this is turned on. You may turn this off if you want to investigate the errors yourself.</p>
        pub fn set_failure_handling_policy(
            mut self,
            input: std::option::Option<crate::model::FailureHandlingPolicy>,
        ) -> Self {
            self.failure_handling_policy = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeDeploymentConfig`](crate::model::EdgeDeploymentConfig).
        pub fn build(self) -> crate::model::EdgeDeploymentConfig {
            crate::model::EdgeDeploymentConfig {
                failure_handling_policy: self.failure_handling_policy,
            }
        }
    }
}
impl EdgeDeploymentConfig {
    /// Creates a new builder-style object to manufacture [`EdgeDeploymentConfig`](crate::model::EdgeDeploymentConfig).
    pub fn builder() -> crate::model::edge_deployment_config::Builder {
        crate::model::edge_deployment_config::Builder::default()
    }
}

/// When writing a match expression against `FailureHandlingPolicy`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let failurehandlingpolicy = unimplemented!();
/// match failurehandlingpolicy {
///     FailureHandlingPolicy::DoNothing => { /* ... */ },
///     FailureHandlingPolicy::RollbackOnFailure => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `failurehandlingpolicy` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `FailureHandlingPolicy::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `FailureHandlingPolicy::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `FailureHandlingPolicy::NewFeature` is defined.
/// Specifically, when `failurehandlingpolicy` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `FailureHandlingPolicy::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum FailureHandlingPolicy {
    #[allow(missing_docs)] // documentation missing in model
    DoNothing,
    #[allow(missing_docs)] // documentation missing in model
    RollbackOnFailure,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for FailureHandlingPolicy {
    fn from(s: &str) -> Self {
        match s {
            "DO_NOTHING" => FailureHandlingPolicy::DoNothing,
            "ROLLBACK_ON_FAILURE" => FailureHandlingPolicy::RollbackOnFailure,
            other => {
                FailureHandlingPolicy::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for FailureHandlingPolicy {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(FailureHandlingPolicy::from(s))
    }
}
impl FailureHandlingPolicy {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            FailureHandlingPolicy::DoNothing => "DO_NOTHING",
            FailureHandlingPolicy::RollbackOnFailure => "ROLLBACK_ON_FAILURE",
            FailureHandlingPolicy::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["DO_NOTHING", "ROLLBACK_ON_FAILURE"]
    }
}
impl AsRef<str> for FailureHandlingPolicy {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information about the configurations of selected devices.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeviceSelectionConfig {
    /// <p>Type of device subsets to deploy to the current stage.</p>
    #[doc(hidden)]
    pub device_subset_type: std::option::Option<crate::model::DeviceSubsetType>,
    /// <p>Percentage of devices in the fleet to deploy to the current stage.</p>
    #[doc(hidden)]
    pub percentage: i32,
    /// <p>List of devices chosen to deploy.</p>
    #[doc(hidden)]
    pub device_names: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A filter to select devices with names containing this name.</p>
    #[doc(hidden)]
    pub device_name_contains: std::option::Option<std::string::String>,
}
impl DeviceSelectionConfig {
    /// <p>Type of device subsets to deploy to the current stage.</p>
    pub fn device_subset_type(&self) -> std::option::Option<&crate::model::DeviceSubsetType> {
        self.device_subset_type.as_ref()
    }
    /// <p>Percentage of devices in the fleet to deploy to the current stage.</p>
    pub fn percentage(&self) -> i32 {
        self.percentage
    }
    /// <p>List of devices chosen to deploy.</p>
    pub fn device_names(&self) -> std::option::Option<&[std::string::String]> {
        self.device_names.as_deref()
    }
    /// <p>A filter to select devices with names containing this name.</p>
    pub fn device_name_contains(&self) -> std::option::Option<&str> {
        self.device_name_contains.as_deref()
    }
}
/// See [`DeviceSelectionConfig`](crate::model::DeviceSelectionConfig).
pub mod device_selection_config {

    /// A builder for [`DeviceSelectionConfig`](crate::model::DeviceSelectionConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) device_subset_type: std::option::Option<crate::model::DeviceSubsetType>,
        pub(crate) percentage: std::option::Option<i32>,
        pub(crate) device_names: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) device_name_contains: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Type of device subsets to deploy to the current stage.</p>
        pub fn device_subset_type(mut self, input: crate::model::DeviceSubsetType) -> Self {
            self.device_subset_type = Some(input);
            self
        }
        /// <p>Type of device subsets to deploy to the current stage.</p>
        pub fn set_device_subset_type(
            mut self,
            input: std::option::Option<crate::model::DeviceSubsetType>,
        ) -> Self {
            self.device_subset_type = input;
            self
        }
        /// <p>Percentage of devices in the fleet to deploy to the current stage.</p>
        pub fn percentage(mut self, input: i32) -> Self {
            self.percentage = Some(input);
            self
        }
        /// <p>Percentage of devices in the fleet to deploy to the current stage.</p>
        pub fn set_percentage(mut self, input: std::option::Option<i32>) -> Self {
            self.percentage = input;
            self
        }
        /// Appends an item to `device_names`.
        ///
        /// To override the contents of this collection use [`set_device_names`](Self::set_device_names).
        ///
        /// <p>List of devices chosen to deploy.</p>
        pub fn device_names(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.device_names.unwrap_or_default();
            v.push(input.into());
            self.device_names = Some(v);
            self
        }
        /// <p>List of devices chosen to deploy.</p>
        pub fn set_device_names(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.device_names = input;
            self
        }
        /// <p>A filter to select devices with names containing this name.</p>
        pub fn device_name_contains(mut self, input: impl Into<std::string::String>) -> Self {
            self.device_name_contains = Some(input.into());
            self
        }
        /// <p>A filter to select devices with names containing this name.</p>
        pub fn set_device_name_contains(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.device_name_contains = input;
            self
        }
        /// Consumes the builder and constructs a [`DeviceSelectionConfig`](crate::model::DeviceSelectionConfig).
        pub fn build(self) -> crate::model::DeviceSelectionConfig {
            crate::model::DeviceSelectionConfig {
                device_subset_type: self.device_subset_type,
                percentage: self.percentage.unwrap_or_default(),
                device_names: self.device_names,
                device_name_contains: self.device_name_contains,
            }
        }
    }
}
impl DeviceSelectionConfig {
    /// Creates a new builder-style object to manufacture [`DeviceSelectionConfig`](crate::model::DeviceSelectionConfig).
    pub fn builder() -> crate::model::device_selection_config::Builder {
        crate::model::device_selection_config::Builder::default()
    }
}

/// When writing a match expression against `DeviceSubsetType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let devicesubsettype = unimplemented!();
/// match devicesubsettype {
///     DeviceSubsetType::NameContains => { /* ... */ },
///     DeviceSubsetType::Percentage => { /* ... */ },
///     DeviceSubsetType::Selection => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `devicesubsettype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DeviceSubsetType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DeviceSubsetType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DeviceSubsetType::NewFeature` is defined.
/// Specifically, when `devicesubsettype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DeviceSubsetType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DeviceSubsetType {
    #[allow(missing_docs)] // documentation missing in model
    NameContains,
    #[allow(missing_docs)] // documentation missing in model
    Percentage,
    #[allow(missing_docs)] // documentation missing in model
    Selection,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DeviceSubsetType {
    fn from(s: &str) -> Self {
        match s {
            "NAMECONTAINS" => DeviceSubsetType::NameContains,
            "PERCENTAGE" => DeviceSubsetType::Percentage,
            "SELECTION" => DeviceSubsetType::Selection,
            other => DeviceSubsetType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for DeviceSubsetType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DeviceSubsetType::from(s))
    }
}
impl DeviceSubsetType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DeviceSubsetType::NameContains => "NAMECONTAINS",
            DeviceSubsetType::Percentage => "PERCENTAGE",
            DeviceSubsetType::Selection => "SELECTION",
            DeviceSubsetType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["NAMECONTAINS", "PERCENTAGE", "SELECTION"]
    }
}
impl AsRef<str> for DeviceSubsetType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Contains information about the configuration of a model in a deployment.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeDeploymentModelConfig {
    /// <p>The name the device application uses to reference this model.</p>
    #[doc(hidden)]
    pub model_handle: std::option::Option<std::string::String>,
    /// <p>The edge packaging job associated with this deployment.</p>
    #[doc(hidden)]
    pub edge_packaging_job_name: std::option::Option<std::string::String>,
}
impl EdgeDeploymentModelConfig {
    /// <p>The name the device application uses to reference this model.</p>
    pub fn model_handle(&self) -> std::option::Option<&str> {
        self.model_handle.as_deref()
    }
    /// <p>The edge packaging job associated with this deployment.</p>
    pub fn edge_packaging_job_name(&self) -> std::option::Option<&str> {
        self.edge_packaging_job_name.as_deref()
    }
}
/// See [`EdgeDeploymentModelConfig`](crate::model::EdgeDeploymentModelConfig).
pub mod edge_deployment_model_config {

    /// A builder for [`EdgeDeploymentModelConfig`](crate::model::EdgeDeploymentModelConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_handle: std::option::Option<std::string::String>,
        pub(crate) edge_packaging_job_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name the device application uses to reference this model.</p>
        pub fn model_handle(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_handle = Some(input.into());
            self
        }
        /// <p>The name the device application uses to reference this model.</p>
        pub fn set_model_handle(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_handle = input;
            self
        }
        /// <p>The edge packaging job associated with this deployment.</p>
        pub fn edge_packaging_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.edge_packaging_job_name = Some(input.into());
            self
        }
        /// <p>The edge packaging job associated with this deployment.</p>
        pub fn set_edge_packaging_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.edge_packaging_job_name = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeDeploymentModelConfig`](crate::model::EdgeDeploymentModelConfig).
        pub fn build(self) -> crate::model::EdgeDeploymentModelConfig {
            crate::model::EdgeDeploymentModelConfig {
                model_handle: self.model_handle,
                edge_packaging_job_name: self.edge_packaging_job_name,
            }
        }
    }
}
impl EdgeDeploymentModelConfig {
    /// Creates a new builder-style object to manufacture [`EdgeDeploymentModelConfig`](crate::model::EdgeDeploymentModelConfig).
    pub fn builder() -> crate::model::edge_deployment_model_config::Builder {
        crate::model::edge_deployment_model_config::Builder::default()
    }
}

/// <p>A collection of settings that apply to the <code>SageMaker Domain</code>. These settings are specified through the <code>CreateDomain</code> API call.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DomainSettings {
    /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>A collection of settings that configure the <code>RStudioServerPro</code> Domain-level app.</p>
    #[doc(hidden)]
    pub r_studio_server_pro_domain_settings:
        std::option::Option<crate::model::RStudioServerProDomainSettings>,
    /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>.</p>
    #[doc(hidden)]
    pub execution_role_identity_config:
        std::option::Option<crate::model::ExecutionRoleIdentityConfig>,
}
impl DomainSettings {
    /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
    /// <p>A collection of settings that configure the <code>RStudioServerPro</code> Domain-level app.</p>
    pub fn r_studio_server_pro_domain_settings(
        &self,
    ) -> std::option::Option<&crate::model::RStudioServerProDomainSettings> {
        self.r_studio_server_pro_domain_settings.as_ref()
    }
    /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>.</p>
    pub fn execution_role_identity_config(
        &self,
    ) -> std::option::Option<&crate::model::ExecutionRoleIdentityConfig> {
        self.execution_role_identity_config.as_ref()
    }
}
/// See [`DomainSettings`](crate::model::DomainSettings).
pub mod domain_settings {

    /// A builder for [`DomainSettings`](crate::model::DomainSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) r_studio_server_pro_domain_settings:
            std::option::Option<crate::model::RStudioServerProDomainSettings>,
        pub(crate) execution_role_identity_config:
            std::option::Option<crate::model::ExecutionRoleIdentityConfig>,
    }
    impl Builder {
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The security groups for the Amazon Virtual Private Cloud that the <code>Domain</code> uses for communication between Domain-level apps and user apps.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// <p>A collection of settings that configure the <code>RStudioServerPro</code> Domain-level app.</p>
        pub fn r_studio_server_pro_domain_settings(
            mut self,
            input: crate::model::RStudioServerProDomainSettings,
        ) -> Self {
            self.r_studio_server_pro_domain_settings = Some(input);
            self
        }
        /// <p>A collection of settings that configure the <code>RStudioServerPro</code> Domain-level app.</p>
        pub fn set_r_studio_server_pro_domain_settings(
            mut self,
            input: std::option::Option<crate::model::RStudioServerProDomainSettings>,
        ) -> Self {
            self.r_studio_server_pro_domain_settings = input;
            self
        }
        /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>.</p>
        pub fn execution_role_identity_config(
            mut self,
            input: crate::model::ExecutionRoleIdentityConfig,
        ) -> Self {
            self.execution_role_identity_config = Some(input);
            self
        }
        /// <p>The configuration for attaching a SageMaker user profile name to the execution role as a <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html">sts:SourceIdentity key</a>.</p>
        pub fn set_execution_role_identity_config(
            mut self,
            input: std::option::Option<crate::model::ExecutionRoleIdentityConfig>,
        ) -> Self {
            self.execution_role_identity_config = input;
            self
        }
        /// Consumes the builder and constructs a [`DomainSettings`](crate::model::DomainSettings).
        pub fn build(self) -> crate::model::DomainSettings {
            crate::model::DomainSettings {
                security_group_ids: self.security_group_ids,
                r_studio_server_pro_domain_settings: self.r_studio_server_pro_domain_settings,
                execution_role_identity_config: self.execution_role_identity_config,
            }
        }
    }
}
impl DomainSettings {
    /// Creates a new builder-style object to manufacture [`DomainSettings`](crate::model::DomainSettings).
    pub fn builder() -> crate::model::domain_settings::Builder {
        crate::model::domain_settings::Builder::default()
    }
}

/// <p>A collection of settings that configure the <code>RStudioServerPro</code> Domain-level app.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RStudioServerProDomainSettings {
    /// <p>The ARN of the execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
    #[doc(hidden)]
    pub domain_execution_role_arn: std::option::Option<std::string::String>,
    /// <p>A URL pointing to an RStudio Connect server.</p>
    #[doc(hidden)]
    pub r_studio_connect_url: std::option::Option<std::string::String>,
    /// <p>A URL pointing to an RStudio Package Manager server.</p>
    #[doc(hidden)]
    pub r_studio_package_manager_url: std::option::Option<std::string::String>,
    /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
    #[doc(hidden)]
    pub default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
}
impl RStudioServerProDomainSettings {
    /// <p>The ARN of the execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
    pub fn domain_execution_role_arn(&self) -> std::option::Option<&str> {
        self.domain_execution_role_arn.as_deref()
    }
    /// <p>A URL pointing to an RStudio Connect server.</p>
    pub fn r_studio_connect_url(&self) -> std::option::Option<&str> {
        self.r_studio_connect_url.as_deref()
    }
    /// <p>A URL pointing to an RStudio Package Manager server.</p>
    pub fn r_studio_package_manager_url(&self) -> std::option::Option<&str> {
        self.r_studio_package_manager_url.as_deref()
    }
    /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
    pub fn default_resource_spec(&self) -> std::option::Option<&crate::model::ResourceSpec> {
        self.default_resource_spec.as_ref()
    }
}
/// See [`RStudioServerProDomainSettings`](crate::model::RStudioServerProDomainSettings).
pub mod r_studio_server_pro_domain_settings {

    /// A builder for [`RStudioServerProDomainSettings`](crate::model::RStudioServerProDomainSettings).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) domain_execution_role_arn: std::option::Option<std::string::String>,
        pub(crate) r_studio_connect_url: std::option::Option<std::string::String>,
        pub(crate) r_studio_package_manager_url: std::option::Option<std::string::String>,
        pub(crate) default_resource_spec: std::option::Option<crate::model::ResourceSpec>,
    }
    impl Builder {
        /// <p>The ARN of the execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
        pub fn domain_execution_role_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.domain_execution_role_arn = Some(input.into());
            self
        }
        /// <p>The ARN of the execution role for the <code>RStudioServerPro</code> Domain-level app.</p>
        pub fn set_domain_execution_role_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.domain_execution_role_arn = input;
            self
        }
        /// <p>A URL pointing to an RStudio Connect server.</p>
        pub fn r_studio_connect_url(mut self, input: impl Into<std::string::String>) -> Self {
            self.r_studio_connect_url = Some(input.into());
            self
        }
        /// <p>A URL pointing to an RStudio Connect server.</p>
        pub fn set_r_studio_connect_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.r_studio_connect_url = input;
            self
        }
        /// <p>A URL pointing to an RStudio Package Manager server.</p>
        pub fn r_studio_package_manager_url(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.r_studio_package_manager_url = Some(input.into());
            self
        }
        /// <p>A URL pointing to an RStudio Package Manager server.</p>
        pub fn set_r_studio_package_manager_url(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.r_studio_package_manager_url = input;
            self
        }
        /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
        pub fn default_resource_spec(mut self, input: crate::model::ResourceSpec) -> Self {
            self.default_resource_spec = Some(input);
            self
        }
        /// <p>Specifies the ARN's of a SageMaker image and SageMaker image version, and the instance type that the version runs on.</p>
        pub fn set_default_resource_spec(
            mut self,
            input: std::option::Option<crate::model::ResourceSpec>,
        ) -> Self {
            self.default_resource_spec = input;
            self
        }
        /// Consumes the builder and constructs a [`RStudioServerProDomainSettings`](crate::model::RStudioServerProDomainSettings).
        pub fn build(self) -> crate::model::RStudioServerProDomainSettings {
            crate::model::RStudioServerProDomainSettings {
                domain_execution_role_arn: self.domain_execution_role_arn,
                r_studio_connect_url: self.r_studio_connect_url,
                r_studio_package_manager_url: self.r_studio_package_manager_url,
                default_resource_spec: self.default_resource_spec,
            }
        }
    }
}
impl RStudioServerProDomainSettings {
    /// Creates a new builder-style object to manufacture [`RStudioServerProDomainSettings`](crate::model::RStudioServerProDomainSettings).
    pub fn builder() -> crate::model::r_studio_server_pro_domain_settings::Builder {
        crate::model::r_studio_server_pro_domain_settings::Builder::default()
    }
}

/// When writing a match expression against `AppNetworkAccessType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let appnetworkaccesstype = unimplemented!();
/// match appnetworkaccesstype {
///     AppNetworkAccessType::PublicInternetOnly => { /* ... */ },
///     AppNetworkAccessType::VpcOnly => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `appnetworkaccesstype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AppNetworkAccessType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AppNetworkAccessType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AppNetworkAccessType::NewFeature` is defined.
/// Specifically, when `appnetworkaccesstype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AppNetworkAccessType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AppNetworkAccessType {
    #[allow(missing_docs)] // documentation missing in model
    PublicInternetOnly,
    #[allow(missing_docs)] // documentation missing in model
    VpcOnly,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AppNetworkAccessType {
    fn from(s: &str) -> Self {
        match s {
            "PublicInternetOnly" => AppNetworkAccessType::PublicInternetOnly,
            "VpcOnly" => AppNetworkAccessType::VpcOnly,
            other => {
                AppNetworkAccessType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for AppNetworkAccessType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AppNetworkAccessType::from(s))
    }
}
impl AppNetworkAccessType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AppNetworkAccessType::PublicInternetOnly => "PublicInternetOnly",
            AppNetworkAccessType::VpcOnly => "VpcOnly",
            AppNetworkAccessType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["PublicInternetOnly", "VpcOnly"]
    }
}
impl AsRef<str> for AppNetworkAccessType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// When writing a match expression against `AuthMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let authmode = unimplemented!();
/// match authmode {
///     AuthMode::Iam => { /* ... */ },
///     AuthMode::Sso => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `authmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AuthMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AuthMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AuthMode::NewFeature` is defined.
/// Specifically, when `authmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AuthMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AuthMode {
    #[allow(missing_docs)] // documentation missing in model
    Iam,
    #[allow(missing_docs)] // documentation missing in model
    Sso,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AuthMode {
    fn from(s: &str) -> Self {
        match s {
            "IAM" => AuthMode::Iam,
            "SSO" => AuthMode::Sso,
            other => AuthMode::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AuthMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AuthMode::from(s))
    }
}
impl AuthMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AuthMode::Iam => "IAM",
            AuthMode::Sso => "SSO",
            AuthMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["IAM", "SSO"]
    }
}
impl AsRef<str> for AuthMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The model on the edge device.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct EdgeModel {
    /// <p>The name of the model.</p>
    #[doc(hidden)]
    pub model_name: std::option::Option<std::string::String>,
    /// <p>The model version.</p>
    #[doc(hidden)]
    pub model_version: std::option::Option<std::string::String>,
    /// <p>The timestamp of the last data sample taken.</p>
    #[doc(hidden)]
    pub latest_sample_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>The timestamp of the last inference that was made.</p>
    #[doc(hidden)]
    pub latest_inference: std::option::Option<aws_smithy_types::DateTime>,
}
impl EdgeModel {
    /// <p>The name of the model.</p>
    pub fn model_name(&self) -> std::option::Option<&str> {
        self.model_name.as_deref()
    }
    /// <p>The model version.</p>
    pub fn model_version(&self) -> std::option::Option<&str> {
        self.model_version.as_deref()
    }
    /// <p>The timestamp of the last data sample taken.</p>
    pub fn latest_sample_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.latest_sample_time.as_ref()
    }
    /// <p>The timestamp of the last inference that was made.</p>
    pub fn latest_inference(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.latest_inference.as_ref()
    }
}
/// See [`EdgeModel`](crate::model::EdgeModel).
pub mod edge_model {

    /// A builder for [`EdgeModel`](crate::model::EdgeModel).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_name: std::option::Option<std::string::String>,
        pub(crate) model_version: std::option::Option<std::string::String>,
        pub(crate) latest_sample_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) latest_inference: std::option::Option<aws_smithy_types::DateTime>,
    }
    impl Builder {
        /// <p>The name of the model.</p>
        pub fn model_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_name = Some(input.into());
            self
        }
        /// <p>The name of the model.</p>
        pub fn set_model_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.model_name = input;
            self
        }
        /// <p>The model version.</p>
        pub fn model_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_version = Some(input.into());
            self
        }
        /// <p>The model version.</p>
        pub fn set_model_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_version = input;
            self
        }
        /// <p>The timestamp of the last data sample taken.</p>
        pub fn latest_sample_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.latest_sample_time = Some(input);
            self
        }
        /// <p>The timestamp of the last data sample taken.</p>
        pub fn set_latest_sample_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.latest_sample_time = input;
            self
        }
        /// <p>The timestamp of the last inference that was made.</p>
        pub fn latest_inference(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.latest_inference = Some(input);
            self
        }
        /// <p>The timestamp of the last inference that was made.</p>
        pub fn set_latest_inference(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.latest_inference = input;
            self
        }
        /// Consumes the builder and constructs a [`EdgeModel`](crate::model::EdgeModel).
        pub fn build(self) -> crate::model::EdgeModel {
            crate::model::EdgeModel {
                model_name: self.model_name,
                model_version: self.model_version,
                latest_sample_time: self.latest_sample_time,
                latest_inference: self.latest_inference,
            }
        }
    }
}
impl EdgeModel {
    /// Creates a new builder-style object to manufacture [`EdgeModel`](crate::model::EdgeModel).
    pub fn builder() -> crate::model::edge_model::Builder {
        crate::model::edge_model::Builder::default()
    }
}

/// <p>The input for the data quality monitoring job. Currently endpoints are supported for input.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataQualityJobInput {
    /// <p>Input object for the endpoint</p>
    #[doc(hidden)]
    pub endpoint_input: std::option::Option<crate::model::EndpointInput>,
    /// <p>Input object for the batch transform job.</p>
    #[doc(hidden)]
    pub batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
}
impl DataQualityJobInput {
    /// <p>Input object for the endpoint</p>
    pub fn endpoint_input(&self) -> std::option::Option<&crate::model::EndpointInput> {
        self.endpoint_input.as_ref()
    }
    /// <p>Input object for the batch transform job.</p>
    pub fn batch_transform_input(&self) -> std::option::Option<&crate::model::BatchTransformInput> {
        self.batch_transform_input.as_ref()
    }
}
/// See [`DataQualityJobInput`](crate::model::DataQualityJobInput).
pub mod data_quality_job_input {

    /// A builder for [`DataQualityJobInput`](crate::model::DataQualityJobInput).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_input: std::option::Option<crate::model::EndpointInput>,
        pub(crate) batch_transform_input: std::option::Option<crate::model::BatchTransformInput>,
    }
    impl Builder {
        /// <p>Input object for the endpoint</p>
        pub fn endpoint_input(mut self, input: crate::model::EndpointInput) -> Self {
            self.endpoint_input = Some(input);
            self
        }
        /// <p>Input object for the endpoint</p>
        pub fn set_endpoint_input(
            mut self,
            input: std::option::Option<crate::model::EndpointInput>,
        ) -> Self {
            self.endpoint_input = input;
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn batch_transform_input(mut self, input: crate::model::BatchTransformInput) -> Self {
            self.batch_transform_input = Some(input);
            self
        }
        /// <p>Input object for the batch transform job.</p>
        pub fn set_batch_transform_input(
            mut self,
            input: std::option::Option<crate::model::BatchTransformInput>,
        ) -> Self {
            self.batch_transform_input = input;
            self
        }
        /// Consumes the builder and constructs a [`DataQualityJobInput`](crate::model::DataQualityJobInput).
        pub fn build(self) -> crate::model::DataQualityJobInput {
            crate::model::DataQualityJobInput {
                endpoint_input: self.endpoint_input,
                batch_transform_input: self.batch_transform_input,
            }
        }
    }
}
impl DataQualityJobInput {
    /// Creates a new builder-style object to manufacture [`DataQualityJobInput`](crate::model::DataQualityJobInput).
    pub fn builder() -> crate::model::data_quality_job_input::Builder {
        crate::model::data_quality_job_input::Builder::default()
    }
}

/// <p>Information about the container that a data quality monitoring job runs.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataQualityAppSpecification {
    /// <p>The container image that the data quality monitoring job runs.</p>
    #[doc(hidden)]
    pub image_uri: std::option::Option<std::string::String>,
    /// <p>The entrypoint for a container used to run a monitoring job.</p>
    #[doc(hidden)]
    pub container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The arguments to send to the container that the monitoring job runs.</p>
    #[doc(hidden)]
    pub container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
    #[doc(hidden)]
    pub record_preprocessor_source_uri: std::option::Option<std::string::String>,
    /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
    #[doc(hidden)]
    pub post_analytics_processor_source_uri: std::option::Option<std::string::String>,
    /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
    #[doc(hidden)]
    pub environment:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
}
impl DataQualityAppSpecification {
    /// <p>The container image that the data quality monitoring job runs.</p>
    pub fn image_uri(&self) -> std::option::Option<&str> {
        self.image_uri.as_deref()
    }
    /// <p>The entrypoint for a container used to run a monitoring job.</p>
    pub fn container_entrypoint(&self) -> std::option::Option<&[std::string::String]> {
        self.container_entrypoint.as_deref()
    }
    /// <p>The arguments to send to the container that the monitoring job runs.</p>
    pub fn container_arguments(&self) -> std::option::Option<&[std::string::String]> {
        self.container_arguments.as_deref()
    }
    /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
    pub fn record_preprocessor_source_uri(&self) -> std::option::Option<&str> {
        self.record_preprocessor_source_uri.as_deref()
    }
    /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
    pub fn post_analytics_processor_source_uri(&self) -> std::option::Option<&str> {
        self.post_analytics_processor_source_uri.as_deref()
    }
    /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
    pub fn environment(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.environment.as_ref()
    }
}
/// See [`DataQualityAppSpecification`](crate::model::DataQualityAppSpecification).
pub mod data_quality_app_specification {

    /// A builder for [`DataQualityAppSpecification`](crate::model::DataQualityAppSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) image_uri: std::option::Option<std::string::String>,
        pub(crate) container_entrypoint: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) container_arguments: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) record_preprocessor_source_uri: std::option::Option<std::string::String>,
        pub(crate) post_analytics_processor_source_uri: std::option::Option<std::string::String>,
        pub(crate) environment: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
    }
    impl Builder {
        /// <p>The container image that the data quality monitoring job runs.</p>
        pub fn image_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.image_uri = Some(input.into());
            self
        }
        /// <p>The container image that the data quality monitoring job runs.</p>
        pub fn set_image_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.image_uri = input;
            self
        }
        /// Appends an item to `container_entrypoint`.
        ///
        /// To override the contents of this collection use [`set_container_entrypoint`](Self::set_container_entrypoint).
        ///
        /// <p>The entrypoint for a container used to run a monitoring job.</p>
        pub fn container_entrypoint(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_entrypoint.unwrap_or_default();
            v.push(input.into());
            self.container_entrypoint = Some(v);
            self
        }
        /// <p>The entrypoint for a container used to run a monitoring job.</p>
        pub fn set_container_entrypoint(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_entrypoint = input;
            self
        }
        /// Appends an item to `container_arguments`.
        ///
        /// To override the contents of this collection use [`set_container_arguments`](Self::set_container_arguments).
        ///
        /// <p>The arguments to send to the container that the monitoring job runs.</p>
        pub fn container_arguments(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.container_arguments.unwrap_or_default();
            v.push(input.into());
            self.container_arguments = Some(v);
            self
        }
        /// <p>The arguments to send to the container that the monitoring job runs.</p>
        pub fn set_container_arguments(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.container_arguments = input;
            self
        }
        /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
        pub fn record_preprocessor_source_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.record_preprocessor_source_uri = Some(input.into());
            self
        }
        /// <p>An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers.</p>
        pub fn set_record_preprocessor_source_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.record_preprocessor_source_uri = input;
            self
        }
        /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
        pub fn post_analytics_processor_source_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.post_analytics_processor_source_uri = Some(input.into());
            self
        }
        /// <p>An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.</p>
        pub fn set_post_analytics_processor_source_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.post_analytics_processor_source_uri = input;
            self
        }
        /// Adds a key-value pair to `environment`.
        ///
        /// To override the contents of this collection use [`set_environment`](Self::set_environment).
        ///
        /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
        pub fn environment(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.environment.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.environment = Some(hash_map);
            self
        }
        /// <p>Sets the environment variables in the container that the monitoring job runs.</p>
        pub fn set_environment(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.environment = input;
            self
        }
        /// Consumes the builder and constructs a [`DataQualityAppSpecification`](crate::model::DataQualityAppSpecification).
        pub fn build(self) -> crate::model::DataQualityAppSpecification {
            crate::model::DataQualityAppSpecification {
                image_uri: self.image_uri,
                container_entrypoint: self.container_entrypoint,
                container_arguments: self.container_arguments,
                record_preprocessor_source_uri: self.record_preprocessor_source_uri,
                post_analytics_processor_source_uri: self.post_analytics_processor_source_uri,
                environment: self.environment,
            }
        }
    }
}
impl DataQualityAppSpecification {
    /// Creates a new builder-style object to manufacture [`DataQualityAppSpecification`](crate::model::DataQualityAppSpecification).
    pub fn builder() -> crate::model::data_quality_app_specification::Builder {
        crate::model::data_quality_app_specification::Builder::default()
    }
}

/// <p>Configuration for monitoring constraints and monitoring statistics. These baseline resources are compared against the results of the current job from the series of jobs scheduled to collect data periodically.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DataQualityBaselineConfig {
    /// <p>The name of the job that performs baselining for the data quality monitoring job.</p>
    #[doc(hidden)]
    pub baselining_job_name: std::option::Option<std::string::String>,
    /// <p>The constraints resource for a monitoring job.</p>
    #[doc(hidden)]
    pub constraints_resource: std::option::Option<crate::model::MonitoringConstraintsResource>,
    /// <p>The statistics resource for a monitoring job.</p>
    #[doc(hidden)]
    pub statistics_resource: std::option::Option<crate::model::MonitoringStatisticsResource>,
}
impl DataQualityBaselineConfig {
    /// <p>The name of the job that performs baselining for the data quality monitoring job.</p>
    pub fn baselining_job_name(&self) -> std::option::Option<&str> {
        self.baselining_job_name.as_deref()
    }
    /// <p>The constraints resource for a monitoring job.</p>
    pub fn constraints_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringConstraintsResource> {
        self.constraints_resource.as_ref()
    }
    /// <p>The statistics resource for a monitoring job.</p>
    pub fn statistics_resource(
        &self,
    ) -> std::option::Option<&crate::model::MonitoringStatisticsResource> {
        self.statistics_resource.as_ref()
    }
}
/// See [`DataQualityBaselineConfig`](crate::model::DataQualityBaselineConfig).
pub mod data_quality_baseline_config {

    /// A builder for [`DataQualityBaselineConfig`](crate::model::DataQualityBaselineConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) baselining_job_name: std::option::Option<std::string::String>,
        pub(crate) constraints_resource:
            std::option::Option<crate::model::MonitoringConstraintsResource>,
        pub(crate) statistics_resource:
            std::option::Option<crate::model::MonitoringStatisticsResource>,
    }
    impl Builder {
        /// <p>The name of the job that performs baselining for the data quality monitoring job.</p>
        pub fn baselining_job_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.baselining_job_name = Some(input.into());
            self
        }
        /// <p>The name of the job that performs baselining for the data quality monitoring job.</p>
        pub fn set_baselining_job_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.baselining_job_name = input;
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn constraints_resource(
            mut self,
            input: crate::model::MonitoringConstraintsResource,
        ) -> Self {
            self.constraints_resource = Some(input);
            self
        }
        /// <p>The constraints resource for a monitoring job.</p>
        pub fn set_constraints_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringConstraintsResource>,
        ) -> Self {
            self.constraints_resource = input;
            self
        }
        /// <p>The statistics resource for a monitoring job.</p>
        pub fn statistics_resource(
            mut self,
            input: crate::model::MonitoringStatisticsResource,
        ) -> Self {
            self.statistics_resource = Some(input);
            self
        }
        /// <p>The statistics resource for a monitoring job.</p>
        pub fn set_statistics_resource(
            mut self,
            input: std::option::Option<crate::model::MonitoringStatisticsResource>,
        ) -> Self {
            self.statistics_resource = input;
            self
        }
        /// Consumes the builder and constructs a [`DataQualityBaselineConfig`](crate::model::DataQualityBaselineConfig).
        pub fn build(self) -> crate::model::DataQualityBaselineConfig {
            crate::model::DataQualityBaselineConfig {
                baselining_job_name: self.baselining_job_name,
                constraints_resource: self.constraints_resource,
                statistics_resource: self.statistics_resource,
            }
        }
    }
}
impl DataQualityBaselineConfig {
    /// Creates a new builder-style object to manufacture [`DataQualityBaselineConfig`](crate::model::DataQualityBaselineConfig).
    pub fn builder() -> crate::model::data_quality_baseline_config::Builder {
        crate::model::data_quality_baseline_config::Builder::default()
    }
}

/// <p>The <code>VpcConfig</code> configuration object that specifies the VPC that you want the compilation jobs to connect to. For more information on controlling access to your Amazon S3 buckets used for compilation job, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-vpc.html">Give Amazon SageMaker Compilation Jobs Access to Resources in Your Amazon VPC</a>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct NeoVpcConfig {
    /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
    #[doc(hidden)]
    pub security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The ID of the subnets in the VPC that you want to connect the compilation job to for accessing the model in Amazon S3.</p>
    #[doc(hidden)]
    pub subnets: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl NeoVpcConfig {
    /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
    pub fn security_group_ids(&self) -> std::option::Option<&[std::string::String]> {
        self.security_group_ids.as_deref()
    }
    /// <p>The ID of the subnets in the VPC that you want to connect the compilation job to for accessing the model in Amazon S3.</p>
    pub fn subnets(&self) -> std::option::Option<&[std::string::String]> {
        self.subnets.as_deref()
    }
}
/// See [`NeoVpcConfig`](crate::model::NeoVpcConfig).
pub mod neo_vpc_config {

    /// A builder for [`NeoVpcConfig`](crate::model::NeoVpcConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) security_group_ids: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) subnets: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `security_group_ids`.
        ///
        /// To override the contents of this collection use [`set_security_group_ids`](Self::set_security_group_ids).
        ///
        /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
        pub fn security_group_ids(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.security_group_ids.unwrap_or_default();
            v.push(input.into());
            self.security_group_ids = Some(v);
            self
        }
        /// <p>The VPC security group IDs. IDs have the form of <code>sg-xxxxxxxx</code>. Specify the security groups for the VPC that is specified in the <code>Subnets</code> field.</p>
        pub fn set_security_group_ids(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.security_group_ids = input;
            self
        }
        /// Appends an item to `subnets`.
        ///
        /// To override the contents of this collection use [`set_subnets`](Self::set_subnets).
        ///
        /// <p>The ID of the subnets in the VPC that you want to connect the compilation job to for accessing the model in Amazon S3.</p>
        pub fn subnets(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.subnets.unwrap_or_default();
            v.push(input.into());
            self.subnets = Some(v);
            self
        }
        /// <p>The ID of the subnets in the VPC that you want to connect the compilation job to for accessing the model in Amazon S3.</p>
        pub fn set_subnets(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.subnets = input;
            self
        }
        /// Consumes the builder and constructs a [`NeoVpcConfig`](crate::model::NeoVpcConfig).
        pub fn build(self) -> crate::model::NeoVpcConfig {
            crate::model::NeoVpcConfig {
                security_group_ids: self.security_group_ids,
                subnets: self.subnets,
            }
        }
    }
}
impl NeoVpcConfig {
    /// Creates a new builder-style object to manufacture [`NeoVpcConfig`](crate::model::NeoVpcConfig).
    pub fn builder() -> crate::model::neo_vpc_config::Builder {
        crate::model::neo_vpc_config::Builder::default()
    }
}

/// <p>Contains information about the output location for the compiled model and the target device that the model runs on. <code>TargetDevice</code> and <code>TargetPlatform</code> are mutually exclusive, so you need to choose one between the two to specify your target device or platform. If you cannot find your device you want to use from the <code>TargetDevice</code> list, use <code>TargetPlatform</code> to describe the platform of your edge device and <code>CompilerOptions</code> if there are specific settings that are required or recommended to use for particular TargetPlatform.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct OutputConfig {
    /// <p>Identifies the S3 bucket where you want Amazon SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
    #[doc(hidden)]
    pub s3_output_location: std::option::Option<std::string::String>,
    /// <p>Identifies the target device or the machine learning instance that you want to run your model on after the compilation has completed. Alternatively, you can specify OS, architecture, and accelerator using <code>TargetPlatform</code> fields. It can be used instead of <code>TargetPlatform</code>.</p>
    #[doc(hidden)]
    pub target_device: std::option::Option<crate::model::TargetDevice>,
    /// <p>Contains information about a target platform that you want your model to run on, such as OS, architecture, and accelerators. It is an alternative of <code>TargetDevice</code>.</p>
    /// <p>The following examples show how to configure the <code>TargetPlatform</code> and <code>CompilerOptions</code> JSON strings for popular target platforms: </p>
    /// <ul>
    /// <li> <p>Raspberry Pi 3 Model B+</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM_EABIHF"},</code> </p> <p> <code> "CompilerOptions": {'mattr': ['+neon']}</code> </p> </li>
    /// <li> <p>Jetson TX2</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'gpu-code': 'sm_62', 'trt-ver': '6.0.1', 'cuda-ver': '10.0'}</code> </p> </li>
    /// <li> <p>EC2 m5.2xlarge instance OS</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "X86_64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'mcpu': 'skylake-avx512'}</code> </p> </li>
    /// <li> <p>RK3399</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "MALI"}</code> </p> </li>
    /// <li> <p>ARMv7 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM_EABI"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 25, 'mattr': ['+neon']}</code> </p> </li>
    /// <li> <p>ARMv8 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM64"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 29}</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub target_platform: std::option::Option<crate::model::TargetPlatform>,
    /// <p>Specifies additional parameters for compiler options in JSON format. The compiler options are <code>TargetPlatform</code> specific. It is required for NVIDIA accelerators and highly recommended for CPU compilations. For any other cases, it is optional to specify <code>CompilerOptions.</code> </p>
    /// <ul>
    /// <li> <p> <code>DTYPE</code>: Specifies the data type for the input. When compiling for <code>ml_*</code> (except for <code>ml_inf</code>) instances using PyTorch framework, provide the data type (dtype) of the model's input. <code>"float32"</code> is used if <code>"DTYPE"</code> is not specified. Options for data type are:</p>
    /// <ul>
    /// <li> <p>float32: Use either <code>"float"</code> or <code>"float32"</code>.</p> </li>
    /// <li> <p>int64: Use either <code>"int64"</code> or <code>"long"</code>.</p> </li>
    /// </ul> <p> For example, <code>{"dtype" : "float32"}</code>.</p> </li>
    /// <li> <p> <code>CPU</code>: Compilation for CPU supports the following compiler options.</p>
    /// <ul>
    /// <li> <p> <code>mcpu</code>: CPU micro-architecture. For example, <code>{'mcpu': 'skylake-avx512'}</code> </p> </li>
    /// <li> <p> <code>mattr</code>: CPU flags. For example, <code>{'mattr': ['+neon', '+vfpv4']}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p> <code>ARM</code>: Details of ARM CPU compilations.</p>
    /// <ul>
    /// <li> <p> <code>NEON</code>: NEON is an implementation of the Advanced SIMD extension used in ARMv7 processors.</p> <p>For example, add <code>{'mattr': ['+neon']}</code> to the compiler options if compiling for ARM 32-bit platform with the NEON support.</p> </li>
    /// </ul> </li>
    /// <li> <p> <code>NVIDIA</code>: Compilation for NVIDIA GPU supports the following compiler options.</p>
    /// <ul>
    /// <li> <p> <code>gpu_code</code>: Specifies the targeted architecture.</p> </li>
    /// <li> <p> <code>trt-ver</code>: Specifies the TensorRT versions in x.y.z. format.</p> </li>
    /// <li> <p> <code>cuda-ver</code>: Specifies the CUDA version in x.y format.</p> </li>
    /// </ul> <p>For example, <code>{'gpu-code': 'sm_72', 'trt-ver': '6.0.1', 'cuda-ver': '10.1'}</code> </p> </li>
    /// <li> <p> <code>ANDROID</code>: Compilation for the Android OS supports the following compiler options:</p>
    /// <ul>
    /// <li> <p> <code>ANDROID_PLATFORM</code>: Specifies the Android API levels. Available levels range from 21 to 29. For example, <code>{'ANDROID_PLATFORM': 28}</code>.</p> </li>
    /// <li> <p> <code>mattr</code>: Add <code>{'mattr': ['+neon']}</code> to compiler options if compiling for ARM 32-bit platform with NEON support.</p> </li>
    /// </ul> </li>
    /// <li> <p> <code>INFERENTIA</code>: Compilation for target ml_inf1 uses compiler options passed in as a JSON string. For example, <code>"CompilerOptions": "\"--verbose 1 --num-neuroncores 2 -O2\""</code>. </p> <p>For information about supported compiler options, see <a href="https://github.com/aws/aws-neuron-sdk/blob/master/docs/neuron-cc/command-line-reference.md"> Neuron Compiler CLI</a>. </p> </li>
    /// <li> <p> <code>CoreML</code>: Compilation for the CoreML <code>OutputConfig$TargetDevice</code> supports the following compiler options:</p>
    /// <ul>
    /// <li> <p> <code>class_labels</code>: Specifies the classification labels file name inside input tar.gz file. For example, <code>{"class_labels": "imagenet_labels_1000.txt"}</code>. Labels inside the txt file should be separated by newlines.</p> </li>
    /// </ul> </li>
    /// <li> <p> <code>EIA</code>: Compilation for the Elastic Inference Accelerator supports the following compiler options:</p>
    /// <ul>
    /// <li> <p> <code>precision_mode</code>: Specifies the precision of compiled artifacts. Supported values are <code>"FP16"</code> and <code>"FP32"</code>. Default is <code>"FP32"</code>.</p> </li>
    /// <li> <p> <code>signature_def_key</code>: Specifies the signature to use for models in SavedModel format. Defaults is TensorFlow's default signature def key.</p> </li>
    /// <li> <p> <code>output_names</code>: Specifies a list of output tensor names for models in FrozenGraph format. Set at most one API field, either: <code>signature_def_key</code> or <code>output_names</code>.</p> </li>
    /// </ul> <p>For example: <code>{"precision_mode": "FP32", "output_names": ["output:0"]}</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub compiler_options: std::option::Option<std::string::String>,
    /// <p>The Amazon Web Services Key Management Service key (Amazon Web Services KMS) that Amazon SageMaker uses to encrypt your output models with Amazon S3 server-side encryption after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KmsKeyId can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
}
impl OutputConfig {
    /// <p>Identifies the S3 bucket where you want Amazon SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
    pub fn s3_output_location(&self) -> std::option::Option<&str> {
        self.s3_output_location.as_deref()
    }
    /// <p>Identifies the target device or the machine learning instance that you want to run your model on after the compilation has completed. Alternatively, you can specify OS, architecture, and accelerator using <code>TargetPlatform</code> fields. It can be used instead of <code>TargetPlatform</code>.</p>
    pub fn target_device(&self) -> std::option::Option<&crate::model::TargetDevice> {
        self.target_device.as_ref()
    }
    /// <p>Contains information about a target platform that you want your model to run on, such as OS, architecture, and accelerators. It is an alternative of <code>TargetDevice</code>.</p>
    /// <p>The following examples show how to configure the <code>TargetPlatform</code> and <code>CompilerOptions</code> JSON strings for popular target platforms: </p>
    /// <ul>
    /// <li> <p>Raspberry Pi 3 Model B+</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM_EABIHF"},</code> </p> <p> <code> "CompilerOptions": {'mattr': ['+neon']}</code> </p> </li>
    /// <li> <p>Jetson TX2</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'gpu-code': 'sm_62', 'trt-ver': '6.0.1', 'cuda-ver': '10.0'}</code> </p> </li>
    /// <li> <p>EC2 m5.2xlarge instance OS</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "X86_64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'mcpu': 'skylake-avx512'}</code> </p> </li>
    /// <li> <p>RK3399</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "MALI"}</code> </p> </li>
    /// <li> <p>ARMv7 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM_EABI"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 25, 'mattr': ['+neon']}</code> </p> </li>
    /// <li> <p>ARMv8 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM64"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 29}</code> </p> </li>
    /// </ul>
    pub fn target_platform(&self) -> std::option::Option<&crate::model::TargetPlatform> {
        self.target_platform.as_ref()
    }
    /// <p>Specifies additional parameters for compiler options in JSON format. The compiler options are <code>TargetPlatform</code> specific. It is required for NVIDIA accelerators and highly recommended for CPU compilations. For any other cases, it is optional to specify <code>CompilerOptions.</code> </p>
    /// <ul>
    /// <li> <p> <code>DTYPE</code>: Specifies the data type for the input. When compiling for <code>ml_*</code> (except for <code>ml_inf</code>) instances using PyTorch framework, provide the data type (dtype) of the model's input. <code>"float32"</code> is used if <code>"DTYPE"</code> is not specified. Options for data type are:</p>
    /// <ul>
    /// <li> <p>float32: Use either <code>"float"</code> or <code>"float32"</code>.</p> </li>
    /// <li> <p>int64: Use either <code>"int64"</code> or <code>"long"</code>.</p> </li>
    /// </ul> <p> For example, <code>{"dtype" : "float32"}</code>.</p> </li>
    /// <li> <p> <code>CPU</code>: Compilation for CPU supports the following compiler options.</p>
    /// <ul>
    /// <li> <p> <code>mcpu</code>: CPU micro-architecture. For example, <code>{'mcpu': 'skylake-avx512'}</code> </p> </li>
    /// <li> <p> <code>mattr</code>: CPU flags. For example, <code>{'mattr': ['+neon', '+vfpv4']}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p> <code>ARM</code>: Details of ARM CPU compilations.</p>
    /// <ul>
    /// <li> <p> <code>NEON</code>: NEON is an implementation of the Advanced SIMD extension used in ARMv7 processors.</p> <p>For example, add <code>{'mattr': ['+neon']}</code> to the compiler options if compiling for ARM 32-bit platform with the NEON support.</p> </li>
    /// </ul> </li>
    /// <li> <p> <code>NVIDIA</code>: Compilation for NVIDIA GPU supports the following compiler options.</p>
    /// <ul>
    /// <li> <p> <code>gpu_code</code>: Specifies the targeted architecture.</p> </li>
    /// <li> <p> <code>trt-ver</code>: Specifies the TensorRT versions in x.y.z. format.</p> </li>
    /// <li> <p> <code>cuda-ver</code>: Specifies the CUDA version in x.y format.</p> </li>
    /// </ul> <p>For example, <code>{'gpu-code': 'sm_72', 'trt-ver': '6.0.1', 'cuda-ver': '10.1'}</code> </p> </li>
    /// <li> <p> <code>ANDROID</code>: Compilation for the Android OS supports the following compiler options:</p>
    /// <ul>
    /// <li> <p> <code>ANDROID_PLATFORM</code>: Specifies the Android API levels. Available levels range from 21 to 29. For example, <code>{'ANDROID_PLATFORM': 28}</code>.</p> </li>
    /// <li> <p> <code>mattr</code>: Add <code>{'mattr': ['+neon']}</code> to compiler options if compiling for ARM 32-bit platform with NEON support.</p> </li>
    /// </ul> </li>
    /// <li> <p> <code>INFERENTIA</code>: Compilation for target ml_inf1 uses compiler options passed in as a JSON string. For example, <code>"CompilerOptions": "\"--verbose 1 --num-neuroncores 2 -O2\""</code>. </p> <p>For information about supported compiler options, see <a href="https://github.com/aws/aws-neuron-sdk/blob/master/docs/neuron-cc/command-line-reference.md"> Neuron Compiler CLI</a>. </p> </li>
    /// <li> <p> <code>CoreML</code>: Compilation for the CoreML <code>OutputConfig$TargetDevice</code> supports the following compiler options:</p>
    /// <ul>
    /// <li> <p> <code>class_labels</code>: Specifies the classification labels file name inside input tar.gz file. For example, <code>{"class_labels": "imagenet_labels_1000.txt"}</code>. Labels inside the txt file should be separated by newlines.</p> </li>
    /// </ul> </li>
    /// <li> <p> <code>EIA</code>: Compilation for the Elastic Inference Accelerator supports the following compiler options:</p>
    /// <ul>
    /// <li> <p> <code>precision_mode</code>: Specifies the precision of compiled artifacts. Supported values are <code>"FP16"</code> and <code>"FP32"</code>. Default is <code>"FP32"</code>.</p> </li>
    /// <li> <p> <code>signature_def_key</code>: Specifies the signature to use for models in SavedModel format. Defaults is TensorFlow's default signature def key.</p> </li>
    /// <li> <p> <code>output_names</code>: Specifies a list of output tensor names for models in FrozenGraph format. Set at most one API field, either: <code>signature_def_key</code> or <code>output_names</code>.</p> </li>
    /// </ul> <p>For example: <code>{"precision_mode": "FP32", "output_names": ["output:0"]}</code> </p> </li>
    /// </ul>
    pub fn compiler_options(&self) -> std::option::Option<&str> {
        self.compiler_options.as_deref()
    }
    /// <p>The Amazon Web Services Key Management Service key (Amazon Web Services KMS) that Amazon SageMaker uses to encrypt your output models with Amazon S3 server-side encryption after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
    /// <p>The KmsKeyId can be any of the following formats: </p>
    /// <ul>
    /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
    /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
    /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
    /// </ul>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
}
/// See [`OutputConfig`](crate::model::OutputConfig).
pub mod output_config {

    /// A builder for [`OutputConfig`](crate::model::OutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_location: std::option::Option<std::string::String>,
        pub(crate) target_device: std::option::Option<crate::model::TargetDevice>,
        pub(crate) target_platform: std::option::Option<crate::model::TargetPlatform>,
        pub(crate) compiler_options: std::option::Option<std::string::String>,
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Identifies the S3 bucket where you want Amazon SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
        pub fn s3_output_location(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_location = Some(input.into());
            self
        }
        /// <p>Identifies the S3 bucket where you want Amazon SageMaker to store the model artifacts. For example, <code>s3://bucket-name/key-name-prefix</code>.</p>
        pub fn set_s3_output_location(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_location = input;
            self
        }
        /// <p>Identifies the target device or the machine learning instance that you want to run your model on after the compilation has completed. Alternatively, you can specify OS, architecture, and accelerator using <code>TargetPlatform</code> fields. It can be used instead of <code>TargetPlatform</code>.</p>
        pub fn target_device(mut self, input: crate::model::TargetDevice) -> Self {
            self.target_device = Some(input);
            self
        }
        /// <p>Identifies the target device or the machine learning instance that you want to run your model on after the compilation has completed. Alternatively, you can specify OS, architecture, and accelerator using <code>TargetPlatform</code> fields. It can be used instead of <code>TargetPlatform</code>.</p>
        pub fn set_target_device(
            mut self,
            input: std::option::Option<crate::model::TargetDevice>,
        ) -> Self {
            self.target_device = input;
            self
        }
        /// <p>Contains information about a target platform that you want your model to run on, such as OS, architecture, and accelerators. It is an alternative of <code>TargetDevice</code>.</p>
        /// <p>The following examples show how to configure the <code>TargetPlatform</code> and <code>CompilerOptions</code> JSON strings for popular target platforms: </p>
        /// <ul>
        /// <li> <p>Raspberry Pi 3 Model B+</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM_EABIHF"},</code> </p> <p> <code> "CompilerOptions": {'mattr': ['+neon']}</code> </p> </li>
        /// <li> <p>Jetson TX2</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'gpu-code': 'sm_62', 'trt-ver': '6.0.1', 'cuda-ver': '10.0'}</code> </p> </li>
        /// <li> <p>EC2 m5.2xlarge instance OS</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "X86_64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'mcpu': 'skylake-avx512'}</code> </p> </li>
        /// <li> <p>RK3399</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "MALI"}</code> </p> </li>
        /// <li> <p>ARMv7 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM_EABI"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 25, 'mattr': ['+neon']}</code> </p> </li>
        /// <li> <p>ARMv8 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM64"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 29}</code> </p> </li>
        /// </ul>
        pub fn target_platform(mut self, input: crate::model::TargetPlatform) -> Self {
            self.target_platform = Some(input);
            self
        }
        /// <p>Contains information about a target platform that you want your model to run on, such as OS, architecture, and accelerators. It is an alternative of <code>TargetDevice</code>.</p>
        /// <p>The following examples show how to configure the <code>TargetPlatform</code> and <code>CompilerOptions</code> JSON strings for popular target platforms: </p>
        /// <ul>
        /// <li> <p>Raspberry Pi 3 Model B+</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM_EABIHF"},</code> </p> <p> <code> "CompilerOptions": {'mattr': ['+neon']}</code> </p> </li>
        /// <li> <p>Jetson TX2</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'gpu-code': 'sm_62', 'trt-ver': '6.0.1', 'cuda-ver': '10.0'}</code> </p> </li>
        /// <li> <p>EC2 m5.2xlarge instance OS</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "X86_64", "Accelerator": "NVIDIA"},</code> </p> <p> <code> "CompilerOptions": {'mcpu': 'skylake-avx512'}</code> </p> </li>
        /// <li> <p>RK3399</p> <p> <code>"TargetPlatform": {"Os": "LINUX", "Arch": "ARM64", "Accelerator": "MALI"}</code> </p> </li>
        /// <li> <p>ARMv7 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM_EABI"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 25, 'mattr': ['+neon']}</code> </p> </li>
        /// <li> <p>ARMv8 phone (CPU)</p> <p> <code>"TargetPlatform": {"Os": "ANDROID", "Arch": "ARM64"},</code> </p> <p> <code> "CompilerOptions": {'ANDROID_PLATFORM': 29}</code> </p> </li>
        /// </ul>
        pub fn set_target_platform(
            mut self,
            input: std::option::Option<crate::model::TargetPlatform>,
        ) -> Self {
            self.target_platform = input;
            self
        }
        /// <p>Specifies additional parameters for compiler options in JSON format. The compiler options are <code>TargetPlatform</code> specific. It is required for NVIDIA accelerators and highly recommended for CPU compilations. For any other cases, it is optional to specify <code>CompilerOptions.</code> </p>
        /// <ul>
        /// <li> <p> <code>DTYPE</code>: Specifies the data type for the input. When compiling for <code>ml_*</code> (except for <code>ml_inf</code>) instances using PyTorch framework, provide the data type (dtype) of the model's input. <code>"float32"</code> is used if <code>"DTYPE"</code> is not specified. Options for data type are:</p>
        /// <ul>
        /// <li> <p>float32: Use either <code>"float"</code> or <code>"float32"</code>.</p> </li>
        /// <li> <p>int64: Use either <code>"int64"</code> or <code>"long"</code>.</p> </li>
        /// </ul> <p> For example, <code>{"dtype" : "float32"}</code>.</p> </li>
        /// <li> <p> <code>CPU</code>: Compilation for CPU supports the following compiler options.</p>
        /// <ul>
        /// <li> <p> <code>mcpu</code>: CPU micro-architecture. For example, <code>{'mcpu': 'skylake-avx512'}</code> </p> </li>
        /// <li> <p> <code>mattr</code>: CPU flags. For example, <code>{'mattr': ['+neon', '+vfpv4']}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p> <code>ARM</code>: Details of ARM CPU compilations.</p>
        /// <ul>
        /// <li> <p> <code>NEON</code>: NEON is an implementation of the Advanced SIMD extension used in ARMv7 processors.</p> <p>For example, add <code>{'mattr': ['+neon']}</code> to the compiler options if compiling for ARM 32-bit platform with the NEON support.</p> </li>
        /// </ul> </li>
        /// <li> <p> <code>NVIDIA</code>: Compilation for NVIDIA GPU supports the following compiler options.</p>
        /// <ul>
        /// <li> <p> <code>gpu_code</code>: Specifies the targeted architecture.</p> </li>
        /// <li> <p> <code>trt-ver</code>: Specifies the TensorRT versions in x.y.z. format.</p> </li>
        /// <li> <p> <code>cuda-ver</code>: Specifies the CUDA version in x.y format.</p> </li>
        /// </ul> <p>For example, <code>{'gpu-code': 'sm_72', 'trt-ver': '6.0.1', 'cuda-ver': '10.1'}</code> </p> </li>
        /// <li> <p> <code>ANDROID</code>: Compilation for the Android OS supports the following compiler options:</p>
        /// <ul>
        /// <li> <p> <code>ANDROID_PLATFORM</code>: Specifies the Android API levels. Available levels range from 21 to 29. For example, <code>{'ANDROID_PLATFORM': 28}</code>.</p> </li>
        /// <li> <p> <code>mattr</code>: Add <code>{'mattr': ['+neon']}</code> to compiler options if compiling for ARM 32-bit platform with NEON support.</p> </li>
        /// </ul> </li>
        /// <li> <p> <code>INFERENTIA</code>: Compilation for target ml_inf1 uses compiler options passed in as a JSON string. For example, <code>"CompilerOptions": "\"--verbose 1 --num-neuroncores 2 -O2\""</code>. </p> <p>For information about supported compiler options, see <a href="https://github.com/aws/aws-neuron-sdk/blob/master/docs/neuron-cc/command-line-reference.md"> Neuron Compiler CLI</a>. </p> </li>
        /// <li> <p> <code>CoreML</code>: Compilation for the CoreML <code>OutputConfig$TargetDevice</code> supports the following compiler options:</p>
        /// <ul>
        /// <li> <p> <code>class_labels</code>: Specifies the classification labels file name inside input tar.gz file. For example, <code>{"class_labels": "imagenet_labels_1000.txt"}</code>. Labels inside the txt file should be separated by newlines.</p> </li>
        /// </ul> </li>
        /// <li> <p> <code>EIA</code>: Compilation for the Elastic Inference Accelerator supports the following compiler options:</p>
        /// <ul>
        /// <li> <p> <code>precision_mode</code>: Specifies the precision of compiled artifacts. Supported values are <code>"FP16"</code> and <code>"FP32"</code>. Default is <code>"FP32"</code>.</p> </li>
        /// <li> <p> <code>signature_def_key</code>: Specifies the signature to use for models in SavedModel format. Defaults is TensorFlow's default signature def key.</p> </li>
        /// <li> <p> <code>output_names</code>: Specifies a list of output tensor names for models in FrozenGraph format. Set at most one API field, either: <code>signature_def_key</code> or <code>output_names</code>.</p> </li>
        /// </ul> <p>For example: <code>{"precision_mode": "FP32", "output_names": ["output:0"]}</code> </p> </li>
        /// </ul>
        pub fn compiler_options(mut self, input: impl Into<std::string::String>) -> Self {
            self.compiler_options = Some(input.into());
            self
        }
        /// <p>Specifies additional parameters for compiler options in JSON format. The compiler options are <code>TargetPlatform</code> specific. It is required for NVIDIA accelerators and highly recommended for CPU compilations. For any other cases, it is optional to specify <code>CompilerOptions.</code> </p>
        /// <ul>
        /// <li> <p> <code>DTYPE</code>: Specifies the data type for the input. When compiling for <code>ml_*</code> (except for <code>ml_inf</code>) instances using PyTorch framework, provide the data type (dtype) of the model's input. <code>"float32"</code> is used if <code>"DTYPE"</code> is not specified. Options for data type are:</p>
        /// <ul>
        /// <li> <p>float32: Use either <code>"float"</code> or <code>"float32"</code>.</p> </li>
        /// <li> <p>int64: Use either <code>"int64"</code> or <code>"long"</code>.</p> </li>
        /// </ul> <p> For example, <code>{"dtype" : "float32"}</code>.</p> </li>
        /// <li> <p> <code>CPU</code>: Compilation for CPU supports the following compiler options.</p>
        /// <ul>
        /// <li> <p> <code>mcpu</code>: CPU micro-architecture. For example, <code>{'mcpu': 'skylake-avx512'}</code> </p> </li>
        /// <li> <p> <code>mattr</code>: CPU flags. For example, <code>{'mattr': ['+neon', '+vfpv4']}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p> <code>ARM</code>: Details of ARM CPU compilations.</p>
        /// <ul>
        /// <li> <p> <code>NEON</code>: NEON is an implementation of the Advanced SIMD extension used in ARMv7 processors.</p> <p>For example, add <code>{'mattr': ['+neon']}</code> to the compiler options if compiling for ARM 32-bit platform with the NEON support.</p> </li>
        /// </ul> </li>
        /// <li> <p> <code>NVIDIA</code>: Compilation for NVIDIA GPU supports the following compiler options.</p>
        /// <ul>
        /// <li> <p> <code>gpu_code</code>: Specifies the targeted architecture.</p> </li>
        /// <li> <p> <code>trt-ver</code>: Specifies the TensorRT versions in x.y.z. format.</p> </li>
        /// <li> <p> <code>cuda-ver</code>: Specifies the CUDA version in x.y format.</p> </li>
        /// </ul> <p>For example, <code>{'gpu-code': 'sm_72', 'trt-ver': '6.0.1', 'cuda-ver': '10.1'}</code> </p> </li>
        /// <li> <p> <code>ANDROID</code>: Compilation for the Android OS supports the following compiler options:</p>
        /// <ul>
        /// <li> <p> <code>ANDROID_PLATFORM</code>: Specifies the Android API levels. Available levels range from 21 to 29. For example, <code>{'ANDROID_PLATFORM': 28}</code>.</p> </li>
        /// <li> <p> <code>mattr</code>: Add <code>{'mattr': ['+neon']}</code> to compiler options if compiling for ARM 32-bit platform with NEON support.</p> </li>
        /// </ul> </li>
        /// <li> <p> <code>INFERENTIA</code>: Compilation for target ml_inf1 uses compiler options passed in as a JSON string. For example, <code>"CompilerOptions": "\"--verbose 1 --num-neuroncores 2 -O2\""</code>. </p> <p>For information about supported compiler options, see <a href="https://github.com/aws/aws-neuron-sdk/blob/master/docs/neuron-cc/command-line-reference.md"> Neuron Compiler CLI</a>. </p> </li>
        /// <li> <p> <code>CoreML</code>: Compilation for the CoreML <code>OutputConfig$TargetDevice</code> supports the following compiler options:</p>
        /// <ul>
        /// <li> <p> <code>class_labels</code>: Specifies the classification labels file name inside input tar.gz file. For example, <code>{"class_labels": "imagenet_labels_1000.txt"}</code>. Labels inside the txt file should be separated by newlines.</p> </li>
        /// </ul> </li>
        /// <li> <p> <code>EIA</code>: Compilation for the Elastic Inference Accelerator supports the following compiler options:</p>
        /// <ul>
        /// <li> <p> <code>precision_mode</code>: Specifies the precision of compiled artifacts. Supported values are <code>"FP16"</code> and <code>"FP32"</code>. Default is <code>"FP32"</code>.</p> </li>
        /// <li> <p> <code>signature_def_key</code>: Specifies the signature to use for models in SavedModel format. Defaults is TensorFlow's default signature def key.</p> </li>
        /// <li> <p> <code>output_names</code>: Specifies a list of output tensor names for models in FrozenGraph format. Set at most one API field, either: <code>signature_def_key</code> or <code>output_names</code>.</p> </li>
        /// </ul> <p>For example: <code>{"precision_mode": "FP32", "output_names": ["output:0"]}</code> </p> </li>
        /// </ul>
        pub fn set_compiler_options(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.compiler_options = input;
            self
        }
        /// <p>The Amazon Web Services Key Management Service key (Amazon Web Services KMS) that Amazon SageMaker uses to encrypt your output models with Amazon S3 server-side encryption after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KmsKeyId can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Web Services Key Management Service key (Amazon Web Services KMS) that Amazon SageMaker uses to encrypt your output models with Amazon S3 server-side encryption after compilation job. If you don't provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. For more information, see <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html">KMS-Managed Encryption Keys</a> in the <i>Amazon Simple Storage Service Developer Guide.</i> </p>
        /// <p>The KmsKeyId can be any of the following formats: </p>
        /// <ul>
        /// <li> <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Key ARN: <code>arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code> </p> </li>
        /// <li> <p>Alias name: <code>alias/ExampleAlias</code> </p> </li>
        /// <li> <p>Alias name ARN: <code>arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias</code> </p> </li>
        /// </ul>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// Consumes the builder and constructs a [`OutputConfig`](crate::model::OutputConfig).
        pub fn build(self) -> crate::model::OutputConfig {
            crate::model::OutputConfig {
                s3_output_location: self.s3_output_location,
                target_device: self.target_device,
                target_platform: self.target_platform,
                compiler_options: self.compiler_options,
                kms_key_id: self.kms_key_id,
            }
        }
    }
}
impl OutputConfig {
    /// Creates a new builder-style object to manufacture [`OutputConfig`](crate::model::OutputConfig).
    pub fn builder() -> crate::model::output_config::Builder {
        crate::model::output_config::Builder::default()
    }
}

/// <p>Contains information about a target platform that you want your model to run on, such as OS, architecture, and accelerators. It is an alternative of <code>TargetDevice</code>.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TargetPlatform {
    /// <p>Specifies a target platform OS.</p>
    /// <ul>
    /// <li> <p> <code>LINUX</code>: Linux-based operating systems.</p> </li>
    /// <li> <p> <code>ANDROID</code>: Android operating systems. Android API level can be specified using the <code>ANDROID_PLATFORM</code> compiler option. For example, <code>"CompilerOptions": {'ANDROID_PLATFORM': 28}</code> </p> </li>
    /// </ul>
    #[doc(hidden)]
    pub os: std::option::Option<crate::model::TargetPlatformOs>,
    /// <p>Specifies a target platform architecture.</p>
    /// <ul>
    /// <li> <p> <code>X86_64</code>: 64-bit version of the x86 instruction set.</p> </li>
    /// <li> <p> <code>X86</code>: 32-bit version of the x86 instruction set.</p> </li>
    /// <li> <p> <code>ARM64</code>: ARMv8 64-bit CPU.</p> </li>
    /// <li> <p> <code>ARM_EABIHF</code>: ARMv7 32-bit, Hard Float.</p> </li>
    /// <li> <p> <code>ARM_EABI</code>: ARMv7 32-bit, Soft Float. Used by Android 32-bit ARM platform.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub arch: std::option::Option<crate::model::TargetPlatformArch>,
    /// <p>Specifies a target platform accelerator (optional).</p>
    /// <ul>
    /// <li> <p> <code>NVIDIA</code>: Nvidia graphics processing unit. It also requires <code>gpu-code</code>, <code>trt-ver</code>, <code>cuda-ver</code> compiler options</p> </li>
    /// <li> <p> <code>MALI</code>: ARM Mali graphics processor</p> </li>
    /// <li> <p> <code>INTEL_GRAPHICS</code>: Integrated Intel graphics</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub accelerator: std::option::Option<crate::model::TargetPlatformAccelerator>,
}
impl TargetPlatform {
    /// <p>Specifies a target platform OS.</p>
    /// <ul>
    /// <li> <p> <code>LINUX</code>: Linux-based operating systems.</p> </li>
    /// <li> <p> <code>ANDROID</code>: Android operating systems. Android API level can be specified using the <code>ANDROID_PLATFORM</code> compiler option. For example, <code>"CompilerOptions": {'ANDROID_PLATFORM': 28}</code> </p> </li>
    /// </ul>
    pub fn os(&self) -> std::option::Option<&crate::model::TargetPlatformOs> {
        self.os.as_ref()
    }
    /// <p>Specifies a target platform architecture.</p>
    /// <ul>
    /// <li> <p> <code>X86_64</code>: 64-bit version of the x86 instruction set.</p> </li>
    /// <li> <p> <code>X86</code>: 32-bit version of the x86 instruction set.</p> </li>
    /// <li> <p> <code>ARM64</code>: ARMv8 64-bit CPU.</p> </li>
    /// <li> <p> <code>ARM_EABIHF</code>: ARMv7 32-bit, Hard Float.</p> </li>
    /// <li> <p> <code>ARM_EABI</code>: ARMv7 32-bit, Soft Float. Used by Android 32-bit ARM platform.</p> </li>
    /// </ul>
    pub fn arch(&self) -> std::option::Option<&crate::model::TargetPlatformArch> {
        self.arch.as_ref()
    }
    /// <p>Specifies a target platform accelerator (optional).</p>
    /// <ul>
    /// <li> <p> <code>NVIDIA</code>: Nvidia graphics processing unit. It also requires <code>gpu-code</code>, <code>trt-ver</code>, <code>cuda-ver</code> compiler options</p> </li>
    /// <li> <p> <code>MALI</code>: ARM Mali graphics processor</p> </li>
    /// <li> <p> <code>INTEL_GRAPHICS</code>: Integrated Intel graphics</p> </li>
    /// </ul>
    pub fn accelerator(&self) -> std::option::Option<&crate::model::TargetPlatformAccelerator> {
        self.accelerator.as_ref()
    }
}
/// See [`TargetPlatform`](crate::model::TargetPlatform).
pub mod target_platform {

    /// A builder for [`TargetPlatform`](crate::model::TargetPlatform).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) os: std::option::Option<crate::model::TargetPlatformOs>,
        pub(crate) arch: std::option::Option<crate::model::TargetPlatformArch>,
        pub(crate) accelerator: std::option::Option<crate::model::TargetPlatformAccelerator>,
    }
    impl Builder {
        /// <p>Specifies a target platform OS.</p>
        /// <ul>
        /// <li> <p> <code>LINUX</code>: Linux-based operating systems.</p> </li>
        /// <li> <p> <code>ANDROID</code>: Android operating systems. Android API level can be specified using the <code>ANDROID_PLATFORM</code> compiler option. For example, <code>"CompilerOptions": {'ANDROID_PLATFORM': 28}</code> </p> </li>
        /// </ul>
        pub fn os(mut self, input: crate::model::TargetPlatformOs) -> Self {
            self.os = Some(input);
            self
        }
        /// <p>Specifies a target platform OS.</p>
        /// <ul>
        /// <li> <p> <code>LINUX</code>: Linux-based operating systems.</p> </li>
        /// <li> <p> <code>ANDROID</code>: Android operating systems. Android API level can be specified using the <code>ANDROID_PLATFORM</code> compiler option. For example, <code>"CompilerOptions": {'ANDROID_PLATFORM': 28}</code> </p> </li>
        /// </ul>
        pub fn set_os(
            mut self,
            input: std::option::Option<crate::model::TargetPlatformOs>,
        ) -> Self {
            self.os = input;
            self
        }
        /// <p>Specifies a target platform architecture.</p>
        /// <ul>
        /// <li> <p> <code>X86_64</code>: 64-bit version of the x86 instruction set.</p> </li>
        /// <li> <p> <code>X86</code>: 32-bit version of the x86 instruction set.</p> </li>
        /// <li> <p> <code>ARM64</code>: ARMv8 64-bit CPU.</p> </li>
        /// <li> <p> <code>ARM_EABIHF</code>: ARMv7 32-bit, Hard Float.</p> </li>
        /// <li> <p> <code>ARM_EABI</code>: ARMv7 32-bit, Soft Float. Used by Android 32-bit ARM platform.</p> </li>
        /// </ul>
        pub fn arch(mut self, input: crate::model::TargetPlatformArch) -> Self {
            self.arch = Some(input);
            self
        }
        /// <p>Specifies a target platform architecture.</p>
        /// <ul>
        /// <li> <p> <code>X86_64</code>: 64-bit version of the x86 instruction set.</p> </li>
        /// <li> <p> <code>X86</code>: 32-bit version of the x86 instruction set.</p> </li>
        /// <li> <p> <code>ARM64</code>: ARMv8 64-bit CPU.</p> </li>
        /// <li> <p> <code>ARM_EABIHF</code>: ARMv7 32-bit, Hard Float.</p> </li>
        /// <li> <p> <code>ARM_EABI</code>: ARMv7 32-bit, Soft Float. Used by Android 32-bit ARM platform.</p> </li>
        /// </ul>
        pub fn set_arch(
            mut self,
            input: std::option::Option<crate::model::TargetPlatformArch>,
        ) -> Self {
            self.arch = input;
            self
        }
        /// <p>Specifies a target platform accelerator (optional).</p>
        /// <ul>
        /// <li> <p> <code>NVIDIA</code>: Nvidia graphics processing unit. It also requires <code>gpu-code</code>, <code>trt-ver</code>, <code>cuda-ver</code> compiler options</p> </li>
        /// <li> <p> <code>MALI</code>: ARM Mali graphics processor</p> </li>
        /// <li> <p> <code>INTEL_GRAPHICS</code>: Integrated Intel graphics</p> </li>
        /// </ul>
        pub fn accelerator(mut self, input: crate::model::TargetPlatformAccelerator) -> Self {
            self.accelerator = Some(input);
            self
        }
        /// <p>Specifies a target platform accelerator (optional).</p>
        /// <ul>
        /// <li> <p> <code>NVIDIA</code>: Nvidia graphics processing unit. It also requires <code>gpu-code</code>, <code>trt-ver</code>, <code>cuda-ver</code> compiler options</p> </li>
        /// <li> <p> <code>MALI</code>: ARM Mali graphics processor</p> </li>
        /// <li> <p> <code>INTEL_GRAPHICS</code>: Integrated Intel graphics</p> </li>
        /// </ul>
        pub fn set_accelerator(
            mut self,
            input: std::option::Option<crate::model::TargetPlatformAccelerator>,
        ) -> Self {
            self.accelerator = input;
            self
        }
        /// Consumes the builder and constructs a [`TargetPlatform`](crate::model::TargetPlatform).
        pub fn build(self) -> crate::model::TargetPlatform {
            crate::model::TargetPlatform {
                os: self.os,
                arch: self.arch,
                accelerator: self.accelerator,
            }
        }
    }
}
impl TargetPlatform {
    /// Creates a new builder-style object to manufacture [`TargetPlatform`](crate::model::TargetPlatform).
    pub fn builder() -> crate::model::target_platform::Builder {
        crate::model::target_platform::Builder::default()
    }
}

/// <p>Contains information about the location of input model artifacts, the name and shape of the expected data inputs, and the framework in which the model was trained.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct InputConfig {
    /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
    /// <p>Specifies the name and shape of the expected data inputs for your trained model with a JSON dictionary form. The data inputs are <code>InputConfig$Framework</code> specific. </p>
    /// <ul>
    /// <li> <p> <code>TensorFlow</code>: You must specify the name and shape (NHWC format) of the expected data inputs using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
    /// <ul>
    /// <li> <p>Examples for one input:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input":[1,1024,1024,3]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input\":[1,1024,1024,3]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Examples for two inputs:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"data1": [1,28,28,1], "data2":[1,28,28,1]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"data1\": [1,28,28,1], \"data2\":[1,28,28,1]}</code> </p> </li>
    /// </ul> </li>
    /// </ul> </li>
    /// <li> <p> <code>KERAS</code>: You must specify the name and shape (NCHW format) of expected data inputs using a dictionary format for your trained model. Note that while Keras model artifacts should be uploaded in NHWC (channel-last) format, <code>DataInputConfig</code> should be specified in NCHW (channel-first) format. The dictionary formats required for the console and CLI are different.</p>
    /// <ul>
    /// <li> <p>Examples for one input:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input_1":[1,3,224,224]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input_1\":[1,3,224,224]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Examples for two inputs:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input_1": [1,3,224,224], "input_2":[1,3,224,224]} </code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input_1\": [1,3,224,224], \"input_2\":[1,3,224,224]}</code> </p> </li>
    /// </ul> </li>
    /// </ul> </li>
    /// <li> <p> <code>MXNET/ONNX/DARKNET</code>: You must specify the name and shape (NCHW format) of the expected data inputs in order using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
    /// <ul>
    /// <li> <p>Examples for one input:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"data":[1,3,1024,1024]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"data\":[1,3,1024,1024]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Examples for two inputs:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"var1": [1,1,28,28], "var2":[1,1,28,28]} </code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"var1\": [1,1,28,28], \"var2\":[1,1,28,28]}</code> </p> </li>
    /// </ul> </li>
    /// </ul> </li>
    /// <li> <p> <code>PyTorch</code>: You can either specify the name and shape (NCHW format) of expected data inputs in order using a dictionary format for your trained model or you can specify the shape only using a list format. The dictionary formats required for the console and CLI are different. The list formats for the console and CLI are the same.</p>
    /// <ul>
    /// <li> <p>Examples for one input in dictionary format:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input0":[1,3,224,224]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Example for one input in list format: <code>[[1,3,224,224]]</code> </p> </li>
    /// <li> <p>Examples for two inputs in dictionary format:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input0":[1,3,224,224], "input1":[1,3,224,224]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224], \"input1\":[1,3,224,224]} </code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Example for two inputs in list format: <code>[[1,3,224,224], [1,3,224,224]]</code> </p> </li>
    /// </ul> </li>
    /// <li> <p> <code>XGBOOST</code>: input data name and shape are not needed.</p> </li>
    /// </ul>
    /// <p> <code>DataInputConfig</code> supports the following parameters for <code>CoreML</code> <code>OutputConfig$TargetDevice</code> (ML Model format):</p>
    /// <ul>
    /// <li> <p> <code>shape</code>: Input shape, for example <code>{"input_1": {"shape": [1,224,224,3]}}</code>. In addition to static input shapes, CoreML converter supports Flexible input shapes:</p>
    /// <ul>
    /// <li> <p>Range Dimension. You can use the Range Dimension feature if you know the input shape will be within some specific interval in that dimension, for example: <code>{"input_1": {"shape": ["1..10", 224, 224, 3]}}</code> </p> </li>
    /// <li> <p>Enumerated shapes. Sometimes, the models are trained to work only on a select set of inputs. You can enumerate all supported input shapes, for example: <code>{"input_1": {"shape": [[1, 224, 224, 3], [1, 160, 160, 3]]}}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p> <code>default_shape</code>: Default input shape. You can set a default shape during conversion for both Range Dimension and Enumerated Shapes. For example <code>{"input_1": {"shape": ["1..10", 224, 224, 3], "default_shape": [1, 224, 224, 3]}}</code> </p> </li>
    /// <li> <p> <code>type</code>: Input type. Allowed values: <code>Image</code> and <code>Tensor</code>. By default, the converter generates an ML Model with inputs of type Tensor (MultiArray). User can set input type to be Image. Image input type requires additional input parameters such as <code>bias</code> and <code>scale</code>.</p> </li>
    /// <li> <p> <code>bias</code>: If the input type is an Image, you need to provide the bias vector.</p> </li>
    /// <li> <p> <code>scale</code>: If the input type is an Image, you need to provide a scale factor.</p> </li>
    /// </ul>
    /// <p>CoreML <code>ClassifierConfig</code> parameters can be specified using <code>OutputConfig$CompilerOptions</code>. CoreML converter supports Tensorflow and PyTorch models. CoreML conversion examples:</p>
    /// <ul>
    /// <li> <p>Tensor type input:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3]}}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Tensor type input without input name (PyTorch):</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224]}]</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Image type input:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}}</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Image type input without input name (PyTorch):</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}]</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
    /// </ul> </li>
    /// </ul>
    /// <p>Depending on the model format, <code>DataInputConfig</code> requires the following parameters for <code>ml_eia2</code> <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-TargetDevice">OutputConfig:TargetDevice</a>.</p>
    /// <ul>
    /// <li> <p>For TensorFlow models saved in the SavedModel format, specify the input names from <code>signature_def_key</code> and the input model shapes for <code>DataInputConfig</code>. Specify the <code>signature_def_key</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a> if the model does not use TensorFlow's default signature def key. For example:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"inputs": [1, 224, 224, 3]}</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"signature_def_key": "serving_custom"}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>For TensorFlow models saved as a frozen graph, specify the input tensor names and shapes in <code>DataInputConfig</code> and the output tensor names for <code>output_names</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a>. For example:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"input_tensor:0": [1, 224, 224, 3]}</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"output_names": ["output_tensor:0"]}</code> </p> </li>
    /// </ul> </li>
    /// </ul>
    #[doc(hidden)]
    pub data_input_config: std::option::Option<std::string::String>,
    /// <p>Identifies the framework in which the model was trained. For example: TENSORFLOW.</p>
    #[doc(hidden)]
    pub framework: std::option::Option<crate::model::Framework>,
    /// <p>Specifies the framework version to use. This API field is only supported for the MXNet, PyTorch, TensorFlow and TensorFlow Lite frameworks.</p>
    /// <p>For information about framework versions supported for cloud targets and edge devices, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-cloud.html">Cloud Supported Instance Types and Frameworks</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-devices-edge-frameworks.html">Edge Supported Frameworks</a>.</p>
    #[doc(hidden)]
    pub framework_version: std::option::Option<std::string::String>,
}
impl InputConfig {
    /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
    /// <p>Specifies the name and shape of the expected data inputs for your trained model with a JSON dictionary form. The data inputs are <code>InputConfig$Framework</code> specific. </p>
    /// <ul>
    /// <li> <p> <code>TensorFlow</code>: You must specify the name and shape (NHWC format) of the expected data inputs using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
    /// <ul>
    /// <li> <p>Examples for one input:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input":[1,1024,1024,3]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input\":[1,1024,1024,3]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Examples for two inputs:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"data1": [1,28,28,1], "data2":[1,28,28,1]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"data1\": [1,28,28,1], \"data2\":[1,28,28,1]}</code> </p> </li>
    /// </ul> </li>
    /// </ul> </li>
    /// <li> <p> <code>KERAS</code>: You must specify the name and shape (NCHW format) of expected data inputs using a dictionary format for your trained model. Note that while Keras model artifacts should be uploaded in NHWC (channel-last) format, <code>DataInputConfig</code> should be specified in NCHW (channel-first) format. The dictionary formats required for the console and CLI are different.</p>
    /// <ul>
    /// <li> <p>Examples for one input:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input_1":[1,3,224,224]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input_1\":[1,3,224,224]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Examples for two inputs:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input_1": [1,3,224,224], "input_2":[1,3,224,224]} </code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input_1\": [1,3,224,224], \"input_2\":[1,3,224,224]}</code> </p> </li>
    /// </ul> </li>
    /// </ul> </li>
    /// <li> <p> <code>MXNET/ONNX/DARKNET</code>: You must specify the name and shape (NCHW format) of the expected data inputs in order using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
    /// <ul>
    /// <li> <p>Examples for one input:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"data":[1,3,1024,1024]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"data\":[1,3,1024,1024]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Examples for two inputs:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"var1": [1,1,28,28], "var2":[1,1,28,28]} </code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"var1\": [1,1,28,28], \"var2\":[1,1,28,28]}</code> </p> </li>
    /// </ul> </li>
    /// </ul> </li>
    /// <li> <p> <code>PyTorch</code>: You can either specify the name and shape (NCHW format) of expected data inputs in order using a dictionary format for your trained model or you can specify the shape only using a list format. The dictionary formats required for the console and CLI are different. The list formats for the console and CLI are the same.</p>
    /// <ul>
    /// <li> <p>Examples for one input in dictionary format:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input0":[1,3,224,224]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224]}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Example for one input in list format: <code>[[1,3,224,224]]</code> </p> </li>
    /// <li> <p>Examples for two inputs in dictionary format:</p>
    /// <ul>
    /// <li> <p>If using the console, <code>{"input0":[1,3,224,224], "input1":[1,3,224,224]}</code> </p> </li>
    /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224], \"input1\":[1,3,224,224]} </code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Example for two inputs in list format: <code>[[1,3,224,224], [1,3,224,224]]</code> </p> </li>
    /// </ul> </li>
    /// <li> <p> <code>XGBOOST</code>: input data name and shape are not needed.</p> </li>
    /// </ul>
    /// <p> <code>DataInputConfig</code> supports the following parameters for <code>CoreML</code> <code>OutputConfig$TargetDevice</code> (ML Model format):</p>
    /// <ul>
    /// <li> <p> <code>shape</code>: Input shape, for example <code>{"input_1": {"shape": [1,224,224,3]}}</code>. In addition to static input shapes, CoreML converter supports Flexible input shapes:</p>
    /// <ul>
    /// <li> <p>Range Dimension. You can use the Range Dimension feature if you know the input shape will be within some specific interval in that dimension, for example: <code>{"input_1": {"shape": ["1..10", 224, 224, 3]}}</code> </p> </li>
    /// <li> <p>Enumerated shapes. Sometimes, the models are trained to work only on a select set of inputs. You can enumerate all supported input shapes, for example: <code>{"input_1": {"shape": [[1, 224, 224, 3], [1, 160, 160, 3]]}}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p> <code>default_shape</code>: Default input shape. You can set a default shape during conversion for both Range Dimension and Enumerated Shapes. For example <code>{"input_1": {"shape": ["1..10", 224, 224, 3], "default_shape": [1, 224, 224, 3]}}</code> </p> </li>
    /// <li> <p> <code>type</code>: Input type. Allowed values: <code>Image</code> and <code>Tensor</code>. By default, the converter generates an ML Model with inputs of type Tensor (MultiArray). User can set input type to be Image. Image input type requires additional input parameters such as <code>bias</code> and <code>scale</code>.</p> </li>
    /// <li> <p> <code>bias</code>: If the input type is an Image, you need to provide the bias vector.</p> </li>
    /// <li> <p> <code>scale</code>: If the input type is an Image, you need to provide a scale factor.</p> </li>
    /// </ul>
    /// <p>CoreML <code>ClassifierConfig</code> parameters can be specified using <code>OutputConfig$CompilerOptions</code>. CoreML converter supports Tensorflow and PyTorch models. CoreML conversion examples:</p>
    /// <ul>
    /// <li> <p>Tensor type input:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3]}}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Tensor type input without input name (PyTorch):</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224]}]</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Image type input:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}}</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>Image type input without input name (PyTorch):</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}]</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
    /// </ul> </li>
    /// </ul>
    /// <p>Depending on the model format, <code>DataInputConfig</code> requires the following parameters for <code>ml_eia2</code> <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-TargetDevice">OutputConfig:TargetDevice</a>.</p>
    /// <ul>
    /// <li> <p>For TensorFlow models saved in the SavedModel format, specify the input names from <code>signature_def_key</code> and the input model shapes for <code>DataInputConfig</code>. Specify the <code>signature_def_key</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a> if the model does not use TensorFlow's default signature def key. For example:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"inputs": [1, 224, 224, 3]}</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"signature_def_key": "serving_custom"}</code> </p> </li>
    /// </ul> </li>
    /// <li> <p>For TensorFlow models saved as a frozen graph, specify the input tensor names and shapes in <code>DataInputConfig</code> and the output tensor names for <code>output_names</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a>. For example:</p>
    /// <ul>
    /// <li> <p> <code>"DataInputConfig": {"input_tensor:0": [1, 224, 224, 3]}</code> </p> </li>
    /// <li> <p> <code>"CompilerOptions": {"output_names": ["output_tensor:0"]}</code> </p> </li>
    /// </ul> </li>
    /// </ul>
    pub fn data_input_config(&self) -> std::option::Option<&str> {
        self.data_input_config.as_deref()
    }
    /// <p>Identifies the framework in which the model was trained. For example: TENSORFLOW.</p>
    pub fn framework(&self) -> std::option::Option<&crate::model::Framework> {
        self.framework.as_ref()
    }
    /// <p>Specifies the framework version to use. This API field is only supported for the MXNet, PyTorch, TensorFlow and TensorFlow Lite frameworks.</p>
    /// <p>For information about framework versions supported for cloud targets and edge devices, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-cloud.html">Cloud Supported Instance Types and Frameworks</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-devices-edge-frameworks.html">Edge Supported Frameworks</a>.</p>
    pub fn framework_version(&self) -> std::option::Option<&str> {
        self.framework_version.as_deref()
    }
}
/// See [`InputConfig`](crate::model::InputConfig).
pub mod input_config {

    /// A builder for [`InputConfig`](crate::model::InputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_uri: std::option::Option<std::string::String>,
        pub(crate) data_input_config: std::option::Option<std::string::String>,
        pub(crate) framework: std::option::Option<crate::model::Framework>,
        pub(crate) framework_version: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// <p>Specifies the name and shape of the expected data inputs for your trained model with a JSON dictionary form. The data inputs are <code>InputConfig$Framework</code> specific. </p>
        /// <ul>
        /// <li> <p> <code>TensorFlow</code>: You must specify the name and shape (NHWC format) of the expected data inputs using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
        /// <ul>
        /// <li> <p>Examples for one input:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input":[1,1024,1024,3]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input\":[1,1024,1024,3]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Examples for two inputs:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"data1": [1,28,28,1], "data2":[1,28,28,1]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"data1\": [1,28,28,1], \"data2\":[1,28,28,1]}</code> </p> </li>
        /// </ul> </li>
        /// </ul> </li>
        /// <li> <p> <code>KERAS</code>: You must specify the name and shape (NCHW format) of expected data inputs using a dictionary format for your trained model. Note that while Keras model artifacts should be uploaded in NHWC (channel-last) format, <code>DataInputConfig</code> should be specified in NCHW (channel-first) format. The dictionary formats required for the console and CLI are different.</p>
        /// <ul>
        /// <li> <p>Examples for one input:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input_1":[1,3,224,224]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input_1\":[1,3,224,224]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Examples for two inputs:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input_1": [1,3,224,224], "input_2":[1,3,224,224]} </code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input_1\": [1,3,224,224], \"input_2\":[1,3,224,224]}</code> </p> </li>
        /// </ul> </li>
        /// </ul> </li>
        /// <li> <p> <code>MXNET/ONNX/DARKNET</code>: You must specify the name and shape (NCHW format) of the expected data inputs in order using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
        /// <ul>
        /// <li> <p>Examples for one input:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"data":[1,3,1024,1024]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"data\":[1,3,1024,1024]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Examples for two inputs:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"var1": [1,1,28,28], "var2":[1,1,28,28]} </code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"var1\": [1,1,28,28], \"var2\":[1,1,28,28]}</code> </p> </li>
        /// </ul> </li>
        /// </ul> </li>
        /// <li> <p> <code>PyTorch</code>: You can either specify the name and shape (NCHW format) of expected data inputs in order using a dictionary format for your trained model or you can specify the shape only using a list format. The dictionary formats required for the console and CLI are different. The list formats for the console and CLI are the same.</p>
        /// <ul>
        /// <li> <p>Examples for one input in dictionary format:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input0":[1,3,224,224]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Example for one input in list format: <code>[[1,3,224,224]]</code> </p> </li>
        /// <li> <p>Examples for two inputs in dictionary format:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input0":[1,3,224,224], "input1":[1,3,224,224]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224], \"input1\":[1,3,224,224]} </code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Example for two inputs in list format: <code>[[1,3,224,224], [1,3,224,224]]</code> </p> </li>
        /// </ul> </li>
        /// <li> <p> <code>XGBOOST</code>: input data name and shape are not needed.</p> </li>
        /// </ul>
        /// <p> <code>DataInputConfig</code> supports the following parameters for <code>CoreML</code> <code>OutputConfig$TargetDevice</code> (ML Model format):</p>
        /// <ul>
        /// <li> <p> <code>shape</code>: Input shape, for example <code>{"input_1": {"shape": [1,224,224,3]}}</code>. In addition to static input shapes, CoreML converter supports Flexible input shapes:</p>
        /// <ul>
        /// <li> <p>Range Dimension. You can use the Range Dimension feature if you know the input shape will be within some specific interval in that dimension, for example: <code>{"input_1": {"shape": ["1..10", 224, 224, 3]}}</code> </p> </li>
        /// <li> <p>Enumerated shapes. Sometimes, the models are trained to work only on a select set of inputs. You can enumerate all supported input shapes, for example: <code>{"input_1": {"shape": [[1, 224, 224, 3], [1, 160, 160, 3]]}}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p> <code>default_shape</code>: Default input shape. You can set a default shape during conversion for both Range Dimension and Enumerated Shapes. For example <code>{"input_1": {"shape": ["1..10", 224, 224, 3], "default_shape": [1, 224, 224, 3]}}</code> </p> </li>
        /// <li> <p> <code>type</code>: Input type. Allowed values: <code>Image</code> and <code>Tensor</code>. By default, the converter generates an ML Model with inputs of type Tensor (MultiArray). User can set input type to be Image. Image input type requires additional input parameters such as <code>bias</code> and <code>scale</code>.</p> </li>
        /// <li> <p> <code>bias</code>: If the input type is an Image, you need to provide the bias vector.</p> </li>
        /// <li> <p> <code>scale</code>: If the input type is an Image, you need to provide a scale factor.</p> </li>
        /// </ul>
        /// <p>CoreML <code>ClassifierConfig</code> parameters can be specified using <code>OutputConfig$CompilerOptions</code>. CoreML converter supports Tensorflow and PyTorch models. CoreML conversion examples:</p>
        /// <ul>
        /// <li> <p>Tensor type input:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3]}}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Tensor type input without input name (PyTorch):</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224]}]</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Image type input:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}}</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Image type input without input name (PyTorch):</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}]</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
        /// </ul> </li>
        /// </ul>
        /// <p>Depending on the model format, <code>DataInputConfig</code> requires the following parameters for <code>ml_eia2</code> <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-TargetDevice">OutputConfig:TargetDevice</a>.</p>
        /// <ul>
        /// <li> <p>For TensorFlow models saved in the SavedModel format, specify the input names from <code>signature_def_key</code> and the input model shapes for <code>DataInputConfig</code>. Specify the <code>signature_def_key</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a> if the model does not use TensorFlow's default signature def key. For example:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"inputs": [1, 224, 224, 3]}</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"signature_def_key": "serving_custom"}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>For TensorFlow models saved as a frozen graph, specify the input tensor names and shapes in <code>DataInputConfig</code> and the output tensor names for <code>output_names</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a>. For example:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"input_tensor:0": [1, 224, 224, 3]}</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"output_names": ["output_tensor:0"]}</code> </p> </li>
        /// </ul> </li>
        /// </ul>
        pub fn data_input_config(mut self, input: impl Into<std::string::String>) -> Self {
            self.data_input_config = Some(input.into());
            self
        }
        /// <p>Specifies the name and shape of the expected data inputs for your trained model with a JSON dictionary form. The data inputs are <code>InputConfig$Framework</code> specific. </p>
        /// <ul>
        /// <li> <p> <code>TensorFlow</code>: You must specify the name and shape (NHWC format) of the expected data inputs using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
        /// <ul>
        /// <li> <p>Examples for one input:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input":[1,1024,1024,3]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input\":[1,1024,1024,3]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Examples for two inputs:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"data1": [1,28,28,1], "data2":[1,28,28,1]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"data1\": [1,28,28,1], \"data2\":[1,28,28,1]}</code> </p> </li>
        /// </ul> </li>
        /// </ul> </li>
        /// <li> <p> <code>KERAS</code>: You must specify the name and shape (NCHW format) of expected data inputs using a dictionary format for your trained model. Note that while Keras model artifacts should be uploaded in NHWC (channel-last) format, <code>DataInputConfig</code> should be specified in NCHW (channel-first) format. The dictionary formats required for the console and CLI are different.</p>
        /// <ul>
        /// <li> <p>Examples for one input:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input_1":[1,3,224,224]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input_1\":[1,3,224,224]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Examples for two inputs:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input_1": [1,3,224,224], "input_2":[1,3,224,224]} </code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input_1\": [1,3,224,224], \"input_2\":[1,3,224,224]}</code> </p> </li>
        /// </ul> </li>
        /// </ul> </li>
        /// <li> <p> <code>MXNET/ONNX/DARKNET</code>: You must specify the name and shape (NCHW format) of the expected data inputs in order using a dictionary format for your trained model. The dictionary formats required for the console and CLI are different.</p>
        /// <ul>
        /// <li> <p>Examples for one input:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"data":[1,3,1024,1024]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"data\":[1,3,1024,1024]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Examples for two inputs:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"var1": [1,1,28,28], "var2":[1,1,28,28]} </code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"var1\": [1,1,28,28], \"var2\":[1,1,28,28]}</code> </p> </li>
        /// </ul> </li>
        /// </ul> </li>
        /// <li> <p> <code>PyTorch</code>: You can either specify the name and shape (NCHW format) of expected data inputs in order using a dictionary format for your trained model or you can specify the shape only using a list format. The dictionary formats required for the console and CLI are different. The list formats for the console and CLI are the same.</p>
        /// <ul>
        /// <li> <p>Examples for one input in dictionary format:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input0":[1,3,224,224]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224]}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Example for one input in list format: <code>[[1,3,224,224]]</code> </p> </li>
        /// <li> <p>Examples for two inputs in dictionary format:</p>
        /// <ul>
        /// <li> <p>If using the console, <code>{"input0":[1,3,224,224], "input1":[1,3,224,224]}</code> </p> </li>
        /// <li> <p>If using the CLI, <code>{\"input0\":[1,3,224,224], \"input1\":[1,3,224,224]} </code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Example for two inputs in list format: <code>[[1,3,224,224], [1,3,224,224]]</code> </p> </li>
        /// </ul> </li>
        /// <li> <p> <code>XGBOOST</code>: input data name and shape are not needed.</p> </li>
        /// </ul>
        /// <p> <code>DataInputConfig</code> supports the following parameters for <code>CoreML</code> <code>OutputConfig$TargetDevice</code> (ML Model format):</p>
        /// <ul>
        /// <li> <p> <code>shape</code>: Input shape, for example <code>{"input_1": {"shape": [1,224,224,3]}}</code>. In addition to static input shapes, CoreML converter supports Flexible input shapes:</p>
        /// <ul>
        /// <li> <p>Range Dimension. You can use the Range Dimension feature if you know the input shape will be within some specific interval in that dimension, for example: <code>{"input_1": {"shape": ["1..10", 224, 224, 3]}}</code> </p> </li>
        /// <li> <p>Enumerated shapes. Sometimes, the models are trained to work only on a select set of inputs. You can enumerate all supported input shapes, for example: <code>{"input_1": {"shape": [[1, 224, 224, 3], [1, 160, 160, 3]]}}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p> <code>default_shape</code>: Default input shape. You can set a default shape during conversion for both Range Dimension and Enumerated Shapes. For example <code>{"input_1": {"shape": ["1..10", 224, 224, 3], "default_shape": [1, 224, 224, 3]}}</code> </p> </li>
        /// <li> <p> <code>type</code>: Input type. Allowed values: <code>Image</code> and <code>Tensor</code>. By default, the converter generates an ML Model with inputs of type Tensor (MultiArray). User can set input type to be Image. Image input type requires additional input parameters such as <code>bias</code> and <code>scale</code>.</p> </li>
        /// <li> <p> <code>bias</code>: If the input type is an Image, you need to provide the bias vector.</p> </li>
        /// <li> <p> <code>scale</code>: If the input type is an Image, you need to provide a scale factor.</p> </li>
        /// </ul>
        /// <p>CoreML <code>ClassifierConfig</code> parameters can be specified using <code>OutputConfig$CompilerOptions</code>. CoreML converter supports Tensorflow and PyTorch models. CoreML conversion examples:</p>
        /// <ul>
        /// <li> <p>Tensor type input:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3]}}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Tensor type input without input name (PyTorch):</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224]}]</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Image type input:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"input_1": {"shape": [[1,224,224,3], [1,160,160,3]], "default_shape": [1,224,224,3], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}}</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>Image type input without input name (PyTorch):</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": [{"shape": [[1,3,224,224], [1,3,160,160]], "default_shape": [1,3,224,224], "type": "Image", "bias": [-1,-1,-1], "scale": 0.007843137255}]</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"class_labels": "imagenet_labels_1000.txt"}</code> </p> </li>
        /// </ul> </li>
        /// </ul>
        /// <p>Depending on the model format, <code>DataInputConfig</code> requires the following parameters for <code>ml_eia2</code> <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-TargetDevice">OutputConfig:TargetDevice</a>.</p>
        /// <ul>
        /// <li> <p>For TensorFlow models saved in the SavedModel format, specify the input names from <code>signature_def_key</code> and the input model shapes for <code>DataInputConfig</code>. Specify the <code>signature_def_key</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a> if the model does not use TensorFlow's default signature def key. For example:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"inputs": [1, 224, 224, 3]}</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"signature_def_key": "serving_custom"}</code> </p> </li>
        /// </ul> </li>
        /// <li> <p>For TensorFlow models saved as a frozen graph, specify the input tensor names and shapes in <code>DataInputConfig</code> and the output tensor names for <code>output_names</code> in <a href="https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputConfig.html#sagemaker-Type-OutputConfig-CompilerOptions"> <code>OutputConfig:CompilerOptions</code> </a>. For example:</p>
        /// <ul>
        /// <li> <p> <code>"DataInputConfig": {"input_tensor:0": [1, 224, 224, 3]}</code> </p> </li>
        /// <li> <p> <code>"CompilerOptions": {"output_names": ["output_tensor:0"]}</code> </p> </li>
        /// </ul> </li>
        /// </ul>
        pub fn set_data_input_config(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.data_input_config = input;
            self
        }
        /// <p>Identifies the framework in which the model was trained. For example: TENSORFLOW.</p>
        pub fn framework(mut self, input: crate::model::Framework) -> Self {
            self.framework = Some(input);
            self
        }
        /// <p>Identifies the framework in which the model was trained. For example: TENSORFLOW.</p>
        pub fn set_framework(
            mut self,
            input: std::option::Option<crate::model::Framework>,
        ) -> Self {
            self.framework = input;
            self
        }
        /// <p>Specifies the framework version to use. This API field is only supported for the MXNet, PyTorch, TensorFlow and TensorFlow Lite frameworks.</p>
        /// <p>For information about framework versions supported for cloud targets and edge devices, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-cloud.html">Cloud Supported Instance Types and Frameworks</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-devices-edge-frameworks.html">Edge Supported Frameworks</a>.</p>
        pub fn framework_version(mut self, input: impl Into<std::string::String>) -> Self {
            self.framework_version = Some(input.into());
            self
        }
        /// <p>Specifies the framework version to use. This API field is only supported for the MXNet, PyTorch, TensorFlow and TensorFlow Lite frameworks.</p>
        /// <p>For information about framework versions supported for cloud targets and edge devices, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-cloud.html">Cloud Supported Instance Types and Frameworks</a> and <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-devices-edge-frameworks.html">Edge Supported Frameworks</a>.</p>
        pub fn set_framework_version(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.framework_version = input;
            self
        }
        /// Consumes the builder and constructs a [`InputConfig`](crate::model::InputConfig).
        pub fn build(self) -> crate::model::InputConfig {
            crate::model::InputConfig {
                s3_uri: self.s3_uri,
                data_input_config: self.data_input_config,
                framework: self.framework,
                framework_version: self.framework_version,
            }
        }
    }
}
impl InputConfig {
    /// Creates a new builder-style object to manufacture [`InputConfig`](crate::model::InputConfig).
    pub fn builder() -> crate::model::input_config::Builder {
        crate::model::input_config::Builder::default()
    }
}

/// When writing a match expression against `Framework`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let framework = unimplemented!();
/// match framework {
///     Framework::Darknet => { /* ... */ },
///     Framework::Keras => { /* ... */ },
///     Framework::Mxnet => { /* ... */ },
///     Framework::Onnx => { /* ... */ },
///     Framework::Pytorch => { /* ... */ },
///     Framework::Sklearn => { /* ... */ },
///     Framework::Tensorflow => { /* ... */ },
///     Framework::Tflite => { /* ... */ },
///     Framework::Xgboost => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `framework` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `Framework::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `Framework::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `Framework::NewFeature` is defined.
/// Specifically, when `framework` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `Framework::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum Framework {
    #[allow(missing_docs)] // documentation missing in model
    Darknet,
    #[allow(missing_docs)] // documentation missing in model
    Keras,
    #[allow(missing_docs)] // documentation missing in model
    Mxnet,
    #[allow(missing_docs)] // documentation missing in model
    Onnx,
    #[allow(missing_docs)] // documentation missing in model
    Pytorch,
    #[allow(missing_docs)] // documentation missing in model
    Sklearn,
    #[allow(missing_docs)] // documentation missing in model
    Tensorflow,
    #[allow(missing_docs)] // documentation missing in model
    Tflite,
    #[allow(missing_docs)] // documentation missing in model
    Xgboost,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for Framework {
    fn from(s: &str) -> Self {
        match s {
            "DARKNET" => Framework::Darknet,
            "KERAS" => Framework::Keras,
            "MXNET" => Framework::Mxnet,
            "ONNX" => Framework::Onnx,
            "PYTORCH" => Framework::Pytorch,
            "SKLEARN" => Framework::Sklearn,
            "TENSORFLOW" => Framework::Tensorflow,
            "TFLITE" => Framework::Tflite,
            "XGBOOST" => Framework::Xgboost,
            other => Framework::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for Framework {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(Framework::from(s))
    }
}
impl Framework {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            Framework::Darknet => "DARKNET",
            Framework::Keras => "KERAS",
            Framework::Mxnet => "MXNET",
            Framework::Onnx => "ONNX",
            Framework::Pytorch => "PYTORCH",
            Framework::Sklearn => "SKLEARN",
            Framework::Tensorflow => "TENSORFLOW",
            Framework::Tflite => "TFLITE",
            Framework::Xgboost => "XGBOOST",
            Framework::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "DARKNET",
            "KERAS",
            "MXNET",
            "ONNX",
            "PYTORCH",
            "SKLEARN",
            "TENSORFLOW",
            "TFLITE",
            "XGBOOST",
        ]
    }
}
impl AsRef<str> for Framework {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides information to verify the integrity of stored model artifacts. </p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDigests {
    /// <p>Provides a hash value that uniquely identifies the stored model artifacts.</p>
    #[doc(hidden)]
    pub artifact_digest: std::option::Option<std::string::String>,
}
impl ModelDigests {
    /// <p>Provides a hash value that uniquely identifies the stored model artifacts.</p>
    pub fn artifact_digest(&self) -> std::option::Option<&str> {
        self.artifact_digest.as_deref()
    }
}
/// See [`ModelDigests`](crate::model::ModelDigests).
pub mod model_digests {

    /// A builder for [`ModelDigests`](crate::model::ModelDigests).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) artifact_digest: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Provides a hash value that uniquely identifies the stored model artifacts.</p>
        pub fn artifact_digest(mut self, input: impl Into<std::string::String>) -> Self {
            self.artifact_digest = Some(input.into());
            self
        }
        /// <p>Provides a hash value that uniquely identifies the stored model artifacts.</p>
        pub fn set_artifact_digest(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.artifact_digest = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDigests`](crate::model::ModelDigests).
        pub fn build(self) -> crate::model::ModelDigests {
            crate::model::ModelDigests {
                artifact_digest: self.artifact_digest,
            }
        }
    }
}
impl ModelDigests {
    /// Creates a new builder-style object to manufacture [`ModelDigests`](crate::model::ModelDigests).
    pub fn builder() -> crate::model::model_digests::Builder {
        crate::model::model_digests::Builder::default()
    }
}

/// <p>Provides information about the endpoint of the model deployment.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDeployResult {
    /// <p>The name of the endpoint to which the model has been deployed.</p> <note>
    /// <p>If model deployment fails, this field is omitted from the response.</p>
    /// </note>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
}
impl ModelDeployResult {
    /// <p>The name of the endpoint to which the model has been deployed.</p> <note>
    /// <p>If model deployment fails, this field is omitted from the response.</p>
    /// </note>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
}
/// See [`ModelDeployResult`](crate::model::ModelDeployResult).
pub mod model_deploy_result {

    /// A builder for [`ModelDeployResult`](crate::model::ModelDeployResult).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the endpoint to which the model has been deployed.</p> <note>
        /// <p>If model deployment fails, this field is omitted from the response.</p>
        /// </note>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>The name of the endpoint to which the model has been deployed.</p> <note>
        /// <p>If model deployment fails, this field is omitted from the response.</p>
        /// </note>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDeployResult`](crate::model::ModelDeployResult).
        pub fn build(self) -> crate::model::ModelDeployResult {
            crate::model::ModelDeployResult {
                endpoint_name: self.endpoint_name,
            }
        }
    }
}
impl ModelDeployResult {
    /// Creates a new builder-style object to manufacture [`ModelDeployResult`](crate::model::ModelDeployResult).
    pub fn builder() -> crate::model::model_deploy_result::Builder {
        crate::model::model_deploy_result::Builder::default()
    }
}

/// <p>Specifies how to generate the endpoint name for an automatic one-click Autopilot model deployment.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ModelDeployConfig {
    /// <p>Set to <code>True</code> to automatically generate an endpoint name for a one-click Autopilot model deployment; set to <code>False</code> otherwise. The default value is <code>False</code>.</p> <note>
    /// <p>If you set <code>AutoGenerateEndpointName</code> to <code>True</code>, do not specify the <code>EndpointName</code>; otherwise a 400 error is thrown.</p>
    /// </note>
    #[doc(hidden)]
    pub auto_generate_endpoint_name: bool,
    /// <p>Specifies the endpoint name to use for a one-click Autopilot model deployment if the endpoint name is not generated automatically.</p> <note>
    /// <p>Specify the <code>EndpointName</code> if and only if you set <code>AutoGenerateEndpointName</code> to <code>False</code>; otherwise a 400 error is thrown.</p>
    /// </note>
    #[doc(hidden)]
    pub endpoint_name: std::option::Option<std::string::String>,
}
impl ModelDeployConfig {
    /// <p>Set to <code>True</code> to automatically generate an endpoint name for a one-click Autopilot model deployment; set to <code>False</code> otherwise. The default value is <code>False</code>.</p> <note>
    /// <p>If you set <code>AutoGenerateEndpointName</code> to <code>True</code>, do not specify the <code>EndpointName</code>; otherwise a 400 error is thrown.</p>
    /// </note>
    pub fn auto_generate_endpoint_name(&self) -> bool {
        self.auto_generate_endpoint_name
    }
    /// <p>Specifies the endpoint name to use for a one-click Autopilot model deployment if the endpoint name is not generated automatically.</p> <note>
    /// <p>Specify the <code>EndpointName</code> if and only if you set <code>AutoGenerateEndpointName</code> to <code>False</code>; otherwise a 400 error is thrown.</p>
    /// </note>
    pub fn endpoint_name(&self) -> std::option::Option<&str> {
        self.endpoint_name.as_deref()
    }
}
/// See [`ModelDeployConfig`](crate::model::ModelDeployConfig).
pub mod model_deploy_config {

    /// A builder for [`ModelDeployConfig`](crate::model::ModelDeployConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) auto_generate_endpoint_name: std::option::Option<bool>,
        pub(crate) endpoint_name: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Set to <code>True</code> to automatically generate an endpoint name for a one-click Autopilot model deployment; set to <code>False</code> otherwise. The default value is <code>False</code>.</p> <note>
        /// <p>If you set <code>AutoGenerateEndpointName</code> to <code>True</code>, do not specify the <code>EndpointName</code>; otherwise a 400 error is thrown.</p>
        /// </note>
        pub fn auto_generate_endpoint_name(mut self, input: bool) -> Self {
            self.auto_generate_endpoint_name = Some(input);
            self
        }
        /// <p>Set to <code>True</code> to automatically generate an endpoint name for a one-click Autopilot model deployment; set to <code>False</code> otherwise. The default value is <code>False</code>.</p> <note>
        /// <p>If you set <code>AutoGenerateEndpointName</code> to <code>True</code>, do not specify the <code>EndpointName</code>; otherwise a 400 error is thrown.</p>
        /// </note>
        pub fn set_auto_generate_endpoint_name(mut self, input: std::option::Option<bool>) -> Self {
            self.auto_generate_endpoint_name = input;
            self
        }
        /// <p>Specifies the endpoint name to use for a one-click Autopilot model deployment if the endpoint name is not generated automatically.</p> <note>
        /// <p>Specify the <code>EndpointName</code> if and only if you set <code>AutoGenerateEndpointName</code> to <code>False</code>; otherwise a 400 error is thrown.</p>
        /// </note>
        pub fn endpoint_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.endpoint_name = Some(input.into());
            self
        }
        /// <p>Specifies the endpoint name to use for a one-click Autopilot model deployment if the endpoint name is not generated automatically.</p> <note>
        /// <p>Specify the <code>EndpointName</code> if and only if you set <code>AutoGenerateEndpointName</code> to <code>False</code>; otherwise a 400 error is thrown.</p>
        /// </note>
        pub fn set_endpoint_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.endpoint_name = input;
            self
        }
        /// Consumes the builder and constructs a [`ModelDeployConfig`](crate::model::ModelDeployConfig).
        pub fn build(self) -> crate::model::ModelDeployConfig {
            crate::model::ModelDeployConfig {
                auto_generate_endpoint_name: self.auto_generate_endpoint_name.unwrap_or_default(),
                endpoint_name: self.endpoint_name,
            }
        }
    }
}
impl ModelDeployConfig {
    /// Creates a new builder-style object to manufacture [`ModelDeployConfig`](crate::model::ModelDeployConfig).
    pub fn builder() -> crate::model::model_deploy_config::Builder {
        crate::model::model_deploy_config::Builder::default()
    }
}

/// <p>The resolved attributes.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ResolvedAttributes {
    /// <p>Specifies a metric to minimize or maximize as the objective of a job.</p>
    #[doc(hidden)]
    pub auto_ml_job_objective: std::option::Option<crate::model::AutoMlJobObjective>,
    /// <p>The problem type.</p>
    #[doc(hidden)]
    pub problem_type: std::option::Option<crate::model::ProblemType>,
    /// <p>How long a job is allowed to run, or how many candidates a job is allowed to generate.</p>
    #[doc(hidden)]
    pub completion_criteria: std::option::Option<crate::model::AutoMlJobCompletionCriteria>,
}
impl ResolvedAttributes {
    /// <p>Specifies a metric to minimize or maximize as the objective of a job.</p>
    pub fn auto_ml_job_objective(&self) -> std::option::Option<&crate::model::AutoMlJobObjective> {
        self.auto_ml_job_objective.as_ref()
    }
    /// <p>The problem type.</p>
    pub fn problem_type(&self) -> std::option::Option<&crate::model::ProblemType> {
        self.problem_type.as_ref()
    }
    /// <p>How long a job is allowed to run, or how many candidates a job is allowed to generate.</p>
    pub fn completion_criteria(
        &self,
    ) -> std::option::Option<&crate::model::AutoMlJobCompletionCriteria> {
        self.completion_criteria.as_ref()
    }
}
/// See [`ResolvedAttributes`](crate::model::ResolvedAttributes).
pub mod resolved_attributes {

    /// A builder for [`ResolvedAttributes`](crate::model::ResolvedAttributes).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) auto_ml_job_objective: std::option::Option<crate::model::AutoMlJobObjective>,
        pub(crate) problem_type: std::option::Option<crate::model::ProblemType>,
        pub(crate) completion_criteria:
            std::option::Option<crate::model::AutoMlJobCompletionCriteria>,
    }
    impl Builder {
        /// <p>Specifies a metric to minimize or maximize as the objective of a job.</p>
        pub fn auto_ml_job_objective(mut self, input: crate::model::AutoMlJobObjective) -> Self {
            self.auto_ml_job_objective = Some(input);
            self
        }
        /// <p>Specifies a metric to minimize or maximize as the objective of a job.</p>
        pub fn set_auto_ml_job_objective(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobObjective>,
        ) -> Self {
            self.auto_ml_job_objective = input;
            self
        }
        /// <p>The problem type.</p>
        pub fn problem_type(mut self, input: crate::model::ProblemType) -> Self {
            self.problem_type = Some(input);
            self
        }
        /// <p>The problem type.</p>
        pub fn set_problem_type(
            mut self,
            input: std::option::Option<crate::model::ProblemType>,
        ) -> Self {
            self.problem_type = input;
            self
        }
        /// <p>How long a job is allowed to run, or how many candidates a job is allowed to generate.</p>
        pub fn completion_criteria(
            mut self,
            input: crate::model::AutoMlJobCompletionCriteria,
        ) -> Self {
            self.completion_criteria = Some(input);
            self
        }
        /// <p>How long a job is allowed to run, or how many candidates a job is allowed to generate.</p>
        pub fn set_completion_criteria(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobCompletionCriteria>,
        ) -> Self {
            self.completion_criteria = input;
            self
        }
        /// Consumes the builder and constructs a [`ResolvedAttributes`](crate::model::ResolvedAttributes).
        pub fn build(self) -> crate::model::ResolvedAttributes {
            crate::model::ResolvedAttributes {
                auto_ml_job_objective: self.auto_ml_job_objective,
                problem_type: self.problem_type,
                completion_criteria: self.completion_criteria,
            }
        }
    }
}
impl ResolvedAttributes {
    /// Creates a new builder-style object to manufacture [`ResolvedAttributes`](crate::model::ResolvedAttributes).
    pub fn builder() -> crate::model::resolved_attributes::Builder {
        crate::model::resolved_attributes::Builder::default()
    }
}

/// <p>How long a job is allowed to run, or how many candidates a job is allowed to generate.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlJobCompletionCriteria {
    /// <p>The maximum number of times a training job is allowed to run.</p>
    #[doc(hidden)]
    pub max_candidates: std::option::Option<i32>,
    /// <p>The maximum time, in seconds, that each training job executed inside hyperparameter tuning is allowed to run as part of a hyperparameter tuning job. For more information, see the used by the action.</p>
    #[doc(hidden)]
    pub max_runtime_per_training_job_in_seconds: std::option::Option<i32>,
    /// <p>The maximum runtime, in seconds, an AutoML job has to complete.</p>
    /// <p>If an AutoML job exceeds the maximum runtime, the job is stopped automatically and its processing is ended gracefully. The AutoML job identifies the best model whose training was completed and marks it as the best-performing model. Any unfinished steps of the job, such as automatic one-click Autopilot model deployment, will not be completed. </p>
    #[doc(hidden)]
    pub max_auto_ml_job_runtime_in_seconds: std::option::Option<i32>,
}
impl AutoMlJobCompletionCriteria {
    /// <p>The maximum number of times a training job is allowed to run.</p>
    pub fn max_candidates(&self) -> std::option::Option<i32> {
        self.max_candidates
    }
    /// <p>The maximum time, in seconds, that each training job executed inside hyperparameter tuning is allowed to run as part of a hyperparameter tuning job. For more information, see the used by the action.</p>
    pub fn max_runtime_per_training_job_in_seconds(&self) -> std::option::Option<i32> {
        self.max_runtime_per_training_job_in_seconds
    }
    /// <p>The maximum runtime, in seconds, an AutoML job has to complete.</p>
    /// <p>If an AutoML job exceeds the maximum runtime, the job is stopped automatically and its processing is ended gracefully. The AutoML job identifies the best model whose training was completed and marks it as the best-performing model. Any unfinished steps of the job, such as automatic one-click Autopilot model deployment, will not be completed. </p>
    pub fn max_auto_ml_job_runtime_in_seconds(&self) -> std::option::Option<i32> {
        self.max_auto_ml_job_runtime_in_seconds
    }
}
/// See [`AutoMlJobCompletionCriteria`](crate::model::AutoMlJobCompletionCriteria).
pub mod auto_ml_job_completion_criteria {

    /// A builder for [`AutoMlJobCompletionCriteria`](crate::model::AutoMlJobCompletionCriteria).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) max_candidates: std::option::Option<i32>,
        pub(crate) max_runtime_per_training_job_in_seconds: std::option::Option<i32>,
        pub(crate) max_auto_ml_job_runtime_in_seconds: std::option::Option<i32>,
    }
    impl Builder {
        /// <p>The maximum number of times a training job is allowed to run.</p>
        pub fn max_candidates(mut self, input: i32) -> Self {
            self.max_candidates = Some(input);
            self
        }
        /// <p>The maximum number of times a training job is allowed to run.</p>
        pub fn set_max_candidates(mut self, input: std::option::Option<i32>) -> Self {
            self.max_candidates = input;
            self
        }
        /// <p>The maximum time, in seconds, that each training job executed inside hyperparameter tuning is allowed to run as part of a hyperparameter tuning job. For more information, see the used by the action.</p>
        pub fn max_runtime_per_training_job_in_seconds(mut self, input: i32) -> Self {
            self.max_runtime_per_training_job_in_seconds = Some(input);
            self
        }
        /// <p>The maximum time, in seconds, that each training job executed inside hyperparameter tuning is allowed to run as part of a hyperparameter tuning job. For more information, see the used by the action.</p>
        pub fn set_max_runtime_per_training_job_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.max_runtime_per_training_job_in_seconds = input;
            self
        }
        /// <p>The maximum runtime, in seconds, an AutoML job has to complete.</p>
        /// <p>If an AutoML job exceeds the maximum runtime, the job is stopped automatically and its processing is ended gracefully. The AutoML job identifies the best model whose training was completed and marks it as the best-performing model. Any unfinished steps of the job, such as automatic one-click Autopilot model deployment, will not be completed. </p>
        pub fn max_auto_ml_job_runtime_in_seconds(mut self, input: i32) -> Self {
            self.max_auto_ml_job_runtime_in_seconds = Some(input);
            self
        }
        /// <p>The maximum runtime, in seconds, an AutoML job has to complete.</p>
        /// <p>If an AutoML job exceeds the maximum runtime, the job is stopped automatically and its processing is ended gracefully. The AutoML job identifies the best model whose training was completed and marks it as the best-performing model. Any unfinished steps of the job, such as automatic one-click Autopilot model deployment, will not be completed. </p>
        pub fn set_max_auto_ml_job_runtime_in_seconds(
            mut self,
            input: std::option::Option<i32>,
        ) -> Self {
            self.max_auto_ml_job_runtime_in_seconds = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlJobCompletionCriteria`](crate::model::AutoMlJobCompletionCriteria).
        pub fn build(self) -> crate::model::AutoMlJobCompletionCriteria {
            crate::model::AutoMlJobCompletionCriteria {
                max_candidates: self.max_candidates,
                max_runtime_per_training_job_in_seconds: self
                    .max_runtime_per_training_job_in_seconds,
                max_auto_ml_job_runtime_in_seconds: self.max_auto_ml_job_runtime_in_seconds,
            }
        }
    }
}
impl AutoMlJobCompletionCriteria {
    /// Creates a new builder-style object to manufacture [`AutoMlJobCompletionCriteria`](crate::model::AutoMlJobCompletionCriteria).
    pub fn builder() -> crate::model::auto_ml_job_completion_criteria::Builder {
        crate::model::auto_ml_job_completion_criteria::Builder::default()
    }
}

/// When writing a match expression against `ProblemType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let problemtype = unimplemented!();
/// match problemtype {
///     ProblemType::BinaryClassification => { /* ... */ },
///     ProblemType::MulticlassClassification => { /* ... */ },
///     ProblemType::Regression => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `problemtype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ProblemType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ProblemType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ProblemType::NewFeature` is defined.
/// Specifically, when `problemtype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ProblemType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ProblemType {
    #[allow(missing_docs)] // documentation missing in model
    BinaryClassification,
    #[allow(missing_docs)] // documentation missing in model
    MulticlassClassification,
    #[allow(missing_docs)] // documentation missing in model
    Regression,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ProblemType {
    fn from(s: &str) -> Self {
        match s {
            "BinaryClassification" => ProblemType::BinaryClassification,
            "MulticlassClassification" => ProblemType::MulticlassClassification,
            "Regression" => ProblemType::Regression,
            other => ProblemType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ProblemType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ProblemType::from(s))
    }
}
impl ProblemType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ProblemType::BinaryClassification => "BinaryClassification",
            ProblemType::MulticlassClassification => "MulticlassClassification",
            ProblemType::Regression => "Regression",
            ProblemType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &[
            "BinaryClassification",
            "MulticlassClassification",
            "Regression",
        ]
    }
}
impl AsRef<str> for ProblemType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies a metric to minimize or maximize as the objective of a job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlJobObjective {
    /// <p>The name of the objective metric used to measure the predictive quality of a machine learning system. This metric is optimized during training to provide the best estimate for model parameter values from data.</p>
    /// <p>Here are the options:</p>
    /// <dl>
    /// <dt>
    /// Accuracy
    /// </dt>
    /// <dd>
    /// <p> The ratio of the number of correctly classified items to the total number of (correctly and incorrectly) classified items. It is used for both binary and multiclass classification. Accuracy measures how close the predicted class values are to the actual values. Values for accuracy metrics vary between zero (0) and one (1). A value of 1 indicates perfect accuracy, and 0 indicates perfect inaccuracy.</p>
    /// </dd>
    /// <dt>
    /// AUC
    /// </dt>
    /// <dd>
    /// <p>The area under the curve (AUC) metric is used to compare and evaluate binary classification by algorithms that return probabilities, such as logistic regression. To map the probabilities into classifications, these are compared against a threshold value. </p>
    /// <p>The relevant curve is the receiver operating characteristic curve (ROC curve). The ROC curve plots the true positive rate (TPR) of predictions (or recall) against the false positive rate (FPR) as a function of the threshold value, above which a prediction is considered positive. Increasing the threshold results in fewer false positives, but more false negatives. </p>
    /// <p>AUC is the area under this ROC curve. Therefore, AUC provides an aggregated measure of the model performance across all possible classification thresholds. AUC scores vary between 0 and 1. A score of 1 indicates perfect accuracy, and a score of one half (0.5) indicates that the prediction is not better than a random classifier. </p>
    /// </dd>
    /// <dt>
    /// BalancedAccuracy
    /// </dt>
    /// <dd>
    /// <p> <code>BalancedAccuracy</code> is a metric that measures the ratio of accurate predictions to all predictions. This ratio is calculated after normalizing true positives (TP) and true negatives (TN) by the total number of positive (P) and negative (N) values. It is used in both binary and multiclass classification and is defined as follows: 0.5*((TP/P)+(TN/N)), with values ranging from 0 to 1. <code>BalancedAccuracy</code> gives a better measure of accuracy when the number of positives or negatives differ greatly from each other in an imbalanced dataset. For example, when only 1% of email is spam. </p>
    /// </dd>
    /// <dt>
    /// F1
    /// </dt>
    /// <dd>
    /// <p>The <code>F1</code> score is the harmonic mean of the precision and recall, defined as follows: F1 = 2 * (precision * recall) / (precision + recall). It is used for binary classification into classes traditionally referred to as positive and negative. Predictions are said to be true when they match their actual (correct) class, and false when they do not. </p>
    /// <p>Precision is the ratio of the true positive predictions to all positive predictions, and it includes the false positives in a dataset. Precision measures the quality of the prediction when it predicts the positive class. </p>
    /// <p>Recall (or sensitivity) is the ratio of the true positive predictions to all actual positive instances. Recall measures how completely a model predicts the actual class members in a dataset. </p>
    /// <p>F1 scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
    /// </dd>
    /// <dt>
    /// F1macro
    /// </dt>
    /// <dd>
    /// <p>The <code>F1macro</code> score applies F1 scoring to multiclass classification problems. It does this by calculating the precision and recall, and then taking their harmonic mean to calculate the F1 score for each class. Lastly, the F1macro averages the individual scores to obtain the <code>F1macro</code> score. <code>F1macro</code> scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
    /// </dd>
    /// <dt>
    /// MAE
    /// </dt>
    /// <dd>
    /// <p>The mean absolute error (MAE) is a measure of how different the predicted and actual values are, when they're averaged over all values. MAE is commonly used in regression analysis to understand model prediction error. If there is linear regression, MAE represents the average distance from a predicted line to the actual value. MAE is defined as the sum of absolute errors divided by the number of observations. Values range from 0 to infinity, with smaller numbers indicating a better model fit to the data.</p>
    /// </dd>
    /// <dt>
    /// MSE
    /// </dt>
    /// <dd>
    /// <p>The mean squared error (MSE) is the average of the squared differences between the predicted and actual values. It is used for regression. MSE values are always positive. The better a model is at predicting the actual values, the smaller the MSE value is</p>
    /// </dd>
    /// <dt>
    /// Precision
    /// </dt>
    /// <dd>
    /// <p>Precision measures how well an algorithm predicts the true positives (TP) out of all of the positives that it identifies. It is defined as follows: Precision = TP/(TP+FP), with values ranging from zero (0) to one (1), and is used in binary classification. Precision is an important metric when the cost of a false positive is high. For example, the cost of a false positive is very high if an airplane safety system is falsely deemed safe to fly. A false positive (FP) reflects a positive prediction that is actually negative in the data.</p>
    /// </dd>
    /// <dt>
    /// PrecisionMacro
    /// </dt>
    /// <dd>
    /// <p>The precision macro computes precision for multiclass classification problems. It does this by calculating precision for each class and averaging scores to obtain precision for several classes. <code>PrecisionMacro</code> scores range from zero (0) to one (1). Higher scores reflect the model's ability to predict true positives (TP) out of all of the positives that it identifies, averaged across multiple classes.</p>
    /// </dd>
    /// <dt>
    /// R2
    /// </dt>
    /// <dd>
    /// <p>R2, also known as the coefficient of determination, is used in regression to quantify how much a model can explain the variance of a dependent variable. Values range from one (1) to negative one (-1). Higher numbers indicate a higher fraction of explained variability. <code>R2</code> values close to zero (0) indicate that very little of the dependent variable can be explained by the model. Negative values indicate a poor fit and that the model is outperformed by a constant function. For linear regression, this is a horizontal line.</p>
    /// </dd>
    /// <dt>
    /// Recall
    /// </dt>
    /// <dd>
    /// <p>Recall measures how well an algorithm correctly predicts all of the true positives (TP) in a dataset. A true positive is a positive prediction that is also an actual positive value in the data. Recall is defined as follows: Recall = TP/(TP+FN), with values ranging from 0 to 1. Higher scores reflect a better ability of the model to predict true positives (TP) in the data, and is used in binary classification. </p>
    /// <p>Recall is important when testing for cancer because it's used to find all of the true positives. A false positive (FP) reflects a positive prediction that is actually negative in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
    /// </dd>
    /// <dt>
    /// RecallMacro
    /// </dt>
    /// <dd>
    /// <p>The RecallMacro computes recall for multiclass classification problems by calculating recall for each class and averaging scores to obtain recall for several classes. RecallMacro scores range from 0 to 1. Higher scores reflect the model's ability to predict true positives (TP) in a dataset. Whereas, a true positive reflects a positive prediction that is also an actual positive value in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
    /// </dd>
    /// <dt>
    /// RMSE
    /// </dt>
    /// <dd>
    /// <p>Root mean squared error (RMSE) measures the square root of the squared difference between predicted and actual values, and it's averaged over all values. It is used in regression analysis to understand model prediction error. It's an important metric to indicate the presence of large model errors and outliers. Values range from zero (0) to infinity, with smaller numbers indicating a better model fit to the data. RMSE is dependent on scale, and should not be used to compare datasets of different sizes.</p>
    /// </dd>
    /// </dl>
    /// <p>If you do not specify a metric explicitly, the default behavior is to automatically use:</p>
    /// <ul>
    /// <li> <p> <code>MSE</code>: for regression.</p> </li>
    /// <li> <p> <code>F1</code>: for binary classification</p> </li>
    /// <li> <p> <code>Accuracy</code>: for multiclass classification.</p> </li>
    /// </ul>
    #[doc(hidden)]
    pub metric_name: std::option::Option<crate::model::AutoMlMetricEnum>,
}
impl AutoMlJobObjective {
    /// <p>The name of the objective metric used to measure the predictive quality of a machine learning system. This metric is optimized during training to provide the best estimate for model parameter values from data.</p>
    /// <p>Here are the options:</p>
    /// <dl>
    /// <dt>
    /// Accuracy
    /// </dt>
    /// <dd>
    /// <p> The ratio of the number of correctly classified items to the total number of (correctly and incorrectly) classified items. It is used for both binary and multiclass classification. Accuracy measures how close the predicted class values are to the actual values. Values for accuracy metrics vary between zero (0) and one (1). A value of 1 indicates perfect accuracy, and 0 indicates perfect inaccuracy.</p>
    /// </dd>
    /// <dt>
    /// AUC
    /// </dt>
    /// <dd>
    /// <p>The area under the curve (AUC) metric is used to compare and evaluate binary classification by algorithms that return probabilities, such as logistic regression. To map the probabilities into classifications, these are compared against a threshold value. </p>
    /// <p>The relevant curve is the receiver operating characteristic curve (ROC curve). The ROC curve plots the true positive rate (TPR) of predictions (or recall) against the false positive rate (FPR) as a function of the threshold value, above which a prediction is considered positive. Increasing the threshold results in fewer false positives, but more false negatives. </p>
    /// <p>AUC is the area under this ROC curve. Therefore, AUC provides an aggregated measure of the model performance across all possible classification thresholds. AUC scores vary between 0 and 1. A score of 1 indicates perfect accuracy, and a score of one half (0.5) indicates that the prediction is not better than a random classifier. </p>
    /// </dd>
    /// <dt>
    /// BalancedAccuracy
    /// </dt>
    /// <dd>
    /// <p> <code>BalancedAccuracy</code> is a metric that measures the ratio of accurate predictions to all predictions. This ratio is calculated after normalizing true positives (TP) and true negatives (TN) by the total number of positive (P) and negative (N) values. It is used in both binary and multiclass classification and is defined as follows: 0.5*((TP/P)+(TN/N)), with values ranging from 0 to 1. <code>BalancedAccuracy</code> gives a better measure of accuracy when the number of positives or negatives differ greatly from each other in an imbalanced dataset. For example, when only 1% of email is spam. </p>
    /// </dd>
    /// <dt>
    /// F1
    /// </dt>
    /// <dd>
    /// <p>The <code>F1</code> score is the harmonic mean of the precision and recall, defined as follows: F1 = 2 * (precision * recall) / (precision + recall). It is used for binary classification into classes traditionally referred to as positive and negative. Predictions are said to be true when they match their actual (correct) class, and false when they do not. </p>
    /// <p>Precision is the ratio of the true positive predictions to all positive predictions, and it includes the false positives in a dataset. Precision measures the quality of the prediction when it predicts the positive class. </p>
    /// <p>Recall (or sensitivity) is the ratio of the true positive predictions to all actual positive instances. Recall measures how completely a model predicts the actual class members in a dataset. </p>
    /// <p>F1 scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
    /// </dd>
    /// <dt>
    /// F1macro
    /// </dt>
    /// <dd>
    /// <p>The <code>F1macro</code> score applies F1 scoring to multiclass classification problems. It does this by calculating the precision and recall, and then taking their harmonic mean to calculate the F1 score for each class. Lastly, the F1macro averages the individual scores to obtain the <code>F1macro</code> score. <code>F1macro</code> scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
    /// </dd>
    /// <dt>
    /// MAE
    /// </dt>
    /// <dd>
    /// <p>The mean absolute error (MAE) is a measure of how different the predicted and actual values are, when they're averaged over all values. MAE is commonly used in regression analysis to understand model prediction error. If there is linear regression, MAE represents the average distance from a predicted line to the actual value. MAE is defined as the sum of absolute errors divided by the number of observations. Values range from 0 to infinity, with smaller numbers indicating a better model fit to the data.</p>
    /// </dd>
    /// <dt>
    /// MSE
    /// </dt>
    /// <dd>
    /// <p>The mean squared error (MSE) is the average of the squared differences between the predicted and actual values. It is used for regression. MSE values are always positive. The better a model is at predicting the actual values, the smaller the MSE value is</p>
    /// </dd>
    /// <dt>
    /// Precision
    /// </dt>
    /// <dd>
    /// <p>Precision measures how well an algorithm predicts the true positives (TP) out of all of the positives that it identifies. It is defined as follows: Precision = TP/(TP+FP), with values ranging from zero (0) to one (1), and is used in binary classification. Precision is an important metric when the cost of a false positive is high. For example, the cost of a false positive is very high if an airplane safety system is falsely deemed safe to fly. A false positive (FP) reflects a positive prediction that is actually negative in the data.</p>
    /// </dd>
    /// <dt>
    /// PrecisionMacro
    /// </dt>
    /// <dd>
    /// <p>The precision macro computes precision for multiclass classification problems. It does this by calculating precision for each class and averaging scores to obtain precision for several classes. <code>PrecisionMacro</code> scores range from zero (0) to one (1). Higher scores reflect the model's ability to predict true positives (TP) out of all of the positives that it identifies, averaged across multiple classes.</p>
    /// </dd>
    /// <dt>
    /// R2
    /// </dt>
    /// <dd>
    /// <p>R2, also known as the coefficient of determination, is used in regression to quantify how much a model can explain the variance of a dependent variable. Values range from one (1) to negative one (-1). Higher numbers indicate a higher fraction of explained variability. <code>R2</code> values close to zero (0) indicate that very little of the dependent variable can be explained by the model. Negative values indicate a poor fit and that the model is outperformed by a constant function. For linear regression, this is a horizontal line.</p>
    /// </dd>
    /// <dt>
    /// Recall
    /// </dt>
    /// <dd>
    /// <p>Recall measures how well an algorithm correctly predicts all of the true positives (TP) in a dataset. A true positive is a positive prediction that is also an actual positive value in the data. Recall is defined as follows: Recall = TP/(TP+FN), with values ranging from 0 to 1. Higher scores reflect a better ability of the model to predict true positives (TP) in the data, and is used in binary classification. </p>
    /// <p>Recall is important when testing for cancer because it's used to find all of the true positives. A false positive (FP) reflects a positive prediction that is actually negative in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
    /// </dd>
    /// <dt>
    /// RecallMacro
    /// </dt>
    /// <dd>
    /// <p>The RecallMacro computes recall for multiclass classification problems by calculating recall for each class and averaging scores to obtain recall for several classes. RecallMacro scores range from 0 to 1. Higher scores reflect the model's ability to predict true positives (TP) in a dataset. Whereas, a true positive reflects a positive prediction that is also an actual positive value in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
    /// </dd>
    /// <dt>
    /// RMSE
    /// </dt>
    /// <dd>
    /// <p>Root mean squared error (RMSE) measures the square root of the squared difference between predicted and actual values, and it's averaged over all values. It is used in regression analysis to understand model prediction error. It's an important metric to indicate the presence of large model errors and outliers. Values range from zero (0) to infinity, with smaller numbers indicating a better model fit to the data. RMSE is dependent on scale, and should not be used to compare datasets of different sizes.</p>
    /// </dd>
    /// </dl>
    /// <p>If you do not specify a metric explicitly, the default behavior is to automatically use:</p>
    /// <ul>
    /// <li> <p> <code>MSE</code>: for regression.</p> </li>
    /// <li> <p> <code>F1</code>: for binary classification</p> </li>
    /// <li> <p> <code>Accuracy</code>: for multiclass classification.</p> </li>
    /// </ul>
    pub fn metric_name(&self) -> std::option::Option<&crate::model::AutoMlMetricEnum> {
        self.metric_name.as_ref()
    }
}
/// See [`AutoMlJobObjective`](crate::model::AutoMlJobObjective).
pub mod auto_ml_job_objective {

    /// A builder for [`AutoMlJobObjective`](crate::model::AutoMlJobObjective).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) metric_name: std::option::Option<crate::model::AutoMlMetricEnum>,
    }
    impl Builder {
        /// <p>The name of the objective metric used to measure the predictive quality of a machine learning system. This metric is optimized during training to provide the best estimate for model parameter values from data.</p>
        /// <p>Here are the options:</p>
        /// <dl>
        /// <dt>
        /// Accuracy
        /// </dt>
        /// <dd>
        /// <p> The ratio of the number of correctly classified items to the total number of (correctly and incorrectly) classified items. It is used for both binary and multiclass classification. Accuracy measures how close the predicted class values are to the actual values. Values for accuracy metrics vary between zero (0) and one (1). A value of 1 indicates perfect accuracy, and 0 indicates perfect inaccuracy.</p>
        /// </dd>
        /// <dt>
        /// AUC
        /// </dt>
        /// <dd>
        /// <p>The area under the curve (AUC) metric is used to compare and evaluate binary classification by algorithms that return probabilities, such as logistic regression. To map the probabilities into classifications, these are compared against a threshold value. </p>
        /// <p>The relevant curve is the receiver operating characteristic curve (ROC curve). The ROC curve plots the true positive rate (TPR) of predictions (or recall) against the false positive rate (FPR) as a function of the threshold value, above which a prediction is considered positive. Increasing the threshold results in fewer false positives, but more false negatives. </p>
        /// <p>AUC is the area under this ROC curve. Therefore, AUC provides an aggregated measure of the model performance across all possible classification thresholds. AUC scores vary between 0 and 1. A score of 1 indicates perfect accuracy, and a score of one half (0.5) indicates that the prediction is not better than a random classifier. </p>
        /// </dd>
        /// <dt>
        /// BalancedAccuracy
        /// </dt>
        /// <dd>
        /// <p> <code>BalancedAccuracy</code> is a metric that measures the ratio of accurate predictions to all predictions. This ratio is calculated after normalizing true positives (TP) and true negatives (TN) by the total number of positive (P) and negative (N) values. It is used in both binary and multiclass classification and is defined as follows: 0.5*((TP/P)+(TN/N)), with values ranging from 0 to 1. <code>BalancedAccuracy</code> gives a better measure of accuracy when the number of positives or negatives differ greatly from each other in an imbalanced dataset. For example, when only 1% of email is spam. </p>
        /// </dd>
        /// <dt>
        /// F1
        /// </dt>
        /// <dd>
        /// <p>The <code>F1</code> score is the harmonic mean of the precision and recall, defined as follows: F1 = 2 * (precision * recall) / (precision + recall). It is used for binary classification into classes traditionally referred to as positive and negative. Predictions are said to be true when they match their actual (correct) class, and false when they do not. </p>
        /// <p>Precision is the ratio of the true positive predictions to all positive predictions, and it includes the false positives in a dataset. Precision measures the quality of the prediction when it predicts the positive class. </p>
        /// <p>Recall (or sensitivity) is the ratio of the true positive predictions to all actual positive instances. Recall measures how completely a model predicts the actual class members in a dataset. </p>
        /// <p>F1 scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
        /// </dd>
        /// <dt>
        /// F1macro
        /// </dt>
        /// <dd>
        /// <p>The <code>F1macro</code> score applies F1 scoring to multiclass classification problems. It does this by calculating the precision and recall, and then taking their harmonic mean to calculate the F1 score for each class. Lastly, the F1macro averages the individual scores to obtain the <code>F1macro</code> score. <code>F1macro</code> scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
        /// </dd>
        /// <dt>
        /// MAE
        /// </dt>
        /// <dd>
        /// <p>The mean absolute error (MAE) is a measure of how different the predicted and actual values are, when they're averaged over all values. MAE is commonly used in regression analysis to understand model prediction error. If there is linear regression, MAE represents the average distance from a predicted line to the actual value. MAE is defined as the sum of absolute errors divided by the number of observations. Values range from 0 to infinity, with smaller numbers indicating a better model fit to the data.</p>
        /// </dd>
        /// <dt>
        /// MSE
        /// </dt>
        /// <dd>
        /// <p>The mean squared error (MSE) is the average of the squared differences between the predicted and actual values. It is used for regression. MSE values are always positive. The better a model is at predicting the actual values, the smaller the MSE value is</p>
        /// </dd>
        /// <dt>
        /// Precision
        /// </dt>
        /// <dd>
        /// <p>Precision measures how well an algorithm predicts the true positives (TP) out of all of the positives that it identifies. It is defined as follows: Precision = TP/(TP+FP), with values ranging from zero (0) to one (1), and is used in binary classification. Precision is an important metric when the cost of a false positive is high. For example, the cost of a false positive is very high if an airplane safety system is falsely deemed safe to fly. A false positive (FP) reflects a positive prediction that is actually negative in the data.</p>
        /// </dd>
        /// <dt>
        /// PrecisionMacro
        /// </dt>
        /// <dd>
        /// <p>The precision macro computes precision for multiclass classification problems. It does this by calculating precision for each class and averaging scores to obtain precision for several classes. <code>PrecisionMacro</code> scores range from zero (0) to one (1). Higher scores reflect the model's ability to predict true positives (TP) out of all of the positives that it identifies, averaged across multiple classes.</p>
        /// </dd>
        /// <dt>
        /// R2
        /// </dt>
        /// <dd>
        /// <p>R2, also known as the coefficient of determination, is used in regression to quantify how much a model can explain the variance of a dependent variable. Values range from one (1) to negative one (-1). Higher numbers indicate a higher fraction of explained variability. <code>R2</code> values close to zero (0) indicate that very little of the dependent variable can be explained by the model. Negative values indicate a poor fit and that the model is outperformed by a constant function. For linear regression, this is a horizontal line.</p>
        /// </dd>
        /// <dt>
        /// Recall
        /// </dt>
        /// <dd>
        /// <p>Recall measures how well an algorithm correctly predicts all of the true positives (TP) in a dataset. A true positive is a positive prediction that is also an actual positive value in the data. Recall is defined as follows: Recall = TP/(TP+FN), with values ranging from 0 to 1. Higher scores reflect a better ability of the model to predict true positives (TP) in the data, and is used in binary classification. </p>
        /// <p>Recall is important when testing for cancer because it's used to find all of the true positives. A false positive (FP) reflects a positive prediction that is actually negative in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
        /// </dd>
        /// <dt>
        /// RecallMacro
        /// </dt>
        /// <dd>
        /// <p>The RecallMacro computes recall for multiclass classification problems by calculating recall for each class and averaging scores to obtain recall for several classes. RecallMacro scores range from 0 to 1. Higher scores reflect the model's ability to predict true positives (TP) in a dataset. Whereas, a true positive reflects a positive prediction that is also an actual positive value in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
        /// </dd>
        /// <dt>
        /// RMSE
        /// </dt>
        /// <dd>
        /// <p>Root mean squared error (RMSE) measures the square root of the squared difference between predicted and actual values, and it's averaged over all values. It is used in regression analysis to understand model prediction error. It's an important metric to indicate the presence of large model errors and outliers. Values range from zero (0) to infinity, with smaller numbers indicating a better model fit to the data. RMSE is dependent on scale, and should not be used to compare datasets of different sizes.</p>
        /// </dd>
        /// </dl>
        /// <p>If you do not specify a metric explicitly, the default behavior is to automatically use:</p>
        /// <ul>
        /// <li> <p> <code>MSE</code>: for regression.</p> </li>
        /// <li> <p> <code>F1</code>: for binary classification</p> </li>
        /// <li> <p> <code>Accuracy</code>: for multiclass classification.</p> </li>
        /// </ul>
        pub fn metric_name(mut self, input: crate::model::AutoMlMetricEnum) -> Self {
            self.metric_name = Some(input);
            self
        }
        /// <p>The name of the objective metric used to measure the predictive quality of a machine learning system. This metric is optimized during training to provide the best estimate for model parameter values from data.</p>
        /// <p>Here are the options:</p>
        /// <dl>
        /// <dt>
        /// Accuracy
        /// </dt>
        /// <dd>
        /// <p> The ratio of the number of correctly classified items to the total number of (correctly and incorrectly) classified items. It is used for both binary and multiclass classification. Accuracy measures how close the predicted class values are to the actual values. Values for accuracy metrics vary between zero (0) and one (1). A value of 1 indicates perfect accuracy, and 0 indicates perfect inaccuracy.</p>
        /// </dd>
        /// <dt>
        /// AUC
        /// </dt>
        /// <dd>
        /// <p>The area under the curve (AUC) metric is used to compare and evaluate binary classification by algorithms that return probabilities, such as logistic regression. To map the probabilities into classifications, these are compared against a threshold value. </p>
        /// <p>The relevant curve is the receiver operating characteristic curve (ROC curve). The ROC curve plots the true positive rate (TPR) of predictions (or recall) against the false positive rate (FPR) as a function of the threshold value, above which a prediction is considered positive. Increasing the threshold results in fewer false positives, but more false negatives. </p>
        /// <p>AUC is the area under this ROC curve. Therefore, AUC provides an aggregated measure of the model performance across all possible classification thresholds. AUC scores vary between 0 and 1. A score of 1 indicates perfect accuracy, and a score of one half (0.5) indicates that the prediction is not better than a random classifier. </p>
        /// </dd>
        /// <dt>
        /// BalancedAccuracy
        /// </dt>
        /// <dd>
        /// <p> <code>BalancedAccuracy</code> is a metric that measures the ratio of accurate predictions to all predictions. This ratio is calculated after normalizing true positives (TP) and true negatives (TN) by the total number of positive (P) and negative (N) values. It is used in both binary and multiclass classification and is defined as follows: 0.5*((TP/P)+(TN/N)), with values ranging from 0 to 1. <code>BalancedAccuracy</code> gives a better measure of accuracy when the number of positives or negatives differ greatly from each other in an imbalanced dataset. For example, when only 1% of email is spam. </p>
        /// </dd>
        /// <dt>
        /// F1
        /// </dt>
        /// <dd>
        /// <p>The <code>F1</code> score is the harmonic mean of the precision and recall, defined as follows: F1 = 2 * (precision * recall) / (precision + recall). It is used for binary classification into classes traditionally referred to as positive and negative. Predictions are said to be true when they match their actual (correct) class, and false when they do not. </p>
        /// <p>Precision is the ratio of the true positive predictions to all positive predictions, and it includes the false positives in a dataset. Precision measures the quality of the prediction when it predicts the positive class. </p>
        /// <p>Recall (or sensitivity) is the ratio of the true positive predictions to all actual positive instances. Recall measures how completely a model predicts the actual class members in a dataset. </p>
        /// <p>F1 scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
        /// </dd>
        /// <dt>
        /// F1macro
        /// </dt>
        /// <dd>
        /// <p>The <code>F1macro</code> score applies F1 scoring to multiclass classification problems. It does this by calculating the precision and recall, and then taking their harmonic mean to calculate the F1 score for each class. Lastly, the F1macro averages the individual scores to obtain the <code>F1macro</code> score. <code>F1macro</code> scores vary between 0 and 1. A score of 1 indicates the best possible performance, and 0 indicates the worst.</p>
        /// </dd>
        /// <dt>
        /// MAE
        /// </dt>
        /// <dd>
        /// <p>The mean absolute error (MAE) is a measure of how different the predicted and actual values are, when they're averaged over all values. MAE is commonly used in regression analysis to understand model prediction error. If there is linear regression, MAE represents the average distance from a predicted line to the actual value. MAE is defined as the sum of absolute errors divided by the number of observations. Values range from 0 to infinity, with smaller numbers indicating a better model fit to the data.</p>
        /// </dd>
        /// <dt>
        /// MSE
        /// </dt>
        /// <dd>
        /// <p>The mean squared error (MSE) is the average of the squared differences between the predicted and actual values. It is used for regression. MSE values are always positive. The better a model is at predicting the actual values, the smaller the MSE value is</p>
        /// </dd>
        /// <dt>
        /// Precision
        /// </dt>
        /// <dd>
        /// <p>Precision measures how well an algorithm predicts the true positives (TP) out of all of the positives that it identifies. It is defined as follows: Precision = TP/(TP+FP), with values ranging from zero (0) to one (1), and is used in binary classification. Precision is an important metric when the cost of a false positive is high. For example, the cost of a false positive is very high if an airplane safety system is falsely deemed safe to fly. A false positive (FP) reflects a positive prediction that is actually negative in the data.</p>
        /// </dd>
        /// <dt>
        /// PrecisionMacro
        /// </dt>
        /// <dd>
        /// <p>The precision macro computes precision for multiclass classification problems. It does this by calculating precision for each class and averaging scores to obtain precision for several classes. <code>PrecisionMacro</code> scores range from zero (0) to one (1). Higher scores reflect the model's ability to predict true positives (TP) out of all of the positives that it identifies, averaged across multiple classes.</p>
        /// </dd>
        /// <dt>
        /// R2
        /// </dt>
        /// <dd>
        /// <p>R2, also known as the coefficient of determination, is used in regression to quantify how much a model can explain the variance of a dependent variable. Values range from one (1) to negative one (-1). Higher numbers indicate a higher fraction of explained variability. <code>R2</code> values close to zero (0) indicate that very little of the dependent variable can be explained by the model. Negative values indicate a poor fit and that the model is outperformed by a constant function. For linear regression, this is a horizontal line.</p>
        /// </dd>
        /// <dt>
        /// Recall
        /// </dt>
        /// <dd>
        /// <p>Recall measures how well an algorithm correctly predicts all of the true positives (TP) in a dataset. A true positive is a positive prediction that is also an actual positive value in the data. Recall is defined as follows: Recall = TP/(TP+FN), with values ranging from 0 to 1. Higher scores reflect a better ability of the model to predict true positives (TP) in the data, and is used in binary classification. </p>
        /// <p>Recall is important when testing for cancer because it's used to find all of the true positives. A false positive (FP) reflects a positive prediction that is actually negative in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
        /// </dd>
        /// <dt>
        /// RecallMacro
        /// </dt>
        /// <dd>
        /// <p>The RecallMacro computes recall for multiclass classification problems by calculating recall for each class and averaging scores to obtain recall for several classes. RecallMacro scores range from 0 to 1. Higher scores reflect the model's ability to predict true positives (TP) in a dataset. Whereas, a true positive reflects a positive prediction that is also an actual positive value in the data. It is often insufficient to measure only recall, because predicting every output as a true positive will yield a perfect recall score.</p>
        /// </dd>
        /// <dt>
        /// RMSE
        /// </dt>
        /// <dd>
        /// <p>Root mean squared error (RMSE) measures the square root of the squared difference between predicted and actual values, and it's averaged over all values. It is used in regression analysis to understand model prediction error. It's an important metric to indicate the presence of large model errors and outliers. Values range from zero (0) to infinity, with smaller numbers indicating a better model fit to the data. RMSE is dependent on scale, and should not be used to compare datasets of different sizes.</p>
        /// </dd>
        /// </dl>
        /// <p>If you do not specify a metric explicitly, the default behavior is to automatically use:</p>
        /// <ul>
        /// <li> <p> <code>MSE</code>: for regression.</p> </li>
        /// <li> <p> <code>F1</code>: for binary classification</p> </li>
        /// <li> <p> <code>Accuracy</code>: for multiclass classification.</p> </li>
        /// </ul>
        pub fn set_metric_name(
            mut self,
            input: std::option::Option<crate::model::AutoMlMetricEnum>,
        ) -> Self {
            self.metric_name = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlJobObjective`](crate::model::AutoMlJobObjective).
        pub fn build(self) -> crate::model::AutoMlJobObjective {
            crate::model::AutoMlJobObjective {
                metric_name: self.metric_name,
            }
        }
    }
}
impl AutoMlJobObjective {
    /// Creates a new builder-style object to manufacture [`AutoMlJobObjective`](crate::model::AutoMlJobObjective).
    pub fn builder() -> crate::model::auto_ml_job_objective::Builder {
        crate::model::auto_ml_job_objective::Builder::default()
    }
}

/// <p>The artifacts that are generated during an AutoML job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlJobArtifacts {
    /// <p>The URL of the notebook location.</p>
    #[doc(hidden)]
    pub candidate_definition_notebook_location: std::option::Option<std::string::String>,
    /// <p>The URL of the notebook location.</p>
    #[doc(hidden)]
    pub data_exploration_notebook_location: std::option::Option<std::string::String>,
}
impl AutoMlJobArtifacts {
    /// <p>The URL of the notebook location.</p>
    pub fn candidate_definition_notebook_location(&self) -> std::option::Option<&str> {
        self.candidate_definition_notebook_location.as_deref()
    }
    /// <p>The URL of the notebook location.</p>
    pub fn data_exploration_notebook_location(&self) -> std::option::Option<&str> {
        self.data_exploration_notebook_location.as_deref()
    }
}
/// See [`AutoMlJobArtifacts`](crate::model::AutoMlJobArtifacts).
pub mod auto_ml_job_artifacts {

    /// A builder for [`AutoMlJobArtifacts`](crate::model::AutoMlJobArtifacts).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) candidate_definition_notebook_location: std::option::Option<std::string::String>,
        pub(crate) data_exploration_notebook_location: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The URL of the notebook location.</p>
        pub fn candidate_definition_notebook_location(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.candidate_definition_notebook_location = Some(input.into());
            self
        }
        /// <p>The URL of the notebook location.</p>
        pub fn set_candidate_definition_notebook_location(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.candidate_definition_notebook_location = input;
            self
        }
        /// <p>The URL of the notebook location.</p>
        pub fn data_exploration_notebook_location(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.data_exploration_notebook_location = Some(input.into());
            self
        }
        /// <p>The URL of the notebook location.</p>
        pub fn set_data_exploration_notebook_location(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.data_exploration_notebook_location = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlJobArtifacts`](crate::model::AutoMlJobArtifacts).
        pub fn build(self) -> crate::model::AutoMlJobArtifacts {
            crate::model::AutoMlJobArtifacts {
                candidate_definition_notebook_location: self.candidate_definition_notebook_location,
                data_exploration_notebook_location: self.data_exploration_notebook_location,
            }
        }
    }
}
impl AutoMlJobArtifacts {
    /// Creates a new builder-style object to manufacture [`AutoMlJobArtifacts`](crate::model::AutoMlJobArtifacts).
    pub fn builder() -> crate::model::auto_ml_job_artifacts::Builder {
        crate::model::auto_ml_job_artifacts::Builder::default()
    }
}

/// <p>A collection of settings used for an AutoML job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlJobConfig {
    /// <p>How long an AutoML job is allowed to run, or how many candidates a job is allowed to generate.</p>
    #[doc(hidden)]
    pub completion_criteria: std::option::Option<crate::model::AutoMlJobCompletionCriteria>,
    /// <p>The security configuration for traffic encryption or Amazon VPC settings.</p>
    #[doc(hidden)]
    pub security_config: std::option::Option<crate::model::AutoMlSecurityConfig>,
    /// <p>The configuration for splitting the input training dataset.</p>
    /// <p>Type: AutoMLDataSplitConfig</p>
    #[doc(hidden)]
    pub data_split_config: std::option::Option<crate::model::AutoMlDataSplitConfig>,
    /// <p>The configuration for generating a candidate for an AutoML job (optional). </p>
    #[doc(hidden)]
    pub candidate_generation_config:
        std::option::Option<crate::model::AutoMlCandidateGenerationConfig>,
    /// <p>The method that Autopilot uses to train the data. You can either specify the mode manually or let Autopilot choose for you based on the dataset size by selecting <code>AUTO</code>. In <code>AUTO</code> mode, Autopilot chooses <code>ENSEMBLING</code> for datasets smaller than 100 MB, and <code>HYPERPARAMETER_TUNING</code> for larger ones.</p>
    /// <p>The <code>ENSEMBLING</code> mode uses a multi-stack ensemble model to predict classification and regression tasks directly from your dataset. This machine learning mode combines several base models to produce an optimal predictive model. It then uses a stacking ensemble method to combine predictions from contributing members. A multi-stack ensemble model can provide better performance over a single model by combining the predictive capabilities of multiple models. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>ENSEMBLING</code> mode.</p>
    /// <p>The <code>HYPERPARAMETER_TUNING</code> (HPO) mode uses the best hyperparameters to train the best version of a model. HPO will automatically select an algorithm for the type of problem you want to solve. Then HPO finds the best hyperparameters according to your objective metric. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>HYPERPARAMETER_TUNING</code> mode.</p>
    #[doc(hidden)]
    pub mode: std::option::Option<crate::model::AutoMlMode>,
}
impl AutoMlJobConfig {
    /// <p>How long an AutoML job is allowed to run, or how many candidates a job is allowed to generate.</p>
    pub fn completion_criteria(
        &self,
    ) -> std::option::Option<&crate::model::AutoMlJobCompletionCriteria> {
        self.completion_criteria.as_ref()
    }
    /// <p>The security configuration for traffic encryption or Amazon VPC settings.</p>
    pub fn security_config(&self) -> std::option::Option<&crate::model::AutoMlSecurityConfig> {
        self.security_config.as_ref()
    }
    /// <p>The configuration for splitting the input training dataset.</p>
    /// <p>Type: AutoMLDataSplitConfig</p>
    pub fn data_split_config(&self) -> std::option::Option<&crate::model::AutoMlDataSplitConfig> {
        self.data_split_config.as_ref()
    }
    /// <p>The configuration for generating a candidate for an AutoML job (optional). </p>
    pub fn candidate_generation_config(
        &self,
    ) -> std::option::Option<&crate::model::AutoMlCandidateGenerationConfig> {
        self.candidate_generation_config.as_ref()
    }
    /// <p>The method that Autopilot uses to train the data. You can either specify the mode manually or let Autopilot choose for you based on the dataset size by selecting <code>AUTO</code>. In <code>AUTO</code> mode, Autopilot chooses <code>ENSEMBLING</code> for datasets smaller than 100 MB, and <code>HYPERPARAMETER_TUNING</code> for larger ones.</p>
    /// <p>The <code>ENSEMBLING</code> mode uses a multi-stack ensemble model to predict classification and regression tasks directly from your dataset. This machine learning mode combines several base models to produce an optimal predictive model. It then uses a stacking ensemble method to combine predictions from contributing members. A multi-stack ensemble model can provide better performance over a single model by combining the predictive capabilities of multiple models. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>ENSEMBLING</code> mode.</p>
    /// <p>The <code>HYPERPARAMETER_TUNING</code> (HPO) mode uses the best hyperparameters to train the best version of a model. HPO will automatically select an algorithm for the type of problem you want to solve. Then HPO finds the best hyperparameters according to your objective metric. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>HYPERPARAMETER_TUNING</code> mode.</p>
    pub fn mode(&self) -> std::option::Option<&crate::model::AutoMlMode> {
        self.mode.as_ref()
    }
}
/// See [`AutoMlJobConfig`](crate::model::AutoMlJobConfig).
pub mod auto_ml_job_config {

    /// A builder for [`AutoMlJobConfig`](crate::model::AutoMlJobConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) completion_criteria:
            std::option::Option<crate::model::AutoMlJobCompletionCriteria>,
        pub(crate) security_config: std::option::Option<crate::model::AutoMlSecurityConfig>,
        pub(crate) data_split_config: std::option::Option<crate::model::AutoMlDataSplitConfig>,
        pub(crate) candidate_generation_config:
            std::option::Option<crate::model::AutoMlCandidateGenerationConfig>,
        pub(crate) mode: std::option::Option<crate::model::AutoMlMode>,
    }
    impl Builder {
        /// <p>How long an AutoML job is allowed to run, or how many candidates a job is allowed to generate.</p>
        pub fn completion_criteria(
            mut self,
            input: crate::model::AutoMlJobCompletionCriteria,
        ) -> Self {
            self.completion_criteria = Some(input);
            self
        }
        /// <p>How long an AutoML job is allowed to run, or how many candidates a job is allowed to generate.</p>
        pub fn set_completion_criteria(
            mut self,
            input: std::option::Option<crate::model::AutoMlJobCompletionCriteria>,
        ) -> Self {
            self.completion_criteria = input;
            self
        }
        /// <p>The security configuration for traffic encryption or Amazon VPC settings.</p>
        pub fn security_config(mut self, input: crate::model::AutoMlSecurityConfig) -> Self {
            self.security_config = Some(input);
            self
        }
        /// <p>The security configuration for traffic encryption or Amazon VPC settings.</p>
        pub fn set_security_config(
            mut self,
            input: std::option::Option<crate::model::AutoMlSecurityConfig>,
        ) -> Self {
            self.security_config = input;
            self
        }
        /// <p>The configuration for splitting the input training dataset.</p>
        /// <p>Type: AutoMLDataSplitConfig</p>
        pub fn data_split_config(mut self, input: crate::model::AutoMlDataSplitConfig) -> Self {
            self.data_split_config = Some(input);
            self
        }
        /// <p>The configuration for splitting the input training dataset.</p>
        /// <p>Type: AutoMLDataSplitConfig</p>
        pub fn set_data_split_config(
            mut self,
            input: std::option::Option<crate::model::AutoMlDataSplitConfig>,
        ) -> Self {
            self.data_split_config = input;
            self
        }
        /// <p>The configuration for generating a candidate for an AutoML job (optional). </p>
        pub fn candidate_generation_config(
            mut self,
            input: crate::model::AutoMlCandidateGenerationConfig,
        ) -> Self {
            self.candidate_generation_config = Some(input);
            self
        }
        /// <p>The configuration for generating a candidate for an AutoML job (optional). </p>
        pub fn set_candidate_generation_config(
            mut self,
            input: std::option::Option<crate::model::AutoMlCandidateGenerationConfig>,
        ) -> Self {
            self.candidate_generation_config = input;
            self
        }
        /// <p>The method that Autopilot uses to train the data. You can either specify the mode manually or let Autopilot choose for you based on the dataset size by selecting <code>AUTO</code>. In <code>AUTO</code> mode, Autopilot chooses <code>ENSEMBLING</code> for datasets smaller than 100 MB, and <code>HYPERPARAMETER_TUNING</code> for larger ones.</p>
        /// <p>The <code>ENSEMBLING</code> mode uses a multi-stack ensemble model to predict classification and regression tasks directly from your dataset. This machine learning mode combines several base models to produce an optimal predictive model. It then uses a stacking ensemble method to combine predictions from contributing members. A multi-stack ensemble model can provide better performance over a single model by combining the predictive capabilities of multiple models. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>ENSEMBLING</code> mode.</p>
        /// <p>The <code>HYPERPARAMETER_TUNING</code> (HPO) mode uses the best hyperparameters to train the best version of a model. HPO will automatically select an algorithm for the type of problem you want to solve. Then HPO finds the best hyperparameters according to your objective metric. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>HYPERPARAMETER_TUNING</code> mode.</p>
        pub fn mode(mut self, input: crate::model::AutoMlMode) -> Self {
            self.mode = Some(input);
            self
        }
        /// <p>The method that Autopilot uses to train the data. You can either specify the mode manually or let Autopilot choose for you based on the dataset size by selecting <code>AUTO</code>. In <code>AUTO</code> mode, Autopilot chooses <code>ENSEMBLING</code> for datasets smaller than 100 MB, and <code>HYPERPARAMETER_TUNING</code> for larger ones.</p>
        /// <p>The <code>ENSEMBLING</code> mode uses a multi-stack ensemble model to predict classification and regression tasks directly from your dataset. This machine learning mode combines several base models to produce an optimal predictive model. It then uses a stacking ensemble method to combine predictions from contributing members. A multi-stack ensemble model can provide better performance over a single model by combining the predictive capabilities of multiple models. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>ENSEMBLING</code> mode.</p>
        /// <p>The <code>HYPERPARAMETER_TUNING</code> (HPO) mode uses the best hyperparameters to train the best version of a model. HPO will automatically select an algorithm for the type of problem you want to solve. Then HPO finds the best hyperparameters according to your objective metric. See <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-algorithm-suppprt">Autopilot algorithm support</a> for a list of algorithms supported by <code>HYPERPARAMETER_TUNING</code> mode.</p>
        pub fn set_mode(mut self, input: std::option::Option<crate::model::AutoMlMode>) -> Self {
            self.mode = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlJobConfig`](crate::model::AutoMlJobConfig).
        pub fn build(self) -> crate::model::AutoMlJobConfig {
            crate::model::AutoMlJobConfig {
                completion_criteria: self.completion_criteria,
                security_config: self.security_config,
                data_split_config: self.data_split_config,
                candidate_generation_config: self.candidate_generation_config,
                mode: self.mode,
            }
        }
    }
}
impl AutoMlJobConfig {
    /// Creates a new builder-style object to manufacture [`AutoMlJobConfig`](crate::model::AutoMlJobConfig).
    pub fn builder() -> crate::model::auto_ml_job_config::Builder {
        crate::model::auto_ml_job_config::Builder::default()
    }
}

/// When writing a match expression against `AutoMlMode`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automlmode = unimplemented!();
/// match automlmode {
///     AutoMlMode::Auto => { /* ... */ },
///     AutoMlMode::Ensembling => { /* ... */ },
///     AutoMlMode::HyperparameterTuning => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automlmode` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlMode::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlMode::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlMode::NewFeature` is defined.
/// Specifically, when `automlmode` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlMode::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlMode {
    #[allow(missing_docs)] // documentation missing in model
    Auto,
    #[allow(missing_docs)] // documentation missing in model
    Ensembling,
    #[allow(missing_docs)] // documentation missing in model
    HyperparameterTuning,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlMode {
    fn from(s: &str) -> Self {
        match s {
            "AUTO" => AutoMlMode::Auto,
            "ENSEMBLING" => AutoMlMode::Ensembling,
            "HYPERPARAMETER_TUNING" => AutoMlMode::HyperparameterTuning,
            other => AutoMlMode::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AutoMlMode {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlMode::from(s))
    }
}
impl AutoMlMode {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlMode::Auto => "AUTO",
            AutoMlMode::Ensembling => "ENSEMBLING",
            AutoMlMode::HyperparameterTuning => "HYPERPARAMETER_TUNING",
            AutoMlMode::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["AUTO", "ENSEMBLING", "HYPERPARAMETER_TUNING"]
    }
}
impl AsRef<str> for AutoMlMode {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Stores the config information for how a candidate is generated (optional).</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlCandidateGenerationConfig {
    /// <p>A URL to the Amazon S3 data source containing selected features from the input data source to run an Autopilot job. You can input <code>FeatureAttributeNames</code> (optional) in JSON format as shown below: </p>
    /// <p> <code>{ "FeatureAttributeNames":["col1", "col2", ...] }</code>.</p>
    /// <p>You can also specify the data type of the feature (optional) in the format shown below:</p>
    /// <p> <code>{ "FeatureDataTypes":{"col1":"numeric", "col2":"categorical" ... } }</code> </p> <note>
    /// <p>These column keys may not include the target column.</p>
    /// </note>
    /// <p>In ensembling mode, Autopilot will only support the following data types: <code>numeric</code>, <code>categorical</code>, <code>text</code> and <code>datetime</code>. In HPO mode, Autopilot can support <code>numeric</code>, <code>categorical</code>, <code>text</code>, <code>datetime</code> and <code>sequence</code>.</p>
    /// <p>If only <code>FeatureDataTypes</code> is provided, the column keys (<code>col1</code>, <code>col2</code>,..) should be a subset of the column names in the input data. </p>
    /// <p>If both <code>FeatureDataTypes</code> and <code>FeatureAttributeNames</code> are provided, then the column keys should be a subset of the column names provided in <code>FeatureAttributeNames</code>. </p>
    /// <p>The key name <code>FeatureAttributeNames</code> is fixed. The values listed in <code>["col1", "col2", ...]</code> is case sensitive and should be a list of strings containing unique values that are a subset of the column names in the input data. The list of columns provided must not include the target column.</p>
    #[doc(hidden)]
    pub feature_specification_s3_uri: std::option::Option<std::string::String>,
}
impl AutoMlCandidateGenerationConfig {
    /// <p>A URL to the Amazon S3 data source containing selected features from the input data source to run an Autopilot job. You can input <code>FeatureAttributeNames</code> (optional) in JSON format as shown below: </p>
    /// <p> <code>{ "FeatureAttributeNames":["col1", "col2", ...] }</code>.</p>
    /// <p>You can also specify the data type of the feature (optional) in the format shown below:</p>
    /// <p> <code>{ "FeatureDataTypes":{"col1":"numeric", "col2":"categorical" ... } }</code> </p> <note>
    /// <p>These column keys may not include the target column.</p>
    /// </note>
    /// <p>In ensembling mode, Autopilot will only support the following data types: <code>numeric</code>, <code>categorical</code>, <code>text</code> and <code>datetime</code>. In HPO mode, Autopilot can support <code>numeric</code>, <code>categorical</code>, <code>text</code>, <code>datetime</code> and <code>sequence</code>.</p>
    /// <p>If only <code>FeatureDataTypes</code> is provided, the column keys (<code>col1</code>, <code>col2</code>,..) should be a subset of the column names in the input data. </p>
    /// <p>If both <code>FeatureDataTypes</code> and <code>FeatureAttributeNames</code> are provided, then the column keys should be a subset of the column names provided in <code>FeatureAttributeNames</code>. </p>
    /// <p>The key name <code>FeatureAttributeNames</code> is fixed. The values listed in <code>["col1", "col2", ...]</code> is case sensitive and should be a list of strings containing unique values that are a subset of the column names in the input data. The list of columns provided must not include the target column.</p>
    pub fn feature_specification_s3_uri(&self) -> std::option::Option<&str> {
        self.feature_specification_s3_uri.as_deref()
    }
}
/// See [`AutoMlCandidateGenerationConfig`](crate::model::AutoMlCandidateGenerationConfig).
pub mod auto_ml_candidate_generation_config {

    /// A builder for [`AutoMlCandidateGenerationConfig`](crate::model::AutoMlCandidateGenerationConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) feature_specification_s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>A URL to the Amazon S3 data source containing selected features from the input data source to run an Autopilot job. You can input <code>FeatureAttributeNames</code> (optional) in JSON format as shown below: </p>
        /// <p> <code>{ "FeatureAttributeNames":["col1", "col2", ...] }</code>.</p>
        /// <p>You can also specify the data type of the feature (optional) in the format shown below:</p>
        /// <p> <code>{ "FeatureDataTypes":{"col1":"numeric", "col2":"categorical" ... } }</code> </p> <note>
        /// <p>These column keys may not include the target column.</p>
        /// </note>
        /// <p>In ensembling mode, Autopilot will only support the following data types: <code>numeric</code>, <code>categorical</code>, <code>text</code> and <code>datetime</code>. In HPO mode, Autopilot can support <code>numeric</code>, <code>categorical</code>, <code>text</code>, <code>datetime</code> and <code>sequence</code>.</p>
        /// <p>If only <code>FeatureDataTypes</code> is provided, the column keys (<code>col1</code>, <code>col2</code>,..) should be a subset of the column names in the input data. </p>
        /// <p>If both <code>FeatureDataTypes</code> and <code>FeatureAttributeNames</code> are provided, then the column keys should be a subset of the column names provided in <code>FeatureAttributeNames</code>. </p>
        /// <p>The key name <code>FeatureAttributeNames</code> is fixed. The values listed in <code>["col1", "col2", ...]</code> is case sensitive and should be a list of strings containing unique values that are a subset of the column names in the input data. The list of columns provided must not include the target column.</p>
        pub fn feature_specification_s3_uri(
            mut self,
            input: impl Into<std::string::String>,
        ) -> Self {
            self.feature_specification_s3_uri = Some(input.into());
            self
        }
        /// <p>A URL to the Amazon S3 data source containing selected features from the input data source to run an Autopilot job. You can input <code>FeatureAttributeNames</code> (optional) in JSON format as shown below: </p>
        /// <p> <code>{ "FeatureAttributeNames":["col1", "col2", ...] }</code>.</p>
        /// <p>You can also specify the data type of the feature (optional) in the format shown below:</p>
        /// <p> <code>{ "FeatureDataTypes":{"col1":"numeric", "col2":"categorical" ... } }</code> </p> <note>
        /// <p>These column keys may not include the target column.</p>
        /// </note>
        /// <p>In ensembling mode, Autopilot will only support the following data types: <code>numeric</code>, <code>categorical</code>, <code>text</code> and <code>datetime</code>. In HPO mode, Autopilot can support <code>numeric</code>, <code>categorical</code>, <code>text</code>, <code>datetime</code> and <code>sequence</code>.</p>
        /// <p>If only <code>FeatureDataTypes</code> is provided, the column keys (<code>col1</code>, <code>col2</code>,..) should be a subset of the column names in the input data. </p>
        /// <p>If both <code>FeatureDataTypes</code> and <code>FeatureAttributeNames</code> are provided, then the column keys should be a subset of the column names provided in <code>FeatureAttributeNames</code>. </p>
        /// <p>The key name <code>FeatureAttributeNames</code> is fixed. The values listed in <code>["col1", "col2", ...]</code> is case sensitive and should be a list of strings containing unique values that are a subset of the column names in the input data. The list of columns provided must not include the target column.</p>
        pub fn set_feature_specification_s3_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.feature_specification_s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlCandidateGenerationConfig`](crate::model::AutoMlCandidateGenerationConfig).
        pub fn build(self) -> crate::model::AutoMlCandidateGenerationConfig {
            crate::model::AutoMlCandidateGenerationConfig {
                feature_specification_s3_uri: self.feature_specification_s3_uri,
            }
        }
    }
}
impl AutoMlCandidateGenerationConfig {
    /// Creates a new builder-style object to manufacture [`AutoMlCandidateGenerationConfig`](crate::model::AutoMlCandidateGenerationConfig).
    pub fn builder() -> crate::model::auto_ml_candidate_generation_config::Builder {
        crate::model::auto_ml_candidate_generation_config::Builder::default()
    }
}

/// <p>This structure specifies how to split the data into train and validation datasets. The validation and training datasets must contain the same headers. The validation dataset must be less than 2 GB in size.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlDataSplitConfig {
    /// <p>The validation fraction (optional) is a float that specifies the portion of the training dataset to be used for validation. The default value is 0.2, and values must be greater than 0 and less than 1. We recommend setting this value to be less than 0.5.</p>
    #[doc(hidden)]
    pub validation_fraction: std::option::Option<f32>,
}
impl AutoMlDataSplitConfig {
    /// <p>The validation fraction (optional) is a float that specifies the portion of the training dataset to be used for validation. The default value is 0.2, and values must be greater than 0 and less than 1. We recommend setting this value to be less than 0.5.</p>
    pub fn validation_fraction(&self) -> std::option::Option<f32> {
        self.validation_fraction
    }
}
/// See [`AutoMlDataSplitConfig`](crate::model::AutoMlDataSplitConfig).
pub mod auto_ml_data_split_config {

    /// A builder for [`AutoMlDataSplitConfig`](crate::model::AutoMlDataSplitConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) validation_fraction: std::option::Option<f32>,
    }
    impl Builder {
        /// <p>The validation fraction (optional) is a float that specifies the portion of the training dataset to be used for validation. The default value is 0.2, and values must be greater than 0 and less than 1. We recommend setting this value to be less than 0.5.</p>
        pub fn validation_fraction(mut self, input: f32) -> Self {
            self.validation_fraction = Some(input);
            self
        }
        /// <p>The validation fraction (optional) is a float that specifies the portion of the training dataset to be used for validation. The default value is 0.2, and values must be greater than 0 and less than 1. We recommend setting this value to be less than 0.5.</p>
        pub fn set_validation_fraction(mut self, input: std::option::Option<f32>) -> Self {
            self.validation_fraction = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlDataSplitConfig`](crate::model::AutoMlDataSplitConfig).
        pub fn build(self) -> crate::model::AutoMlDataSplitConfig {
            crate::model::AutoMlDataSplitConfig {
                validation_fraction: self.validation_fraction,
            }
        }
    }
}
impl AutoMlDataSplitConfig {
    /// Creates a new builder-style object to manufacture [`AutoMlDataSplitConfig`](crate::model::AutoMlDataSplitConfig).
    pub fn builder() -> crate::model::auto_ml_data_split_config::Builder {
        crate::model::auto_ml_data_split_config::Builder::default()
    }
}

/// <p>Security options.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlSecurityConfig {
    /// <p>The key used to encrypt stored data.</p>
    #[doc(hidden)]
    pub volume_kms_key_id: std::option::Option<std::string::String>,
    /// <p>Whether to use traffic encryption between the container layers.</p>
    #[doc(hidden)]
    pub enable_inter_container_traffic_encryption: bool,
    /// <p>The VPC configuration.</p>
    #[doc(hidden)]
    pub vpc_config: std::option::Option<crate::model::VpcConfig>,
}
impl AutoMlSecurityConfig {
    /// <p>The key used to encrypt stored data.</p>
    pub fn volume_kms_key_id(&self) -> std::option::Option<&str> {
        self.volume_kms_key_id.as_deref()
    }
    /// <p>Whether to use traffic encryption between the container layers.</p>
    pub fn enable_inter_container_traffic_encryption(&self) -> bool {
        self.enable_inter_container_traffic_encryption
    }
    /// <p>The VPC configuration.</p>
    pub fn vpc_config(&self) -> std::option::Option<&crate::model::VpcConfig> {
        self.vpc_config.as_ref()
    }
}
/// See [`AutoMlSecurityConfig`](crate::model::AutoMlSecurityConfig).
pub mod auto_ml_security_config {

    /// A builder for [`AutoMlSecurityConfig`](crate::model::AutoMlSecurityConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) volume_kms_key_id: std::option::Option<std::string::String>,
        pub(crate) enable_inter_container_traffic_encryption: std::option::Option<bool>,
        pub(crate) vpc_config: std::option::Option<crate::model::VpcConfig>,
    }
    impl Builder {
        /// <p>The key used to encrypt stored data.</p>
        pub fn volume_kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.volume_kms_key_id = Some(input.into());
            self
        }
        /// <p>The key used to encrypt stored data.</p>
        pub fn set_volume_kms_key_id(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.volume_kms_key_id = input;
            self
        }
        /// <p>Whether to use traffic encryption between the container layers.</p>
        pub fn enable_inter_container_traffic_encryption(mut self, input: bool) -> Self {
            self.enable_inter_container_traffic_encryption = Some(input);
            self
        }
        /// <p>Whether to use traffic encryption between the container layers.</p>
        pub fn set_enable_inter_container_traffic_encryption(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.enable_inter_container_traffic_encryption = input;
            self
        }
        /// <p>The VPC configuration.</p>
        pub fn vpc_config(mut self, input: crate::model::VpcConfig) -> Self {
            self.vpc_config = Some(input);
            self
        }
        /// <p>The VPC configuration.</p>
        pub fn set_vpc_config(
            mut self,
            input: std::option::Option<crate::model::VpcConfig>,
        ) -> Self {
            self.vpc_config = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlSecurityConfig`](crate::model::AutoMlSecurityConfig).
        pub fn build(self) -> crate::model::AutoMlSecurityConfig {
            crate::model::AutoMlSecurityConfig {
                volume_kms_key_id: self.volume_kms_key_id,
                enable_inter_container_traffic_encryption: self
                    .enable_inter_container_traffic_encryption
                    .unwrap_or_default(),
                vpc_config: self.vpc_config,
            }
        }
    }
}
impl AutoMlSecurityConfig {
    /// Creates a new builder-style object to manufacture [`AutoMlSecurityConfig`](crate::model::AutoMlSecurityConfig).
    pub fn builder() -> crate::model::auto_ml_security_config::Builder {
        crate::model::auto_ml_security_config::Builder::default()
    }
}

/// <p>The output data configuration.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlOutputDataConfig {
    /// <p>The Key Management Service (KMS) encryption key ID.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>The Amazon S3 output path. Must be 128 characters or less.</p>
    #[doc(hidden)]
    pub s3_output_path: std::option::Option<std::string::String>,
}
impl AutoMlOutputDataConfig {
    /// <p>The Key Management Service (KMS) encryption key ID.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>The Amazon S3 output path. Must be 128 characters or less.</p>
    pub fn s3_output_path(&self) -> std::option::Option<&str> {
        self.s3_output_path.as_deref()
    }
}
/// See [`AutoMlOutputDataConfig`](crate::model::AutoMlOutputDataConfig).
pub mod auto_ml_output_data_config {

    /// A builder for [`AutoMlOutputDataConfig`](crate::model::AutoMlOutputDataConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) s3_output_path: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The Key Management Service (KMS) encryption key ID.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Key Management Service (KMS) encryption key ID.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>The Amazon S3 output path. Must be 128 characters or less.</p>
        pub fn s3_output_path(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_path = Some(input.into());
            self
        }
        /// <p>The Amazon S3 output path. Must be 128 characters or less.</p>
        pub fn set_s3_output_path(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_path = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlOutputDataConfig`](crate::model::AutoMlOutputDataConfig).
        pub fn build(self) -> crate::model::AutoMlOutputDataConfig {
            crate::model::AutoMlOutputDataConfig {
                kms_key_id: self.kms_key_id,
                s3_output_path: self.s3_output_path,
            }
        }
    }
}
impl AutoMlOutputDataConfig {
    /// Creates a new builder-style object to manufacture [`AutoMlOutputDataConfig`](crate::model::AutoMlOutputDataConfig).
    pub fn builder() -> crate::model::auto_ml_output_data_config::Builder {
        crate::model::auto_ml_output_data_config::Builder::default()
    }
}

/// <p>A channel is a named input source that training algorithms can consume. The validation dataset size is limited to less than 2 GB. The training dataset size must be less than 100 GB. For more information, see .</p> <note>
/// <p>A validation dataset must contain the same headers as the training dataset.</p>
/// </note>
/// <p></p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlChannel {
    /// <p>The data source for an AutoML channel.</p>
    #[doc(hidden)]
    pub data_source: std::option::Option<crate::model::AutoMlDataSource>,
    /// <p>You can use <code>Gzip</code> or <code>None</code>. The default value is <code>None</code>.</p>
    #[doc(hidden)]
    pub compression_type: std::option::Option<crate::model::CompressionType>,
    /// <p>The name of the target variable in supervised learning, usually represented by 'y'.</p>
    #[doc(hidden)]
    pub target_attribute_name: std::option::Option<std::string::String>,
    /// <p>The content type of the data from the input source. You can use <code>text/csv;header=present</code> or <code>x-application/vnd.amazon+parquet</code>. The default value is <code>text/csv;header=present</code>.</p>
    #[doc(hidden)]
    pub content_type: std::option::Option<std::string::String>,
    /// <p>The channel type (optional) is an <code>enum</code> string. The default value is <code>training</code>. Channels for training and validation must share the same <code>ContentType</code> and <code>TargetAttributeName</code>. For information on specifying training and validation channel types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-datasets-problem-types.html#autopilot-data-sources-training-or-validation"> <code>How to specify training and validation datasets</code> </a>.</p>
    #[doc(hidden)]
    pub channel_type: std::option::Option<crate::model::AutoMlChannelType>,
}
impl AutoMlChannel {
    /// <p>The data source for an AutoML channel.</p>
    pub fn data_source(&self) -> std::option::Option<&crate::model::AutoMlDataSource> {
        self.data_source.as_ref()
    }
    /// <p>You can use <code>Gzip</code> or <code>None</code>. The default value is <code>None</code>.</p>
    pub fn compression_type(&self) -> std::option::Option<&crate::model::CompressionType> {
        self.compression_type.as_ref()
    }
    /// <p>The name of the target variable in supervised learning, usually represented by 'y'.</p>
    pub fn target_attribute_name(&self) -> std::option::Option<&str> {
        self.target_attribute_name.as_deref()
    }
    /// <p>The content type of the data from the input source. You can use <code>text/csv;header=present</code> or <code>x-application/vnd.amazon+parquet</code>. The default value is <code>text/csv;header=present</code>.</p>
    pub fn content_type(&self) -> std::option::Option<&str> {
        self.content_type.as_deref()
    }
    /// <p>The channel type (optional) is an <code>enum</code> string. The default value is <code>training</code>. Channels for training and validation must share the same <code>ContentType</code> and <code>TargetAttributeName</code>. For information on specifying training and validation channel types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-datasets-problem-types.html#autopilot-data-sources-training-or-validation"> <code>How to specify training and validation datasets</code> </a>.</p>
    pub fn channel_type(&self) -> std::option::Option<&crate::model::AutoMlChannelType> {
        self.channel_type.as_ref()
    }
}
/// See [`AutoMlChannel`](crate::model::AutoMlChannel).
pub mod auto_ml_channel {

    /// A builder for [`AutoMlChannel`](crate::model::AutoMlChannel).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) data_source: std::option::Option<crate::model::AutoMlDataSource>,
        pub(crate) compression_type: std::option::Option<crate::model::CompressionType>,
        pub(crate) target_attribute_name: std::option::Option<std::string::String>,
        pub(crate) content_type: std::option::Option<std::string::String>,
        pub(crate) channel_type: std::option::Option<crate::model::AutoMlChannelType>,
    }
    impl Builder {
        /// <p>The data source for an AutoML channel.</p>
        pub fn data_source(mut self, input: crate::model::AutoMlDataSource) -> Self {
            self.data_source = Some(input);
            self
        }
        /// <p>The data source for an AutoML channel.</p>
        pub fn set_data_source(
            mut self,
            input: std::option::Option<crate::model::AutoMlDataSource>,
        ) -> Self {
            self.data_source = input;
            self
        }
        /// <p>You can use <code>Gzip</code> or <code>None</code>. The default value is <code>None</code>.</p>
        pub fn compression_type(mut self, input: crate::model::CompressionType) -> Self {
            self.compression_type = Some(input);
            self
        }
        /// <p>You can use <code>Gzip</code> or <code>None</code>. The default value is <code>None</code>.</p>
        pub fn set_compression_type(
            mut self,
            input: std::option::Option<crate::model::CompressionType>,
        ) -> Self {
            self.compression_type = input;
            self
        }
        /// <p>The name of the target variable in supervised learning, usually represented by 'y'.</p>
        pub fn target_attribute_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.target_attribute_name = Some(input.into());
            self
        }
        /// <p>The name of the target variable in supervised learning, usually represented by 'y'.</p>
        pub fn set_target_attribute_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.target_attribute_name = input;
            self
        }
        /// <p>The content type of the data from the input source. You can use <code>text/csv;header=present</code> or <code>x-application/vnd.amazon+parquet</code>. The default value is <code>text/csv;header=present</code>.</p>
        pub fn content_type(mut self, input: impl Into<std::string::String>) -> Self {
            self.content_type = Some(input.into());
            self
        }
        /// <p>The content type of the data from the input source. You can use <code>text/csv;header=present</code> or <code>x-application/vnd.amazon+parquet</code>. The default value is <code>text/csv;header=present</code>.</p>
        pub fn set_content_type(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.content_type = input;
            self
        }
        /// <p>The channel type (optional) is an <code>enum</code> string. The default value is <code>training</code>. Channels for training and validation must share the same <code>ContentType</code> and <code>TargetAttributeName</code>. For information on specifying training and validation channel types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-datasets-problem-types.html#autopilot-data-sources-training-or-validation"> <code>How to specify training and validation datasets</code> </a>.</p>
        pub fn channel_type(mut self, input: crate::model::AutoMlChannelType) -> Self {
            self.channel_type = Some(input);
            self
        }
        /// <p>The channel type (optional) is an <code>enum</code> string. The default value is <code>training</code>. Channels for training and validation must share the same <code>ContentType</code> and <code>TargetAttributeName</code>. For information on specifying training and validation channel types, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/autopilot-datasets-problem-types.html#autopilot-data-sources-training-or-validation"> <code>How to specify training and validation datasets</code> </a>.</p>
        pub fn set_channel_type(
            mut self,
            input: std::option::Option<crate::model::AutoMlChannelType>,
        ) -> Self {
            self.channel_type = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlChannel`](crate::model::AutoMlChannel).
        pub fn build(self) -> crate::model::AutoMlChannel {
            crate::model::AutoMlChannel {
                data_source: self.data_source,
                compression_type: self.compression_type,
                target_attribute_name: self.target_attribute_name,
                content_type: self.content_type,
                channel_type: self.channel_type,
            }
        }
    }
}
impl AutoMlChannel {
    /// Creates a new builder-style object to manufacture [`AutoMlChannel`](crate::model::AutoMlChannel).
    pub fn builder() -> crate::model::auto_ml_channel::Builder {
        crate::model::auto_ml_channel::Builder::default()
    }
}

/// When writing a match expression against `AutoMlChannelType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automlchanneltype = unimplemented!();
/// match automlchanneltype {
///     AutoMlChannelType::Training => { /* ... */ },
///     AutoMlChannelType::Validation => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automlchanneltype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMlChannelType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMlChannelType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMlChannelType::NewFeature` is defined.
/// Specifically, when `automlchanneltype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMlChannelType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMlChannelType {
    #[allow(missing_docs)] // documentation missing in model
    Training,
    #[allow(missing_docs)] // documentation missing in model
    Validation,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMlChannelType {
    fn from(s: &str) -> Self {
        match s {
            "training" => AutoMlChannelType::Training,
            "validation" => AutoMlChannelType::Validation,
            other => {
                AutoMlChannelType::Unknown(crate::types::UnknownVariantValue(other.to_owned()))
            }
        }
    }
}
impl std::str::FromStr for AutoMlChannelType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMlChannelType::from(s))
    }
}
impl AutoMlChannelType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMlChannelType::Training => "training",
            AutoMlChannelType::Validation => "validation",
            AutoMlChannelType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["training", "validation"]
    }
}
impl AsRef<str> for AutoMlChannelType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The data source for the Autopilot job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMlDataSource {
    /// <p>The Amazon S3 location of the input data.</p>
    #[doc(hidden)]
    pub s3_data_source: std::option::Option<crate::model::AutoMls3DataSource>,
}
impl AutoMlDataSource {
    /// <p>The Amazon S3 location of the input data.</p>
    pub fn s3_data_source(&self) -> std::option::Option<&crate::model::AutoMls3DataSource> {
        self.s3_data_source.as_ref()
    }
}
/// See [`AutoMlDataSource`](crate::model::AutoMlDataSource).
pub mod auto_ml_data_source {

    /// A builder for [`AutoMlDataSource`](crate::model::AutoMlDataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_source: std::option::Option<crate::model::AutoMls3DataSource>,
    }
    impl Builder {
        /// <p>The Amazon S3 location of the input data.</p>
        pub fn s3_data_source(mut self, input: crate::model::AutoMls3DataSource) -> Self {
            self.s3_data_source = Some(input);
            self
        }
        /// <p>The Amazon S3 location of the input data.</p>
        pub fn set_s3_data_source(
            mut self,
            input: std::option::Option<crate::model::AutoMls3DataSource>,
        ) -> Self {
            self.s3_data_source = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMlDataSource`](crate::model::AutoMlDataSource).
        pub fn build(self) -> crate::model::AutoMlDataSource {
            crate::model::AutoMlDataSource {
                s3_data_source: self.s3_data_source,
            }
        }
    }
}
impl AutoMlDataSource {
    /// Creates a new builder-style object to manufacture [`AutoMlDataSource`](crate::model::AutoMlDataSource).
    pub fn builder() -> crate::model::auto_ml_data_source::Builder {
        crate::model::auto_ml_data_source::Builder::default()
    }
}

/// <p>The Amazon S3 data source.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AutoMls3DataSource {
    /// <p>The data type.</p>
    /// <p>A ManifestFile should have the format shown below:</p>
    /// <p> <code>[ {"prefix": "s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER/DOC-EXAMPLE-PREFIX/"}, </code> </p>
    /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-1",</code> </p>
    /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-2",</code> </p>
    /// <p> <code>... "DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-N" ]</code> </p>
    /// <p>An S3Prefix should have the following format: </p>
    /// <p> <code>s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER-OR-FILE</code> </p>
    #[doc(hidden)]
    pub s3_data_type: std::option::Option<crate::model::AutoMls3DataType>,
    /// <p>The URL to the Amazon S3 data source.</p>
    #[doc(hidden)]
    pub s3_uri: std::option::Option<std::string::String>,
}
impl AutoMls3DataSource {
    /// <p>The data type.</p>
    /// <p>A ManifestFile should have the format shown below:</p>
    /// <p> <code>[ {"prefix": "s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER/DOC-EXAMPLE-PREFIX/"}, </code> </p>
    /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-1",</code> </p>
    /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-2",</code> </p>
    /// <p> <code>... "DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-N" ]</code> </p>
    /// <p>An S3Prefix should have the following format: </p>
    /// <p> <code>s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER-OR-FILE</code> </p>
    pub fn s3_data_type(&self) -> std::option::Option<&crate::model::AutoMls3DataType> {
        self.s3_data_type.as_ref()
    }
    /// <p>The URL to the Amazon S3 data source.</p>
    pub fn s3_uri(&self) -> std::option::Option<&str> {
        self.s3_uri.as_deref()
    }
}
/// See [`AutoMls3DataSource`](crate::model::AutoMls3DataSource).
pub mod auto_mls3_data_source {

    /// A builder for [`AutoMls3DataSource`](crate::model::AutoMls3DataSource).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_data_type: std::option::Option<crate::model::AutoMls3DataType>,
        pub(crate) s3_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The data type.</p>
        /// <p>A ManifestFile should have the format shown below:</p>
        /// <p> <code>[ {"prefix": "s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER/DOC-EXAMPLE-PREFIX/"}, </code> </p>
        /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-1",</code> </p>
        /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-2",</code> </p>
        /// <p> <code>... "DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-N" ]</code> </p>
        /// <p>An S3Prefix should have the following format: </p>
        /// <p> <code>s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER-OR-FILE</code> </p>
        pub fn s3_data_type(mut self, input: crate::model::AutoMls3DataType) -> Self {
            self.s3_data_type = Some(input);
            self
        }
        /// <p>The data type.</p>
        /// <p>A ManifestFile should have the format shown below:</p>
        /// <p> <code>[ {"prefix": "s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER/DOC-EXAMPLE-PREFIX/"}, </code> </p>
        /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-1",</code> </p>
        /// <p> <code>"DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-2",</code> </p>
        /// <p> <code>... "DOC-EXAMPLE-RELATIVE-PATH/DOC-EXAMPLE-FOLDER/DATA-N" ]</code> </p>
        /// <p>An S3Prefix should have the following format: </p>
        /// <p> <code>s3://DOC-EXAMPLE-BUCKET/DOC-EXAMPLE-FOLDER-OR-FILE</code> </p>
        pub fn set_s3_data_type(
            mut self,
            input: std::option::Option<crate::model::AutoMls3DataType>,
        ) -> Self {
            self.s3_data_type = input;
            self
        }
        /// <p>The URL to the Amazon S3 data source.</p>
        pub fn s3_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_uri = Some(input.into());
            self
        }
        /// <p>The URL to the Amazon S3 data source.</p>
        pub fn set_s3_uri(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.s3_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`AutoMls3DataSource`](crate::model::AutoMls3DataSource).
        pub fn build(self) -> crate::model::AutoMls3DataSource {
            crate::model::AutoMls3DataSource {
                s3_data_type: self.s3_data_type,
                s3_uri: self.s3_uri,
            }
        }
    }
}
impl AutoMls3DataSource {
    /// Creates a new builder-style object to manufacture [`AutoMls3DataSource`](crate::model::AutoMls3DataSource).
    pub fn builder() -> crate::model::auto_mls3_data_source::Builder {
        crate::model::auto_mls3_data_source::Builder::default()
    }
}

/// When writing a match expression against `AutoMls3DataType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let automls3datatype = unimplemented!();
/// match automls3datatype {
///     AutoMls3DataType::ManifestFile => { /* ... */ },
///     AutoMls3DataType::S3Prefix => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `automls3datatype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `AutoMls3DataType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `AutoMls3DataType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `AutoMls3DataType::NewFeature` is defined.
/// Specifically, when `automls3datatype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `AutoMls3DataType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum AutoMls3DataType {
    #[allow(missing_docs)] // documentation missing in model
    ManifestFile,
    #[allow(missing_docs)] // documentation missing in model
    S3Prefix,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for AutoMls3DataType {
    fn from(s: &str) -> Self {
        match s {
            "ManifestFile" => AutoMls3DataType::ManifestFile,
            "S3Prefix" => AutoMls3DataType::S3Prefix,
            other => AutoMls3DataType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for AutoMls3DataType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(AutoMls3DataType::from(s))
    }
}
impl AutoMls3DataType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            AutoMls3DataType::ManifestFile => "ManifestFile",
            AutoMls3DataType::S3Prefix => "S3Prefix",
            AutoMls3DataType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["ManifestFile", "S3Prefix"]
    }
}
impl AsRef<str> for AutoMls3DataType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies the validation and image scan statuses of the algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AlgorithmStatusDetails {
    /// <p>The status of algorithm validation.</p>
    #[doc(hidden)]
    pub validation_statuses: std::option::Option<std::vec::Vec<crate::model::AlgorithmStatusItem>>,
    /// <p>The status of the scan of the algorithm's Docker image container.</p>
    #[doc(hidden)]
    pub image_scan_statuses: std::option::Option<std::vec::Vec<crate::model::AlgorithmStatusItem>>,
}
impl AlgorithmStatusDetails {
    /// <p>The status of algorithm validation.</p>
    pub fn validation_statuses(&self) -> std::option::Option<&[crate::model::AlgorithmStatusItem]> {
        self.validation_statuses.as_deref()
    }
    /// <p>The status of the scan of the algorithm's Docker image container.</p>
    pub fn image_scan_statuses(&self) -> std::option::Option<&[crate::model::AlgorithmStatusItem]> {
        self.image_scan_statuses.as_deref()
    }
}
/// See [`AlgorithmStatusDetails`](crate::model::AlgorithmStatusDetails).
pub mod algorithm_status_details {

    /// A builder for [`AlgorithmStatusDetails`](crate::model::AlgorithmStatusDetails).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) validation_statuses:
            std::option::Option<std::vec::Vec<crate::model::AlgorithmStatusItem>>,
        pub(crate) image_scan_statuses:
            std::option::Option<std::vec::Vec<crate::model::AlgorithmStatusItem>>,
    }
    impl Builder {
        /// Appends an item to `validation_statuses`.
        ///
        /// To override the contents of this collection use [`set_validation_statuses`](Self::set_validation_statuses).
        ///
        /// <p>The status of algorithm validation.</p>
        pub fn validation_statuses(mut self, input: crate::model::AlgorithmStatusItem) -> Self {
            let mut v = self.validation_statuses.unwrap_or_default();
            v.push(input);
            self.validation_statuses = Some(v);
            self
        }
        /// <p>The status of algorithm validation.</p>
        pub fn set_validation_statuses(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::AlgorithmStatusItem>>,
        ) -> Self {
            self.validation_statuses = input;
            self
        }
        /// Appends an item to `image_scan_statuses`.
        ///
        /// To override the contents of this collection use [`set_image_scan_statuses`](Self::set_image_scan_statuses).
        ///
        /// <p>The status of the scan of the algorithm's Docker image container.</p>
        pub fn image_scan_statuses(mut self, input: crate::model::AlgorithmStatusItem) -> Self {
            let mut v = self.image_scan_statuses.unwrap_or_default();
            v.push(input);
            self.image_scan_statuses = Some(v);
            self
        }
        /// <p>The status of the scan of the algorithm's Docker image container.</p>
        pub fn set_image_scan_statuses(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::AlgorithmStatusItem>>,
        ) -> Self {
            self.image_scan_statuses = input;
            self
        }
        /// Consumes the builder and constructs a [`AlgorithmStatusDetails`](crate::model::AlgorithmStatusDetails).
        pub fn build(self) -> crate::model::AlgorithmStatusDetails {
            crate::model::AlgorithmStatusDetails {
                validation_statuses: self.validation_statuses,
                image_scan_statuses: self.image_scan_statuses,
            }
        }
    }
}
impl AlgorithmStatusDetails {
    /// Creates a new builder-style object to manufacture [`AlgorithmStatusDetails`](crate::model::AlgorithmStatusDetails).
    pub fn builder() -> crate::model::algorithm_status_details::Builder {
        crate::model::algorithm_status_details::Builder::default()
    }
}

/// <p>Represents the overall status of an algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AlgorithmStatusItem {
    /// <p>The name of the algorithm for which the overall status is being reported.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>The current status.</p>
    #[doc(hidden)]
    pub status: std::option::Option<crate::model::DetailedAlgorithmStatus>,
    /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
    #[doc(hidden)]
    pub failure_reason: std::option::Option<std::string::String>,
}
impl AlgorithmStatusItem {
    /// <p>The name of the algorithm for which the overall status is being reported.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>The current status.</p>
    pub fn status(&self) -> std::option::Option<&crate::model::DetailedAlgorithmStatus> {
        self.status.as_ref()
    }
    /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
    pub fn failure_reason(&self) -> std::option::Option<&str> {
        self.failure_reason.as_deref()
    }
}
/// See [`AlgorithmStatusItem`](crate::model::AlgorithmStatusItem).
pub mod algorithm_status_item {

    /// A builder for [`AlgorithmStatusItem`](crate::model::AlgorithmStatusItem).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) status: std::option::Option<crate::model::DetailedAlgorithmStatus>,
        pub(crate) failure_reason: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of the algorithm for which the overall status is being reported.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the algorithm for which the overall status is being reported.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>The current status.</p>
        pub fn status(mut self, input: crate::model::DetailedAlgorithmStatus) -> Self {
            self.status = Some(input);
            self
        }
        /// <p>The current status.</p>
        pub fn set_status(
            mut self,
            input: std::option::Option<crate::model::DetailedAlgorithmStatus>,
        ) -> Self {
            self.status = input;
            self
        }
        /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
        pub fn failure_reason(mut self, input: impl Into<std::string::String>) -> Self {
            self.failure_reason = Some(input.into());
            self
        }
        /// <p>if the overall status is <code>Failed</code>, the reason for the failure.</p>
        pub fn set_failure_reason(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.failure_reason = input;
            self
        }
        /// Consumes the builder and constructs a [`AlgorithmStatusItem`](crate::model::AlgorithmStatusItem).
        pub fn build(self) -> crate::model::AlgorithmStatusItem {
            crate::model::AlgorithmStatusItem {
                name: self.name,
                status: self.status,
                failure_reason: self.failure_reason,
            }
        }
    }
}
impl AlgorithmStatusItem {
    /// Creates a new builder-style object to manufacture [`AlgorithmStatusItem`](crate::model::AlgorithmStatusItem).
    pub fn builder() -> crate::model::algorithm_status_item::Builder {
        crate::model::algorithm_status_item::Builder::default()
    }
}

/// When writing a match expression against `DetailedAlgorithmStatus`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let detailedalgorithmstatus = unimplemented!();
/// match detailedalgorithmstatus {
///     DetailedAlgorithmStatus::Completed => { /* ... */ },
///     DetailedAlgorithmStatus::Failed => { /* ... */ },
///     DetailedAlgorithmStatus::InProgress => { /* ... */ },
///     DetailedAlgorithmStatus::NotStarted => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `detailedalgorithmstatus` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `DetailedAlgorithmStatus::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `DetailedAlgorithmStatus::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `DetailedAlgorithmStatus::NewFeature` is defined.
/// Specifically, when `detailedalgorithmstatus` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `DetailedAlgorithmStatus::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum DetailedAlgorithmStatus {
    #[allow(missing_docs)] // documentation missing in model
    Completed,
    #[allow(missing_docs)] // documentation missing in model
    Failed,
    #[allow(missing_docs)] // documentation missing in model
    InProgress,
    #[allow(missing_docs)] // documentation missing in model
    NotStarted,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for DetailedAlgorithmStatus {
    fn from(s: &str) -> Self {
        match s {
            "Completed" => DetailedAlgorithmStatus::Completed,
            "Failed" => DetailedAlgorithmStatus::Failed,
            "InProgress" => DetailedAlgorithmStatus::InProgress,
            "NotStarted" => DetailedAlgorithmStatus::NotStarted,
            other => DetailedAlgorithmStatus::Unknown(crate::types::UnknownVariantValue(
                other.to_owned(),
            )),
        }
    }
}
impl std::str::FromStr for DetailedAlgorithmStatus {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(DetailedAlgorithmStatus::from(s))
    }
}
impl DetailedAlgorithmStatus {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            DetailedAlgorithmStatus::Completed => "Completed",
            DetailedAlgorithmStatus::Failed => "Failed",
            DetailedAlgorithmStatus::InProgress => "InProgress",
            DetailedAlgorithmStatus::NotStarted => "NotStarted",
            DetailedAlgorithmStatus::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Completed", "Failed", "InProgress", "NotStarted"]
    }
}
impl AsRef<str> for DetailedAlgorithmStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Specifies configurations for one or more training jobs that SageMaker runs to test the algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AlgorithmValidationSpecification {
    /// <p>The IAM roles that SageMaker uses to run the training jobs.</p>
    #[doc(hidden)]
    pub validation_role: std::option::Option<std::string::String>,
    /// <p>An array of <code>AlgorithmValidationProfile</code> objects, each of which specifies a training job and batch transform job that SageMaker runs to validate your algorithm.</p>
    #[doc(hidden)]
    pub validation_profiles:
        std::option::Option<std::vec::Vec<crate::model::AlgorithmValidationProfile>>,
}
impl AlgorithmValidationSpecification {
    /// <p>The IAM roles that SageMaker uses to run the training jobs.</p>
    pub fn validation_role(&self) -> std::option::Option<&str> {
        self.validation_role.as_deref()
    }
    /// <p>An array of <code>AlgorithmValidationProfile</code> objects, each of which specifies a training job and batch transform job that SageMaker runs to validate your algorithm.</p>
    pub fn validation_profiles(
        &self,
    ) -> std::option::Option<&[crate::model::AlgorithmValidationProfile]> {
        self.validation_profiles.as_deref()
    }
}
/// See [`AlgorithmValidationSpecification`](crate::model::AlgorithmValidationSpecification).
pub mod algorithm_validation_specification {

    /// A builder for [`AlgorithmValidationSpecification`](crate::model::AlgorithmValidationSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) validation_role: std::option::Option<std::string::String>,
        pub(crate) validation_profiles:
            std::option::Option<std::vec::Vec<crate::model::AlgorithmValidationProfile>>,
    }
    impl Builder {
        /// <p>The IAM roles that SageMaker uses to run the training jobs.</p>
        pub fn validation_role(mut self, input: impl Into<std::string::String>) -> Self {
            self.validation_role = Some(input.into());
            self
        }
        /// <p>The IAM roles that SageMaker uses to run the training jobs.</p>
        pub fn set_validation_role(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.validation_role = input;
            self
        }
        /// Appends an item to `validation_profiles`.
        ///
        /// To override the contents of this collection use [`set_validation_profiles`](Self::set_validation_profiles).
        ///
        /// <p>An array of <code>AlgorithmValidationProfile</code> objects, each of which specifies a training job and batch transform job that SageMaker runs to validate your algorithm.</p>
        pub fn validation_profiles(
            mut self,
            input: crate::model::AlgorithmValidationProfile,
        ) -> Self {
            let mut v = self.validation_profiles.unwrap_or_default();
            v.push(input);
            self.validation_profiles = Some(v);
            self
        }
        /// <p>An array of <code>AlgorithmValidationProfile</code> objects, each of which specifies a training job and batch transform job that SageMaker runs to validate your algorithm.</p>
        pub fn set_validation_profiles(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::AlgorithmValidationProfile>>,
        ) -> Self {
            self.validation_profiles = input;
            self
        }
        /// Consumes the builder and constructs a [`AlgorithmValidationSpecification`](crate::model::AlgorithmValidationSpecification).
        pub fn build(self) -> crate::model::AlgorithmValidationSpecification {
            crate::model::AlgorithmValidationSpecification {
                validation_role: self.validation_role,
                validation_profiles: self.validation_profiles,
            }
        }
    }
}
impl AlgorithmValidationSpecification {
    /// Creates a new builder-style object to manufacture [`AlgorithmValidationSpecification`](crate::model::AlgorithmValidationSpecification).
    pub fn builder() -> crate::model::algorithm_validation_specification::Builder {
        crate::model::algorithm_validation_specification::Builder::default()
    }
}

/// <p>Defines a training job and a batch transform job that SageMaker runs to validate your algorithm.</p>
/// <p>The data provided in the validation profile is made available to your buyers on Amazon Web Services Marketplace.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct AlgorithmValidationProfile {
    /// <p>The name of the profile for the algorithm. The name must have 1 to 63 characters. Valid characters are a-z, A-Z, 0-9, and - (hyphen).</p>
    #[doc(hidden)]
    pub profile_name: std::option::Option<std::string::String>,
    /// <p>The <code>TrainingJobDefinition</code> object that describes the training job that SageMaker runs to validate your algorithm.</p>
    #[doc(hidden)]
    pub training_job_definition: std::option::Option<crate::model::TrainingJobDefinition>,
    /// <p>The <code>TransformJobDefinition</code> object that describes the transform job that SageMaker runs to validate your algorithm.</p>
    #[doc(hidden)]
    pub transform_job_definition: std::option::Option<crate::model::TransformJobDefinition>,
}
impl AlgorithmValidationProfile {
    /// <p>The name of the profile for the algorithm. The name must have 1 to 63 characters. Valid characters are a-z, A-Z, 0-9, and - (hyphen).</p>
    pub fn profile_name(&self) -> std::option::Option<&str> {
        self.profile_name.as_deref()
    }
    /// <p>The <code>TrainingJobDefinition</code> object that describes the training job that SageMaker runs to validate your algorithm.</p>
    pub fn training_job_definition(
        &self,
    ) -> std::option::Option<&crate::model::TrainingJobDefinition> {
        self.training_job_definition.as_ref()
    }
    /// <p>The <code>TransformJobDefinition</code> object that describes the transform job that SageMaker runs to validate your algorithm.</p>
    pub fn transform_job_definition(
        &self,
    ) -> std::option::Option<&crate::model::TransformJobDefinition> {
        self.transform_job_definition.as_ref()
    }
}
/// See [`AlgorithmValidationProfile`](crate::model::AlgorithmValidationProfile).
pub mod algorithm_validation_profile {

    /// A builder for [`AlgorithmValidationProfile`](crate::model::AlgorithmValidationProfile).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) profile_name: std::option::Option<std::string::String>,
        pub(crate) training_job_definition:
            std::option::Option<crate::model::TrainingJobDefinition>,
        pub(crate) transform_job_definition:
            std::option::Option<crate::model::TransformJobDefinition>,
    }
    impl Builder {
        /// <p>The name of the profile for the algorithm. The name must have 1 to 63 characters. Valid characters are a-z, A-Z, 0-9, and - (hyphen).</p>
        pub fn profile_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.profile_name = Some(input.into());
            self
        }
        /// <p>The name of the profile for the algorithm. The name must have 1 to 63 characters. Valid characters are a-z, A-Z, 0-9, and - (hyphen).</p>
        pub fn set_profile_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.profile_name = input;
            self
        }
        /// <p>The <code>TrainingJobDefinition</code> object that describes the training job that SageMaker runs to validate your algorithm.</p>
        pub fn training_job_definition(
            mut self,
            input: crate::model::TrainingJobDefinition,
        ) -> Self {
            self.training_job_definition = Some(input);
            self
        }
        /// <p>The <code>TrainingJobDefinition</code> object that describes the training job that SageMaker runs to validate your algorithm.</p>
        pub fn set_training_job_definition(
            mut self,
            input: std::option::Option<crate::model::TrainingJobDefinition>,
        ) -> Self {
            self.training_job_definition = input;
            self
        }
        /// <p>The <code>TransformJobDefinition</code> object that describes the transform job that SageMaker runs to validate your algorithm.</p>
        pub fn transform_job_definition(
            mut self,
            input: crate::model::TransformJobDefinition,
        ) -> Self {
            self.transform_job_definition = Some(input);
            self
        }
        /// <p>The <code>TransformJobDefinition</code> object that describes the transform job that SageMaker runs to validate your algorithm.</p>
        pub fn set_transform_job_definition(
            mut self,
            input: std::option::Option<crate::model::TransformJobDefinition>,
        ) -> Self {
            self.transform_job_definition = input;
            self
        }
        /// Consumes the builder and constructs a [`AlgorithmValidationProfile`](crate::model::AlgorithmValidationProfile).
        pub fn build(self) -> crate::model::AlgorithmValidationProfile {
            crate::model::AlgorithmValidationProfile {
                profile_name: self.profile_name,
                training_job_definition: self.training_job_definition,
                transform_job_definition: self.transform_job_definition,
            }
        }
    }
}
impl AlgorithmValidationProfile {
    /// Creates a new builder-style object to manufacture [`AlgorithmValidationProfile`](crate::model::AlgorithmValidationProfile).
    pub fn builder() -> crate::model::algorithm_validation_profile::Builder {
        crate::model::algorithm_validation_profile::Builder::default()
    }
}

/// <p>Defines the input needed to run a training job using the algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrainingJobDefinition {
    /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
    /// <p> <b>Pipe mode</b> </p>
    /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
    /// <p> <b>File mode</b> </p>
    /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
    /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
    /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
    /// <p> <b>FastFile mode</b> </p>
    /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
    /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
    #[doc(hidden)]
    pub training_input_mode: std::option::Option<crate::model::TrainingInputMode>,
    /// <p>The hyperparameters used for the training job.</p>
    #[doc(hidden)]
    pub hyper_parameters:
        std::option::Option<std::collections::HashMap<std::string::String, std::string::String>>,
    /// <p>An array of <code>Channel</code> objects, each of which specifies an input source.</p>
    #[doc(hidden)]
    pub input_data_config: std::option::Option<std::vec::Vec<crate::model::Channel>>,
    /// <p>the path to the S3 bucket where you want to store model artifacts. SageMaker creates subfolders for the artifacts.</p>
    #[doc(hidden)]
    pub output_data_config: std::option::Option<crate::model::OutputDataConfig>,
    /// <p>The resources, including the ML compute instances and ML storage volumes, to use for model training.</p>
    #[doc(hidden)]
    pub resource_config: std::option::Option<crate::model::ResourceConfig>,
    /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
    /// <p>To stop a job, SageMaker sends the algorithm the SIGTERM signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts.</p>
    #[doc(hidden)]
    pub stopping_condition: std::option::Option<crate::model::StoppingCondition>,
}
impl TrainingJobDefinition {
    /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
    /// <p> <b>Pipe mode</b> </p>
    /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
    /// <p> <b>File mode</b> </p>
    /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
    /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
    /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
    /// <p> <b>FastFile mode</b> </p>
    /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
    /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
    pub fn training_input_mode(&self) -> std::option::Option<&crate::model::TrainingInputMode> {
        self.training_input_mode.as_ref()
    }
    /// <p>The hyperparameters used for the training job.</p>
    pub fn hyper_parameters(
        &self,
    ) -> std::option::Option<&std::collections::HashMap<std::string::String, std::string::String>>
    {
        self.hyper_parameters.as_ref()
    }
    /// <p>An array of <code>Channel</code> objects, each of which specifies an input source.</p>
    pub fn input_data_config(&self) -> std::option::Option<&[crate::model::Channel]> {
        self.input_data_config.as_deref()
    }
    /// <p>the path to the S3 bucket where you want to store model artifacts. SageMaker creates subfolders for the artifacts.</p>
    pub fn output_data_config(&self) -> std::option::Option<&crate::model::OutputDataConfig> {
        self.output_data_config.as_ref()
    }
    /// <p>The resources, including the ML compute instances and ML storage volumes, to use for model training.</p>
    pub fn resource_config(&self) -> std::option::Option<&crate::model::ResourceConfig> {
        self.resource_config.as_ref()
    }
    /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
    /// <p>To stop a job, SageMaker sends the algorithm the SIGTERM signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts.</p>
    pub fn stopping_condition(&self) -> std::option::Option<&crate::model::StoppingCondition> {
        self.stopping_condition.as_ref()
    }
}
/// See [`TrainingJobDefinition`](crate::model::TrainingJobDefinition).
pub mod training_job_definition {

    /// A builder for [`TrainingJobDefinition`](crate::model::TrainingJobDefinition).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_input_mode: std::option::Option<crate::model::TrainingInputMode>,
        pub(crate) hyper_parameters: std::option::Option<
            std::collections::HashMap<std::string::String, std::string::String>,
        >,
        pub(crate) input_data_config: std::option::Option<std::vec::Vec<crate::model::Channel>>,
        pub(crate) output_data_config: std::option::Option<crate::model::OutputDataConfig>,
        pub(crate) resource_config: std::option::Option<crate::model::ResourceConfig>,
        pub(crate) stopping_condition: std::option::Option<crate::model::StoppingCondition>,
    }
    impl Builder {
        /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
        /// <p> <b>Pipe mode</b> </p>
        /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
        /// <p> <b>File mode</b> </p>
        /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
        /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
        /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
        /// <p> <b>FastFile mode</b> </p>
        /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
        /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
        pub fn training_input_mode(mut self, input: crate::model::TrainingInputMode) -> Self {
            self.training_input_mode = Some(input);
            self
        }
        /// <p>The training input mode that the algorithm supports. For more information about input modes, see <a href="https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html">Algorithms</a>.</p>
        /// <p> <b>Pipe mode</b> </p>
        /// <p>If an algorithm supports <code>Pipe</code> mode, Amazon SageMaker streams data directly from Amazon S3 to the container.</p>
        /// <p> <b>File mode</b> </p>
        /// <p>If an algorithm supports <code>File</code> mode, SageMaker downloads the training data from S3 to the provisioned ML storage volume, and mounts the directory to the Docker volume for the training container.</p>
        /// <p>You must provision the ML storage volume with sufficient capacity to accommodate the data downloaded from S3. In addition to the training data, the ML storage volume also stores the output model. The algorithm container uses the ML storage volume to also store intermediate information, if any.</p>
        /// <p>For distributed algorithms, training data is distributed uniformly. Your training duration is predictable if the input data objects sizes are approximately the same. SageMaker does not split the files any further for model training. If the object sizes are skewed, training won't be optimal as the data distribution is also skewed when one host in a training cluster is overloaded, thus becoming a bottleneck in training.</p>
        /// <p> <b>FastFile mode</b> </p>
        /// <p>If an algorithm supports <code>FastFile</code> mode, SageMaker streams data directly from S3 to the container with no code changes, and provides file system access to the data. Users can author their training script to interact with these files as if they were stored on disk.</p>
        /// <p> <code>FastFile</code> mode works best when the data is read sequentially. Augmented manifest files aren't supported. The startup time is lower when there are fewer files in the S3 bucket provided.</p>
        pub fn set_training_input_mode(
            mut self,
            input: std::option::Option<crate::model::TrainingInputMode>,
        ) -> Self {
            self.training_input_mode = input;
            self
        }
        /// Adds a key-value pair to `hyper_parameters`.
        ///
        /// To override the contents of this collection use [`set_hyper_parameters`](Self::set_hyper_parameters).
        ///
        /// <p>The hyperparameters used for the training job.</p>
        pub fn hyper_parameters(
            mut self,
            k: impl Into<std::string::String>,
            v: impl Into<std::string::String>,
        ) -> Self {
            let mut hash_map = self.hyper_parameters.unwrap_or_default();
            hash_map.insert(k.into(), v.into());
            self.hyper_parameters = Some(hash_map);
            self
        }
        /// <p>The hyperparameters used for the training job.</p>
        pub fn set_hyper_parameters(
            mut self,
            input: std::option::Option<
                std::collections::HashMap<std::string::String, std::string::String>,
            >,
        ) -> Self {
            self.hyper_parameters = input;
            self
        }
        /// Appends an item to `input_data_config`.
        ///
        /// To override the contents of this collection use [`set_input_data_config`](Self::set_input_data_config).
        ///
        /// <p>An array of <code>Channel</code> objects, each of which specifies an input source.</p>
        pub fn input_data_config(mut self, input: crate::model::Channel) -> Self {
            let mut v = self.input_data_config.unwrap_or_default();
            v.push(input);
            self.input_data_config = Some(v);
            self
        }
        /// <p>An array of <code>Channel</code> objects, each of which specifies an input source.</p>
        pub fn set_input_data_config(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::Channel>>,
        ) -> Self {
            self.input_data_config = input;
            self
        }
        /// <p>the path to the S3 bucket where you want to store model artifacts. SageMaker creates subfolders for the artifacts.</p>
        pub fn output_data_config(mut self, input: crate::model::OutputDataConfig) -> Self {
            self.output_data_config = Some(input);
            self
        }
        /// <p>the path to the S3 bucket where you want to store model artifacts. SageMaker creates subfolders for the artifacts.</p>
        pub fn set_output_data_config(
            mut self,
            input: std::option::Option<crate::model::OutputDataConfig>,
        ) -> Self {
            self.output_data_config = input;
            self
        }
        /// <p>The resources, including the ML compute instances and ML storage volumes, to use for model training.</p>
        pub fn resource_config(mut self, input: crate::model::ResourceConfig) -> Self {
            self.resource_config = Some(input);
            self
        }
        /// <p>The resources, including the ML compute instances and ML storage volumes, to use for model training.</p>
        pub fn set_resource_config(
            mut self,
            input: std::option::Option<crate::model::ResourceConfig>,
        ) -> Self {
            self.resource_config = input;
            self
        }
        /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
        /// <p>To stop a job, SageMaker sends the algorithm the SIGTERM signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts.</p>
        pub fn stopping_condition(mut self, input: crate::model::StoppingCondition) -> Self {
            self.stopping_condition = Some(input);
            self
        }
        /// <p>Specifies a limit to how long a model training job can run. It also specifies how long a managed Spot training job has to complete. When the job reaches the time limit, SageMaker ends the training job. Use this API to cap model training costs.</p>
        /// <p>To stop a job, SageMaker sends the algorithm the SIGTERM signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts.</p>
        pub fn set_stopping_condition(
            mut self,
            input: std::option::Option<crate::model::StoppingCondition>,
        ) -> Self {
            self.stopping_condition = input;
            self
        }
        /// Consumes the builder and constructs a [`TrainingJobDefinition`](crate::model::TrainingJobDefinition).
        pub fn build(self) -> crate::model::TrainingJobDefinition {
            crate::model::TrainingJobDefinition {
                training_input_mode: self.training_input_mode,
                hyper_parameters: self.hyper_parameters,
                input_data_config: self.input_data_config,
                output_data_config: self.output_data_config,
                resource_config: self.resource_config,
                stopping_condition: self.stopping_condition,
            }
        }
    }
}
impl TrainingJobDefinition {
    /// Creates a new builder-style object to manufacture [`TrainingJobDefinition`](crate::model::TrainingJobDefinition).
    pub fn builder() -> crate::model::training_job_definition::Builder {
        crate::model::training_job_definition::Builder::default()
    }
}

/// <p>Defines how the algorithm is used for a training job.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct TrainingSpecification {
    /// <p>The Amazon ECR registry path of the Docker image that contains the training algorithm.</p>
    #[doc(hidden)]
    pub training_image: std::option::Option<std::string::String>,
    /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
    #[doc(hidden)]
    pub training_image_digest: std::option::Option<std::string::String>,
    /// <p>A list of the <code>HyperParameterSpecification</code> objects, that define the supported hyperparameters. This is required if the algorithm supports automatic model tuning.&gt;</p>
    #[doc(hidden)]
    pub supported_hyper_parameters:
        std::option::Option<std::vec::Vec<crate::model::HyperParameterSpecification>>,
    /// <p>A list of the instance types that this algorithm can use for training.</p>
    #[doc(hidden)]
    pub supported_training_instance_types:
        std::option::Option<std::vec::Vec<crate::model::TrainingInstanceType>>,
    /// <p>Indicates whether the algorithm supports distributed training. If set to false, buyers can't request more than one instance during training.</p>
    #[doc(hidden)]
    pub supports_distributed_training: bool,
    /// <p>A list of <code>MetricDefinition</code> objects, which are used for parsing metrics generated by the algorithm.</p>
    #[doc(hidden)]
    pub metric_definitions: std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
    /// <p>A list of <code>ChannelSpecification</code> objects, which specify the input sources to be used by the algorithm.</p>
    #[doc(hidden)]
    pub training_channels: std::option::Option<std::vec::Vec<crate::model::ChannelSpecification>>,
    /// <p>A list of the metrics that the algorithm emits that can be used as the objective metric in a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub supported_tuning_job_objective_metrics:
        std::option::Option<std::vec::Vec<crate::model::HyperParameterTuningJobObjective>>,
}
impl TrainingSpecification {
    /// <p>The Amazon ECR registry path of the Docker image that contains the training algorithm.</p>
    pub fn training_image(&self) -> std::option::Option<&str> {
        self.training_image.as_deref()
    }
    /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
    pub fn training_image_digest(&self) -> std::option::Option<&str> {
        self.training_image_digest.as_deref()
    }
    /// <p>A list of the <code>HyperParameterSpecification</code> objects, that define the supported hyperparameters. This is required if the algorithm supports automatic model tuning.&gt;</p>
    pub fn supported_hyper_parameters(
        &self,
    ) -> std::option::Option<&[crate::model::HyperParameterSpecification]> {
        self.supported_hyper_parameters.as_deref()
    }
    /// <p>A list of the instance types that this algorithm can use for training.</p>
    pub fn supported_training_instance_types(
        &self,
    ) -> std::option::Option<&[crate::model::TrainingInstanceType]> {
        self.supported_training_instance_types.as_deref()
    }
    /// <p>Indicates whether the algorithm supports distributed training. If set to false, buyers can't request more than one instance during training.</p>
    pub fn supports_distributed_training(&self) -> bool {
        self.supports_distributed_training
    }
    /// <p>A list of <code>MetricDefinition</code> objects, which are used for parsing metrics generated by the algorithm.</p>
    pub fn metric_definitions(&self) -> std::option::Option<&[crate::model::MetricDefinition]> {
        self.metric_definitions.as_deref()
    }
    /// <p>A list of <code>ChannelSpecification</code> objects, which specify the input sources to be used by the algorithm.</p>
    pub fn training_channels(&self) -> std::option::Option<&[crate::model::ChannelSpecification]> {
        self.training_channels.as_deref()
    }
    /// <p>A list of the metrics that the algorithm emits that can be used as the objective metric in a hyperparameter tuning job.</p>
    pub fn supported_tuning_job_objective_metrics(
        &self,
    ) -> std::option::Option<&[crate::model::HyperParameterTuningJobObjective]> {
        self.supported_tuning_job_objective_metrics.as_deref()
    }
}
/// See [`TrainingSpecification`](crate::model::TrainingSpecification).
pub mod training_specification {

    /// A builder for [`TrainingSpecification`](crate::model::TrainingSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) training_image: std::option::Option<std::string::String>,
        pub(crate) training_image_digest: std::option::Option<std::string::String>,
        pub(crate) supported_hyper_parameters:
            std::option::Option<std::vec::Vec<crate::model::HyperParameterSpecification>>,
        pub(crate) supported_training_instance_types:
            std::option::Option<std::vec::Vec<crate::model::TrainingInstanceType>>,
        pub(crate) supports_distributed_training: std::option::Option<bool>,
        pub(crate) metric_definitions:
            std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
        pub(crate) training_channels:
            std::option::Option<std::vec::Vec<crate::model::ChannelSpecification>>,
        pub(crate) supported_tuning_job_objective_metrics:
            std::option::Option<std::vec::Vec<crate::model::HyperParameterTuningJobObjective>>,
    }
    impl Builder {
        /// <p>The Amazon ECR registry path of the Docker image that contains the training algorithm.</p>
        pub fn training_image(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_image = Some(input.into());
            self
        }
        /// <p>The Amazon ECR registry path of the Docker image that contains the training algorithm.</p>
        pub fn set_training_image(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_image = input;
            self
        }
        /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
        pub fn training_image_digest(mut self, input: impl Into<std::string::String>) -> Self {
            self.training_image_digest = Some(input.into());
            self
        }
        /// <p>An MD5 hash of the training algorithm that identifies the Docker image used for training.</p>
        pub fn set_training_image_digest(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.training_image_digest = input;
            self
        }
        /// Appends an item to `supported_hyper_parameters`.
        ///
        /// To override the contents of this collection use [`set_supported_hyper_parameters`](Self::set_supported_hyper_parameters).
        ///
        /// <p>A list of the <code>HyperParameterSpecification</code> objects, that define the supported hyperparameters. This is required if the algorithm supports automatic model tuning.&gt;</p>
        pub fn supported_hyper_parameters(
            mut self,
            input: crate::model::HyperParameterSpecification,
        ) -> Self {
            let mut v = self.supported_hyper_parameters.unwrap_or_default();
            v.push(input);
            self.supported_hyper_parameters = Some(v);
            self
        }
        /// <p>A list of the <code>HyperParameterSpecification</code> objects, that define the supported hyperparameters. This is required if the algorithm supports automatic model tuning.&gt;</p>
        pub fn set_supported_hyper_parameters(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::HyperParameterSpecification>>,
        ) -> Self {
            self.supported_hyper_parameters = input;
            self
        }
        /// Appends an item to `supported_training_instance_types`.
        ///
        /// To override the contents of this collection use [`set_supported_training_instance_types`](Self::set_supported_training_instance_types).
        ///
        /// <p>A list of the instance types that this algorithm can use for training.</p>
        pub fn supported_training_instance_types(
            mut self,
            input: crate::model::TrainingInstanceType,
        ) -> Self {
            let mut v = self.supported_training_instance_types.unwrap_or_default();
            v.push(input);
            self.supported_training_instance_types = Some(v);
            self
        }
        /// <p>A list of the instance types that this algorithm can use for training.</p>
        pub fn set_supported_training_instance_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::TrainingInstanceType>>,
        ) -> Self {
            self.supported_training_instance_types = input;
            self
        }
        /// <p>Indicates whether the algorithm supports distributed training. If set to false, buyers can't request more than one instance during training.</p>
        pub fn supports_distributed_training(mut self, input: bool) -> Self {
            self.supports_distributed_training = Some(input);
            self
        }
        /// <p>Indicates whether the algorithm supports distributed training. If set to false, buyers can't request more than one instance during training.</p>
        pub fn set_supports_distributed_training(
            mut self,
            input: std::option::Option<bool>,
        ) -> Self {
            self.supports_distributed_training = input;
            self
        }
        /// Appends an item to `metric_definitions`.
        ///
        /// To override the contents of this collection use [`set_metric_definitions`](Self::set_metric_definitions).
        ///
        /// <p>A list of <code>MetricDefinition</code> objects, which are used for parsing metrics generated by the algorithm.</p>
        pub fn metric_definitions(mut self, input: crate::model::MetricDefinition) -> Self {
            let mut v = self.metric_definitions.unwrap_or_default();
            v.push(input);
            self.metric_definitions = Some(v);
            self
        }
        /// <p>A list of <code>MetricDefinition</code> objects, which are used for parsing metrics generated by the algorithm.</p>
        pub fn set_metric_definitions(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::MetricDefinition>>,
        ) -> Self {
            self.metric_definitions = input;
            self
        }
        /// Appends an item to `training_channels`.
        ///
        /// To override the contents of this collection use [`set_training_channels`](Self::set_training_channels).
        ///
        /// <p>A list of <code>ChannelSpecification</code> objects, which specify the input sources to be used by the algorithm.</p>
        pub fn training_channels(mut self, input: crate::model::ChannelSpecification) -> Self {
            let mut v = self.training_channels.unwrap_or_default();
            v.push(input);
            self.training_channels = Some(v);
            self
        }
        /// <p>A list of <code>ChannelSpecification</code> objects, which specify the input sources to be used by the algorithm.</p>
        pub fn set_training_channels(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::ChannelSpecification>>,
        ) -> Self {
            self.training_channels = input;
            self
        }
        /// Appends an item to `supported_tuning_job_objective_metrics`.
        ///
        /// To override the contents of this collection use [`set_supported_tuning_job_objective_metrics`](Self::set_supported_tuning_job_objective_metrics).
        ///
        /// <p>A list of the metrics that the algorithm emits that can be used as the objective metric in a hyperparameter tuning job.</p>
        pub fn supported_tuning_job_objective_metrics(
            mut self,
            input: crate::model::HyperParameterTuningJobObjective,
        ) -> Self {
            let mut v = self
                .supported_tuning_job_objective_metrics
                .unwrap_or_default();
            v.push(input);
            self.supported_tuning_job_objective_metrics = Some(v);
            self
        }
        /// <p>A list of the metrics that the algorithm emits that can be used as the objective metric in a hyperparameter tuning job.</p>
        pub fn set_supported_tuning_job_objective_metrics(
            mut self,
            input: std::option::Option<
                std::vec::Vec<crate::model::HyperParameterTuningJobObjective>,
            >,
        ) -> Self {
            self.supported_tuning_job_objective_metrics = input;
            self
        }
        /// Consumes the builder and constructs a [`TrainingSpecification`](crate::model::TrainingSpecification).
        pub fn build(self) -> crate::model::TrainingSpecification {
            crate::model::TrainingSpecification {
                training_image: self.training_image,
                training_image_digest: self.training_image_digest,
                supported_hyper_parameters: self.supported_hyper_parameters,
                supported_training_instance_types: self.supported_training_instance_types,
                supports_distributed_training: self
                    .supports_distributed_training
                    .unwrap_or_default(),
                metric_definitions: self.metric_definitions,
                training_channels: self.training_channels,
                supported_tuning_job_objective_metrics: self.supported_tuning_job_objective_metrics,
            }
        }
    }
}
impl TrainingSpecification {
    /// Creates a new builder-style object to manufacture [`TrainingSpecification`](crate::model::TrainingSpecification).
    pub fn builder() -> crate::model::training_specification::Builder {
        crate::model::training_specification::Builder::default()
    }
}

/// <p>Defines a named input source, called a channel, to be used by an algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ChannelSpecification {
    /// <p>The name of the channel.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>A brief description of the channel.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>Indicates whether the channel is required by the algorithm.</p>
    #[doc(hidden)]
    pub is_required: bool,
    /// <p>The supported MIME types for the data.</p>
    #[doc(hidden)]
    pub supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
    /// <p>The allowed compression types, if data compression is used.</p>
    #[doc(hidden)]
    pub supported_compression_types:
        std::option::Option<std::vec::Vec<crate::model::CompressionType>>,
    /// <p>The allowed input mode, either FILE or PIPE.</p>
    /// <p>In FILE mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode.</p>
    /// <p>In PIPE mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
    #[doc(hidden)]
    pub supported_input_modes: std::option::Option<std::vec::Vec<crate::model::TrainingInputMode>>,
}
impl ChannelSpecification {
    /// <p>The name of the channel.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>A brief description of the channel.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>Indicates whether the channel is required by the algorithm.</p>
    pub fn is_required(&self) -> bool {
        self.is_required
    }
    /// <p>The supported MIME types for the data.</p>
    pub fn supported_content_types(&self) -> std::option::Option<&[std::string::String]> {
        self.supported_content_types.as_deref()
    }
    /// <p>The allowed compression types, if data compression is used.</p>
    pub fn supported_compression_types(
        &self,
    ) -> std::option::Option<&[crate::model::CompressionType]> {
        self.supported_compression_types.as_deref()
    }
    /// <p>The allowed input mode, either FILE or PIPE.</p>
    /// <p>In FILE mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode.</p>
    /// <p>In PIPE mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
    pub fn supported_input_modes(&self) -> std::option::Option<&[crate::model::TrainingInputMode]> {
        self.supported_input_modes.as_deref()
    }
}
/// See [`ChannelSpecification`](crate::model::ChannelSpecification).
pub mod channel_specification {

    /// A builder for [`ChannelSpecification`](crate::model::ChannelSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) is_required: std::option::Option<bool>,
        pub(crate) supported_content_types: std::option::Option<std::vec::Vec<std::string::String>>,
        pub(crate) supported_compression_types:
            std::option::Option<std::vec::Vec<crate::model::CompressionType>>,
        pub(crate) supported_input_modes:
            std::option::Option<std::vec::Vec<crate::model::TrainingInputMode>>,
    }
    impl Builder {
        /// <p>The name of the channel.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of the channel.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>A brief description of the channel.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>A brief description of the channel.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>Indicates whether the channel is required by the algorithm.</p>
        pub fn is_required(mut self, input: bool) -> Self {
            self.is_required = Some(input);
            self
        }
        /// <p>Indicates whether the channel is required by the algorithm.</p>
        pub fn set_is_required(mut self, input: std::option::Option<bool>) -> Self {
            self.is_required = input;
            self
        }
        /// Appends an item to `supported_content_types`.
        ///
        /// To override the contents of this collection use [`set_supported_content_types`](Self::set_supported_content_types).
        ///
        /// <p>The supported MIME types for the data.</p>
        pub fn supported_content_types(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.supported_content_types.unwrap_or_default();
            v.push(input.into());
            self.supported_content_types = Some(v);
            self
        }
        /// <p>The supported MIME types for the data.</p>
        pub fn set_supported_content_types(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.supported_content_types = input;
            self
        }
        /// Appends an item to `supported_compression_types`.
        ///
        /// To override the contents of this collection use [`set_supported_compression_types`](Self::set_supported_compression_types).
        ///
        /// <p>The allowed compression types, if data compression is used.</p>
        pub fn supported_compression_types(mut self, input: crate::model::CompressionType) -> Self {
            let mut v = self.supported_compression_types.unwrap_or_default();
            v.push(input);
            self.supported_compression_types = Some(v);
            self
        }
        /// <p>The allowed compression types, if data compression is used.</p>
        pub fn set_supported_compression_types(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::CompressionType>>,
        ) -> Self {
            self.supported_compression_types = input;
            self
        }
        /// Appends an item to `supported_input_modes`.
        ///
        /// To override the contents of this collection use [`set_supported_input_modes`](Self::set_supported_input_modes).
        ///
        /// <p>The allowed input mode, either FILE or PIPE.</p>
        /// <p>In FILE mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode.</p>
        /// <p>In PIPE mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
        pub fn supported_input_modes(mut self, input: crate::model::TrainingInputMode) -> Self {
            let mut v = self.supported_input_modes.unwrap_or_default();
            v.push(input);
            self.supported_input_modes = Some(v);
            self
        }
        /// <p>The allowed input mode, either FILE or PIPE.</p>
        /// <p>In FILE mode, Amazon SageMaker copies the data from the input source onto the local Amazon Elastic Block Store (Amazon EBS) volumes before starting your training algorithm. This is the most commonly used input mode.</p>
        /// <p>In PIPE mode, Amazon SageMaker streams input data from the source directly to your algorithm without using the EBS volume.</p>
        pub fn set_supported_input_modes(
            mut self,
            input: std::option::Option<std::vec::Vec<crate::model::TrainingInputMode>>,
        ) -> Self {
            self.supported_input_modes = input;
            self
        }
        /// Consumes the builder and constructs a [`ChannelSpecification`](crate::model::ChannelSpecification).
        pub fn build(self) -> crate::model::ChannelSpecification {
            crate::model::ChannelSpecification {
                name: self.name,
                description: self.description,
                is_required: self.is_required.unwrap_or_default(),
                supported_content_types: self.supported_content_types,
                supported_compression_types: self.supported_compression_types,
                supported_input_modes: self.supported_input_modes,
            }
        }
    }
}
impl ChannelSpecification {
    /// Creates a new builder-style object to manufacture [`ChannelSpecification`](crate::model::ChannelSpecification).
    pub fn builder() -> crate::model::channel_specification::Builder {
        crate::model::channel_specification::Builder::default()
    }
}

/// <p>Defines a hyperparameter to be used by an algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct HyperParameterSpecification {
    /// <p>The name of this hyperparameter. The name must be unique.</p>
    #[doc(hidden)]
    pub name: std::option::Option<std::string::String>,
    /// <p>A brief description of the hyperparameter.</p>
    #[doc(hidden)]
    pub description: std::option::Option<std::string::String>,
    /// <p>The type of this hyperparameter. The valid types are <code>Integer</code>, <code>Continuous</code>, <code>Categorical</code>, and <code>FreeText</code>.</p>
    #[doc(hidden)]
    pub r#type: std::option::Option<crate::model::ParameterType>,
    /// <p>The allowed range for this hyperparameter.</p>
    #[doc(hidden)]
    pub range: std::option::Option<crate::model::ParameterRange>,
    /// <p>Indicates whether this hyperparameter is tunable in a hyperparameter tuning job.</p>
    #[doc(hidden)]
    pub is_tunable: bool,
    /// <p>Indicates whether this hyperparameter is required.</p>
    #[doc(hidden)]
    pub is_required: bool,
    /// <p>The default value for this hyperparameter. If a default value is specified, a hyperparameter cannot be required.</p>
    #[doc(hidden)]
    pub default_value: std::option::Option<std::string::String>,
}
impl HyperParameterSpecification {
    /// <p>The name of this hyperparameter. The name must be unique.</p>
    pub fn name(&self) -> std::option::Option<&str> {
        self.name.as_deref()
    }
    /// <p>A brief description of the hyperparameter.</p>
    pub fn description(&self) -> std::option::Option<&str> {
        self.description.as_deref()
    }
    /// <p>The type of this hyperparameter. The valid types are <code>Integer</code>, <code>Continuous</code>, <code>Categorical</code>, and <code>FreeText</code>.</p>
    pub fn r#type(&self) -> std::option::Option<&crate::model::ParameterType> {
        self.r#type.as_ref()
    }
    /// <p>The allowed range for this hyperparameter.</p>
    pub fn range(&self) -> std::option::Option<&crate::model::ParameterRange> {
        self.range.as_ref()
    }
    /// <p>Indicates whether this hyperparameter is tunable in a hyperparameter tuning job.</p>
    pub fn is_tunable(&self) -> bool {
        self.is_tunable
    }
    /// <p>Indicates whether this hyperparameter is required.</p>
    pub fn is_required(&self) -> bool {
        self.is_required
    }
    /// <p>The default value for this hyperparameter. If a default value is specified, a hyperparameter cannot be required.</p>
    pub fn default_value(&self) -> std::option::Option<&str> {
        self.default_value.as_deref()
    }
}
/// See [`HyperParameterSpecification`](crate::model::HyperParameterSpecification).
pub mod hyper_parameter_specification {

    /// A builder for [`HyperParameterSpecification`](crate::model::HyperParameterSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) name: std::option::Option<std::string::String>,
        pub(crate) description: std::option::Option<std::string::String>,
        pub(crate) r#type: std::option::Option<crate::model::ParameterType>,
        pub(crate) range: std::option::Option<crate::model::ParameterRange>,
        pub(crate) is_tunable: std::option::Option<bool>,
        pub(crate) is_required: std::option::Option<bool>,
        pub(crate) default_value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The name of this hyperparameter. The name must be unique.</p>
        pub fn name(mut self, input: impl Into<std::string::String>) -> Self {
            self.name = Some(input.into());
            self
        }
        /// <p>The name of this hyperparameter. The name must be unique.</p>
        pub fn set_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.name = input;
            self
        }
        /// <p>A brief description of the hyperparameter.</p>
        pub fn description(mut self, input: impl Into<std::string::String>) -> Self {
            self.description = Some(input.into());
            self
        }
        /// <p>A brief description of the hyperparameter.</p>
        pub fn set_description(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.description = input;
            self
        }
        /// <p>The type of this hyperparameter. The valid types are <code>Integer</code>, <code>Continuous</code>, <code>Categorical</code>, and <code>FreeText</code>.</p>
        pub fn r#type(mut self, input: crate::model::ParameterType) -> Self {
            self.r#type = Some(input);
            self
        }
        /// <p>The type of this hyperparameter. The valid types are <code>Integer</code>, <code>Continuous</code>, <code>Categorical</code>, and <code>FreeText</code>.</p>
        pub fn set_type(mut self, input: std::option::Option<crate::model::ParameterType>) -> Self {
            self.r#type = input;
            self
        }
        /// <p>The allowed range for this hyperparameter.</p>
        pub fn range(mut self, input: crate::model::ParameterRange) -> Self {
            self.range = Some(input);
            self
        }
        /// <p>The allowed range for this hyperparameter.</p>
        pub fn set_range(
            mut self,
            input: std::option::Option<crate::model::ParameterRange>,
        ) -> Self {
            self.range = input;
            self
        }
        /// <p>Indicates whether this hyperparameter is tunable in a hyperparameter tuning job.</p>
        pub fn is_tunable(mut self, input: bool) -> Self {
            self.is_tunable = Some(input);
            self
        }
        /// <p>Indicates whether this hyperparameter is tunable in a hyperparameter tuning job.</p>
        pub fn set_is_tunable(mut self, input: std::option::Option<bool>) -> Self {
            self.is_tunable = input;
            self
        }
        /// <p>Indicates whether this hyperparameter is required.</p>
        pub fn is_required(mut self, input: bool) -> Self {
            self.is_required = Some(input);
            self
        }
        /// <p>Indicates whether this hyperparameter is required.</p>
        pub fn set_is_required(mut self, input: std::option::Option<bool>) -> Self {
            self.is_required = input;
            self
        }
        /// <p>The default value for this hyperparameter. If a default value is specified, a hyperparameter cannot be required.</p>
        pub fn default_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.default_value = Some(input.into());
            self
        }
        /// <p>The default value for this hyperparameter. If a default value is specified, a hyperparameter cannot be required.</p>
        pub fn set_default_value(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.default_value = input;
            self
        }
        /// Consumes the builder and constructs a [`HyperParameterSpecification`](crate::model::HyperParameterSpecification).
        pub fn build(self) -> crate::model::HyperParameterSpecification {
            crate::model::HyperParameterSpecification {
                name: self.name,
                description: self.description,
                r#type: self.r#type,
                range: self.range,
                is_tunable: self.is_tunable.unwrap_or_default(),
                is_required: self.is_required.unwrap_or_default(),
                default_value: self.default_value,
            }
        }
    }
}
impl HyperParameterSpecification {
    /// Creates a new builder-style object to manufacture [`HyperParameterSpecification`](crate::model::HyperParameterSpecification).
    pub fn builder() -> crate::model::hyper_parameter_specification::Builder {
        crate::model::hyper_parameter_specification::Builder::default()
    }
}

/// <p>Defines the possible values for categorical, continuous, and integer hyperparameters to be used by an algorithm.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ParameterRange {
    /// <p>A <code>IntegerParameterRangeSpecification</code> object that defines the possible values for an integer hyperparameter.</p>
    #[doc(hidden)]
    pub integer_parameter_range_specification:
        std::option::Option<crate::model::IntegerParameterRangeSpecification>,
    /// <p>A <code>ContinuousParameterRangeSpecification</code> object that defines the possible values for a continuous hyperparameter.</p>
    #[doc(hidden)]
    pub continuous_parameter_range_specification:
        std::option::Option<crate::model::ContinuousParameterRangeSpecification>,
    /// <p>A <code>CategoricalParameterRangeSpecification</code> object that defines the possible values for a categorical hyperparameter.</p>
    #[doc(hidden)]
    pub categorical_parameter_range_specification:
        std::option::Option<crate::model::CategoricalParameterRangeSpecification>,
}
impl ParameterRange {
    /// <p>A <code>IntegerParameterRangeSpecification</code> object that defines the possible values for an integer hyperparameter.</p>
    pub fn integer_parameter_range_specification(
        &self,
    ) -> std::option::Option<&crate::model::IntegerParameterRangeSpecification> {
        self.integer_parameter_range_specification.as_ref()
    }
    /// <p>A <code>ContinuousParameterRangeSpecification</code> object that defines the possible values for a continuous hyperparameter.</p>
    pub fn continuous_parameter_range_specification(
        &self,
    ) -> std::option::Option<&crate::model::ContinuousParameterRangeSpecification> {
        self.continuous_parameter_range_specification.as_ref()
    }
    /// <p>A <code>CategoricalParameterRangeSpecification</code> object that defines the possible values for a categorical hyperparameter.</p>
    pub fn categorical_parameter_range_specification(
        &self,
    ) -> std::option::Option<&crate::model::CategoricalParameterRangeSpecification> {
        self.categorical_parameter_range_specification.as_ref()
    }
}
/// See [`ParameterRange`](crate::model::ParameterRange).
pub mod parameter_range {

    /// A builder for [`ParameterRange`](crate::model::ParameterRange).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) integer_parameter_range_specification:
            std::option::Option<crate::model::IntegerParameterRangeSpecification>,
        pub(crate) continuous_parameter_range_specification:
            std::option::Option<crate::model::ContinuousParameterRangeSpecification>,
        pub(crate) categorical_parameter_range_specification:
            std::option::Option<crate::model::CategoricalParameterRangeSpecification>,
    }
    impl Builder {
        /// <p>A <code>IntegerParameterRangeSpecification</code> object that defines the possible values for an integer hyperparameter.</p>
        pub fn integer_parameter_range_specification(
            mut self,
            input: crate::model::IntegerParameterRangeSpecification,
        ) -> Self {
            self.integer_parameter_range_specification = Some(input);
            self
        }
        /// <p>A <code>IntegerParameterRangeSpecification</code> object that defines the possible values for an integer hyperparameter.</p>
        pub fn set_integer_parameter_range_specification(
            mut self,
            input: std::option::Option<crate::model::IntegerParameterRangeSpecification>,
        ) -> Self {
            self.integer_parameter_range_specification = input;
            self
        }
        /// <p>A <code>ContinuousParameterRangeSpecification</code> object that defines the possible values for a continuous hyperparameter.</p>
        pub fn continuous_parameter_range_specification(
            mut self,
            input: crate::model::ContinuousParameterRangeSpecification,
        ) -> Self {
            self.continuous_parameter_range_specification = Some(input);
            self
        }
        /// <p>A <code>ContinuousParameterRangeSpecification</code> object that defines the possible values for a continuous hyperparameter.</p>
        pub fn set_continuous_parameter_range_specification(
            mut self,
            input: std::option::Option<crate::model::ContinuousParameterRangeSpecification>,
        ) -> Self {
            self.continuous_parameter_range_specification = input;
            self
        }
        /// <p>A <code>CategoricalParameterRangeSpecification</code> object that defines the possible values for a categorical hyperparameter.</p>
        pub fn categorical_parameter_range_specification(
            mut self,
            input: crate::model::CategoricalParameterRangeSpecification,
        ) -> Self {
            self.categorical_parameter_range_specification = Some(input);
            self
        }
        /// <p>A <code>CategoricalParameterRangeSpecification</code> object that defines the possible values for a categorical hyperparameter.</p>
        pub fn set_categorical_parameter_range_specification(
            mut self,
            input: std::option::Option<crate::model::CategoricalParameterRangeSpecification>,
        ) -> Self {
            self.categorical_parameter_range_specification = input;
            self
        }
        /// Consumes the builder and constructs a [`ParameterRange`](crate::model::ParameterRange).
        pub fn build(self) -> crate::model::ParameterRange {
            crate::model::ParameterRange {
                integer_parameter_range_specification: self.integer_parameter_range_specification,
                continuous_parameter_range_specification: self
                    .continuous_parameter_range_specification,
                categorical_parameter_range_specification: self
                    .categorical_parameter_range_specification,
            }
        }
    }
}
impl ParameterRange {
    /// Creates a new builder-style object to manufacture [`ParameterRange`](crate::model::ParameterRange).
    pub fn builder() -> crate::model::parameter_range::Builder {
        crate::model::parameter_range::Builder::default()
    }
}

/// <p>Defines the possible values for a categorical hyperparameter.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct CategoricalParameterRangeSpecification {
    /// <p>The allowed categories for the hyperparameter.</p>
    #[doc(hidden)]
    pub values: std::option::Option<std::vec::Vec<std::string::String>>,
}
impl CategoricalParameterRangeSpecification {
    /// <p>The allowed categories for the hyperparameter.</p>
    pub fn values(&self) -> std::option::Option<&[std::string::String]> {
        self.values.as_deref()
    }
}
/// See [`CategoricalParameterRangeSpecification`](crate::model::CategoricalParameterRangeSpecification).
pub mod categorical_parameter_range_specification {

    /// A builder for [`CategoricalParameterRangeSpecification`](crate::model::CategoricalParameterRangeSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) values: std::option::Option<std::vec::Vec<std::string::String>>,
    }
    impl Builder {
        /// Appends an item to `values`.
        ///
        /// To override the contents of this collection use [`set_values`](Self::set_values).
        ///
        /// <p>The allowed categories for the hyperparameter.</p>
        pub fn values(mut self, input: impl Into<std::string::String>) -> Self {
            let mut v = self.values.unwrap_or_default();
            v.push(input.into());
            self.values = Some(v);
            self
        }
        /// <p>The allowed categories for the hyperparameter.</p>
        pub fn set_values(
            mut self,
            input: std::option::Option<std::vec::Vec<std::string::String>>,
        ) -> Self {
            self.values = input;
            self
        }
        /// Consumes the builder and constructs a [`CategoricalParameterRangeSpecification`](crate::model::CategoricalParameterRangeSpecification).
        pub fn build(self) -> crate::model::CategoricalParameterRangeSpecification {
            crate::model::CategoricalParameterRangeSpecification {
                values: self.values,
            }
        }
    }
}
impl CategoricalParameterRangeSpecification {
    /// Creates a new builder-style object to manufacture [`CategoricalParameterRangeSpecification`](crate::model::CategoricalParameterRangeSpecification).
    pub fn builder() -> crate::model::categorical_parameter_range_specification::Builder {
        crate::model::categorical_parameter_range_specification::Builder::default()
    }
}

/// <p>Defines the possible values for a continuous hyperparameter.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct ContinuousParameterRangeSpecification {
    /// <p>The minimum floating-point value allowed.</p>
    #[doc(hidden)]
    pub min_value: std::option::Option<std::string::String>,
    /// <p>The maximum floating-point value allowed.</p>
    #[doc(hidden)]
    pub max_value: std::option::Option<std::string::String>,
}
impl ContinuousParameterRangeSpecification {
    /// <p>The minimum floating-point value allowed.</p>
    pub fn min_value(&self) -> std::option::Option<&str> {
        self.min_value.as_deref()
    }
    /// <p>The maximum floating-point value allowed.</p>
    pub fn max_value(&self) -> std::option::Option<&str> {
        self.max_value.as_deref()
    }
}
/// See [`ContinuousParameterRangeSpecification`](crate::model::ContinuousParameterRangeSpecification).
pub mod continuous_parameter_range_specification {

    /// A builder for [`ContinuousParameterRangeSpecification`](crate::model::ContinuousParameterRangeSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) min_value: std::option::Option<std::string::String>,
        pub(crate) max_value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The minimum floating-point value allowed.</p>
        pub fn min_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.min_value = Some(input.into());
            self
        }
        /// <p>The minimum floating-point value allowed.</p>
        pub fn set_min_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.min_value = input;
            self
        }
        /// <p>The maximum floating-point value allowed.</p>
        pub fn max_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.max_value = Some(input.into());
            self
        }
        /// <p>The maximum floating-point value allowed.</p>
        pub fn set_max_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.max_value = input;
            self
        }
        /// Consumes the builder and constructs a [`ContinuousParameterRangeSpecification`](crate::model::ContinuousParameterRangeSpecification).
        pub fn build(self) -> crate::model::ContinuousParameterRangeSpecification {
            crate::model::ContinuousParameterRangeSpecification {
                min_value: self.min_value,
                max_value: self.max_value,
            }
        }
    }
}
impl ContinuousParameterRangeSpecification {
    /// Creates a new builder-style object to manufacture [`ContinuousParameterRangeSpecification`](crate::model::ContinuousParameterRangeSpecification).
    pub fn builder() -> crate::model::continuous_parameter_range_specification::Builder {
        crate::model::continuous_parameter_range_specification::Builder::default()
    }
}

/// <p>Defines the possible values for an integer hyperparameter.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct IntegerParameterRangeSpecification {
    /// <p>The minimum integer value allowed.</p>
    #[doc(hidden)]
    pub min_value: std::option::Option<std::string::String>,
    /// <p>The maximum integer value allowed.</p>
    #[doc(hidden)]
    pub max_value: std::option::Option<std::string::String>,
}
impl IntegerParameterRangeSpecification {
    /// <p>The minimum integer value allowed.</p>
    pub fn min_value(&self) -> std::option::Option<&str> {
        self.min_value.as_deref()
    }
    /// <p>The maximum integer value allowed.</p>
    pub fn max_value(&self) -> std::option::Option<&str> {
        self.max_value.as_deref()
    }
}
/// See [`IntegerParameterRangeSpecification`](crate::model::IntegerParameterRangeSpecification).
pub mod integer_parameter_range_specification {

    /// A builder for [`IntegerParameterRangeSpecification`](crate::model::IntegerParameterRangeSpecification).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) min_value: std::option::Option<std::string::String>,
        pub(crate) max_value: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>The minimum integer value allowed.</p>
        pub fn min_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.min_value = Some(input.into());
            self
        }
        /// <p>The minimum integer value allowed.</p>
        pub fn set_min_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.min_value = input;
            self
        }
        /// <p>The maximum integer value allowed.</p>
        pub fn max_value(mut self, input: impl Into<std::string::String>) -> Self {
            self.max_value = Some(input.into());
            self
        }
        /// <p>The maximum integer value allowed.</p>
        pub fn set_max_value(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.max_value = input;
            self
        }
        /// Consumes the builder and constructs a [`IntegerParameterRangeSpecification`](crate::model::IntegerParameterRangeSpecification).
        pub fn build(self) -> crate::model::IntegerParameterRangeSpecification {
            crate::model::IntegerParameterRangeSpecification {
                min_value: self.min_value,
                max_value: self.max_value,
            }
        }
    }
}
impl IntegerParameterRangeSpecification {
    /// Creates a new builder-style object to manufacture [`IntegerParameterRangeSpecification`](crate::model::IntegerParameterRangeSpecification).
    pub fn builder() -> crate::model::integer_parameter_range_specification::Builder {
        crate::model::integer_parameter_range_specification::Builder::default()
    }
}

/// When writing a match expression against `ParameterType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let parametertype = unimplemented!();
/// match parametertype {
///     ParameterType::Categorical => { /* ... */ },
///     ParameterType::Continuous => { /* ... */ },
///     ParameterType::FreeText => { /* ... */ },
///     ParameterType::Integer => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `parametertype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `ParameterType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `ParameterType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `ParameterType::NewFeature` is defined.
/// Specifically, when `parametertype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `ParameterType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum ParameterType {
    #[allow(missing_docs)] // documentation missing in model
    Categorical,
    #[allow(missing_docs)] // documentation missing in model
    Continuous,
    #[allow(missing_docs)] // documentation missing in model
    FreeText,
    #[allow(missing_docs)] // documentation missing in model
    Integer,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for ParameterType {
    fn from(s: &str) -> Self {
        match s {
            "Categorical" => ParameterType::Categorical,
            "Continuous" => ParameterType::Continuous,
            "FreeText" => ParameterType::FreeText,
            "Integer" => ParameterType::Integer,
            other => ParameterType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for ParameterType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(ParameterType::from(s))
    }
}
impl ParameterType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            ParameterType::Categorical => "Categorical",
            ParameterType::Continuous => "Continuous",
            ParameterType::FreeText => "FreeText",
            ParameterType::Integer => "Integer",
            ParameterType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Categorical", "Continuous", "FreeText", "Integer"]
    }
}
impl AsRef<str> for ParameterType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>The retention policy for data stored on an Amazon Elastic File System (EFS) volume.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RetentionPolicy {
    /// <p>The default is <code>Retain</code>, which specifies to keep the data stored on the EFS volume.</p>
    /// <p>Specify <code>Delete</code> to delete the data stored on the EFS volume.</p>
    #[doc(hidden)]
    pub home_efs_file_system: std::option::Option<crate::model::RetentionType>,
}
impl RetentionPolicy {
    /// <p>The default is <code>Retain</code>, which specifies to keep the data stored on the EFS volume.</p>
    /// <p>Specify <code>Delete</code> to delete the data stored on the EFS volume.</p>
    pub fn home_efs_file_system(&self) -> std::option::Option<&crate::model::RetentionType> {
        self.home_efs_file_system.as_ref()
    }
}
/// See [`RetentionPolicy`](crate::model::RetentionPolicy).
pub mod retention_policy {

    /// A builder for [`RetentionPolicy`](crate::model::RetentionPolicy).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) home_efs_file_system: std::option::Option<crate::model::RetentionType>,
    }
    impl Builder {
        /// <p>The default is <code>Retain</code>, which specifies to keep the data stored on the EFS volume.</p>
        /// <p>Specify <code>Delete</code> to delete the data stored on the EFS volume.</p>
        pub fn home_efs_file_system(mut self, input: crate::model::RetentionType) -> Self {
            self.home_efs_file_system = Some(input);
            self
        }
        /// <p>The default is <code>Retain</code>, which specifies to keep the data stored on the EFS volume.</p>
        /// <p>Specify <code>Delete</code> to delete the data stored on the EFS volume.</p>
        pub fn set_home_efs_file_system(
            mut self,
            input: std::option::Option<crate::model::RetentionType>,
        ) -> Self {
            self.home_efs_file_system = input;
            self
        }
        /// Consumes the builder and constructs a [`RetentionPolicy`](crate::model::RetentionPolicy).
        pub fn build(self) -> crate::model::RetentionPolicy {
            crate::model::RetentionPolicy {
                home_efs_file_system: self.home_efs_file_system,
            }
        }
    }
}
impl RetentionPolicy {
    /// Creates a new builder-style object to manufacture [`RetentionPolicy`](crate::model::RetentionPolicy).
    pub fn builder() -> crate::model::retention_policy::Builder {
        crate::model::retention_policy::Builder::default()
    }
}

/// When writing a match expression against `RetentionType`, it is important to ensure
/// your code is forward-compatible. That is, if a match arm handles a case for a
/// feature that is supported by the service but has not been represented as an enum
/// variant in a current version of SDK, your code should continue to work when you
/// upgrade SDK to a future version in which the enum does include a variant for that
/// feature.
///
/// Here is an example of how you can make a match expression forward-compatible:
///
/// ```text
/// # let retentiontype = unimplemented!();
/// match retentiontype {
///     RetentionType::Delete => { /* ... */ },
///     RetentionType::Retain => { /* ... */ },
///     other @ _ if other.as_str() == "NewFeature" => { /* handles a case for `NewFeature` */ },
///     _ => { /* ... */ },
/// }
/// ```
/// The above code demonstrates that when `retentiontype` represents
/// `NewFeature`, the execution path will lead to the second last match arm,
/// even though the enum does not contain a variant `RetentionType::NewFeature`
/// in the current version of SDK. The reason is that the variable `other`,
/// created by the `@` operator, is bound to
/// `RetentionType::Unknown(UnknownVariantValue("NewFeature".to_owned()))`
/// and calling `as_str` on it yields `"NewFeature"`.
/// This match expression is forward-compatible when executed with a newer
/// version of SDK where the variant `RetentionType::NewFeature` is defined.
/// Specifically, when `retentiontype` represents `NewFeature`,
/// the execution path will hit the second last match arm as before by virtue of
/// calling `as_str` on `RetentionType::NewFeature` also yielding `"NewFeature"`.
///
/// Explicitly matching on the `Unknown` variant should
/// be avoided for two reasons:
/// - The inner data `UnknownVariantValue` is opaque, and no further information can be extracted.
/// - It might inadvertently shadow other intended match arms.
#[allow(missing_docs)] // documentation missing in model
#[non_exhaustive]
#[derive(
    std::clone::Clone,
    std::cmp::Eq,
    std::cmp::Ord,
    std::cmp::PartialEq,
    std::cmp::PartialOrd,
    std::fmt::Debug,
    std::hash::Hash,
)]
pub enum RetentionType {
    #[allow(missing_docs)] // documentation missing in model
    Delete,
    #[allow(missing_docs)] // documentation missing in model
    Retain,
    /// `Unknown` contains new variants that have been added since this code was generated.
    Unknown(crate::types::UnknownVariantValue),
}
impl std::convert::From<&str> for RetentionType {
    fn from(s: &str) -> Self {
        match s {
            "Delete" => RetentionType::Delete,
            "Retain" => RetentionType::Retain,
            other => RetentionType::Unknown(crate::types::UnknownVariantValue(other.to_owned())),
        }
    }
}
impl std::str::FromStr for RetentionType {
    type Err = std::convert::Infallible;

    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
        Ok(RetentionType::from(s))
    }
}
impl RetentionType {
    /// Returns the `&str` value of the enum member.
    pub fn as_str(&self) -> &str {
        match self {
            RetentionType::Delete => "Delete",
            RetentionType::Retain => "Retain",
            RetentionType::Unknown(value) => value.as_str(),
        }
    }
    /// Returns all the `&str` values of the enum members.
    pub const fn values() -> &'static [&'static str] {
        &["Delete", "Retain"]
    }
}
impl AsRef<str> for RetentionType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}

/// <p>Provides information about the output configuration for the compiled model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobOutputConfig {
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt your output artifacts with Amazon S3 server-side encryption. The SageMaker execution role must have <code>kms:GenerateDataKey</code> permission.</p>
    /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :key/
    /// <key-id-12ab-34cd-56ef-1234567890ab>
    /// "
    /// </key-id-12ab-34cd-56ef-1234567890ab>
    /// </account>
    /// </region></code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :alias/
    /// <examplealias>
    /// "
    /// </examplealias>
    /// </account>
    /// </region></code> </p> </li>
    /// </ul>
    /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
    #[doc(hidden)]
    pub kms_key_id: std::option::Option<std::string::String>,
    /// <p>Provides information about the output configuration for the compiled model.</p>
    #[doc(hidden)]
    pub compiled_output_config:
        std::option::Option<crate::model::RecommendationJobCompiledOutputConfig>,
}
impl RecommendationJobOutputConfig {
    /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt your output artifacts with Amazon S3 server-side encryption. The SageMaker execution role must have <code>kms:GenerateDataKey</code> permission.</p>
    /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
    /// <ul>
    /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :key/
    /// <key-id-12ab-34cd-56ef-1234567890ab>
    /// "
    /// </key-id-12ab-34cd-56ef-1234567890ab>
    /// </account>
    /// </region></code> </p> </li>
    /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
    /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
    /// <region>
    /// :
    /// <account>
    /// :alias/
    /// <examplealias>
    /// "
    /// </examplealias>
    /// </account>
    /// </region></code> </p> </li>
    /// </ul>
    /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
    pub fn kms_key_id(&self) -> std::option::Option<&str> {
        self.kms_key_id.as_deref()
    }
    /// <p>Provides information about the output configuration for the compiled model.</p>
    pub fn compiled_output_config(
        &self,
    ) -> std::option::Option<&crate::model::RecommendationJobCompiledOutputConfig> {
        self.compiled_output_config.as_ref()
    }
}
/// See [`RecommendationJobOutputConfig`](crate::model::RecommendationJobOutputConfig).
pub mod recommendation_job_output_config {

    /// A builder for [`RecommendationJobOutputConfig`](crate::model::RecommendationJobOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) kms_key_id: std::option::Option<std::string::String>,
        pub(crate) compiled_output_config:
            std::option::Option<crate::model::RecommendationJobCompiledOutputConfig>,
    }
    impl Builder {
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt your output artifacts with Amazon S3 server-side encryption. The SageMaker execution role must have <code>kms:GenerateDataKey</code> permission.</p>
        /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :key/
        /// <key-id-12ab-34cd-56ef-1234567890ab>
        /// "
        /// </key-id-12ab-34cd-56ef-1234567890ab>
        /// </account>
        /// </region></code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :alias/
        /// <examplealias>
        /// "
        /// </examplealias>
        /// </account>
        /// </region></code> </p> </li>
        /// </ul>
        /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
        pub fn kms_key_id(mut self, input: impl Into<std::string::String>) -> Self {
            self.kms_key_id = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of a Amazon Web Services Key Management Service (Amazon Web Services KMS) key that Amazon SageMaker uses to encrypt your output artifacts with Amazon S3 server-side encryption. The SageMaker execution role must have <code>kms:GenerateDataKey</code> permission.</p>
        /// <p>The <code>KmsKeyId</code> can be any of the following formats:</p>
        /// <ul>
        /// <li> <p>// KMS Key ID</p> <p> <code>"1234abcd-12ab-34cd-56ef-1234567890ab"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :key/
        /// <key-id-12ab-34cd-56ef-1234567890ab>
        /// "
        /// </key-id-12ab-34cd-56ef-1234567890ab>
        /// </account>
        /// </region></code> </p> </li>
        /// <li> <p>// KMS Key Alias</p> <p> <code>"alias/ExampleAlias"</code> </p> </li>
        /// <li> <p>// Amazon Resource Name (ARN) of a KMS Key Alias</p> <p> <code>"arn:aws:kms:
        /// <region>
        /// :
        /// <account>
        /// :alias/
        /// <examplealias>
        /// "
        /// </examplealias>
        /// </account>
        /// </region></code> </p> </li>
        /// </ul>
        /// <p>For more information about key identifiers, see <a href="https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id">Key identifiers (KeyID)</a> in the Amazon Web Services Key Management Service (Amazon Web Services KMS) documentation.</p>
        pub fn set_kms_key_id(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.kms_key_id = input;
            self
        }
        /// <p>Provides information about the output configuration for the compiled model.</p>
        pub fn compiled_output_config(
            mut self,
            input: crate::model::RecommendationJobCompiledOutputConfig,
        ) -> Self {
            self.compiled_output_config = Some(input);
            self
        }
        /// <p>Provides information about the output configuration for the compiled model.</p>
        pub fn set_compiled_output_config(
            mut self,
            input: std::option::Option<crate::model::RecommendationJobCompiledOutputConfig>,
        ) -> Self {
            self.compiled_output_config = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobOutputConfig`](crate::model::RecommendationJobOutputConfig).
        pub fn build(self) -> crate::model::RecommendationJobOutputConfig {
            crate::model::RecommendationJobOutputConfig {
                kms_key_id: self.kms_key_id,
                compiled_output_config: self.compiled_output_config,
            }
        }
    }
}
impl RecommendationJobOutputConfig {
    /// Creates a new builder-style object to manufacture [`RecommendationJobOutputConfig`](crate::model::RecommendationJobOutputConfig).
    pub fn builder() -> crate::model::recommendation_job_output_config::Builder {
        crate::model::recommendation_job_output_config::Builder::default()
    }
}

/// <p>Provides information about the output configuration for the compiled model.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct RecommendationJobCompiledOutputConfig {
    /// <p>Identifies the Amazon S3 bucket where you want SageMaker to store the compiled model artifacts.</p>
    #[doc(hidden)]
    pub s3_output_uri: std::option::Option<std::string::String>,
}
impl RecommendationJobCompiledOutputConfig {
    /// <p>Identifies the Amazon S3 bucket where you want SageMaker to store the compiled model artifacts.</p>
    pub fn s3_output_uri(&self) -> std::option::Option<&str> {
        self.s3_output_uri.as_deref()
    }
}
/// See [`RecommendationJobCompiledOutputConfig`](crate::model::RecommendationJobCompiledOutputConfig).
pub mod recommendation_job_compiled_output_config {

    /// A builder for [`RecommendationJobCompiledOutputConfig`](crate::model::RecommendationJobCompiledOutputConfig).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) s3_output_uri: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p>Identifies the Amazon S3 bucket where you want SageMaker to store the compiled model artifacts.</p>
        pub fn s3_output_uri(mut self, input: impl Into<std::string::String>) -> Self {
            self.s3_output_uri = Some(input.into());
            self
        }
        /// <p>Identifies the Amazon S3 bucket where you want SageMaker to store the compiled model artifacts.</p>
        pub fn set_s3_output_uri(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.s3_output_uri = input;
            self
        }
        /// Consumes the builder and constructs a [`RecommendationJobCompiledOutputConfig`](crate::model::RecommendationJobCompiledOutputConfig).
        pub fn build(self) -> crate::model::RecommendationJobCompiledOutputConfig {
            crate::model::RecommendationJobCompiledOutputConfig {
                s3_output_uri: self.s3_output_uri,
            }
        }
    }
}
impl RecommendationJobCompiledOutputConfig {
    /// Creates a new builder-style object to manufacture [`RecommendationJobCompiledOutputConfig`](crate::model::RecommendationJobCompiledOutputConfig).
    pub fn builder() -> crate::model::recommendation_job_compiled_output_config::Builder {
        crate::model::recommendation_job_compiled_output_config::Builder::default()
    }
}

/// <p>Contains information about a stage in an edge deployment plan.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct DeploymentStage {
    /// <p>The name of the stage.</p>
    #[doc(hidden)]
    pub stage_name: std::option::Option<std::string::String>,
    /// <p>Configuration of the devices in the stage.</p>
    #[doc(hidden)]
    pub device_selection_config: std::option::Option<crate::model::DeviceSelectionConfig>,
    /// <p>Configuration of the deployment details.</p>
    #[doc(hidden)]
    pub deployment_config: std::option::Option<crate::model::EdgeDeploymentConfig>,
}
impl DeploymentStage {
    /// <p>The name of the stage.</p>
    pub fn stage_name(&self) -> std::option::Option<&str> {
        self.stage_name.as_deref()
    }
    /// <p>Configuration of the devices in the stage.</p>
    pub fn device_selection_config(
        &self,
    ) -> std::option::Option<&crate::model::DeviceSelectionConfig> {
        self.device_selection_config.as_ref()
    }
    /// <p>Configuration of the deployment details.</p>
    pub fn deployment_config(&self) -> std::option::Option<&crate::model::EdgeDeploymentConfig> {
        self.deployment_config.as_ref()
    }
}
/// See [`DeploymentStage`](crate::model::DeploymentStage).
pub mod deployment_stage {

    /// A builder for [`DeploymentStage`](crate::model::DeploymentStage).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) stage_name: std::option::Option<std::string::String>,
        pub(crate) device_selection_config:
            std::option::Option<crate::model::DeviceSelectionConfig>,
        pub(crate) deployment_config: std::option::Option<crate::model::EdgeDeploymentConfig>,
    }
    impl Builder {
        /// <p>The name of the stage.</p>
        pub fn stage_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.stage_name = Some(input.into());
            self
        }
        /// <p>The name of the stage.</p>
        pub fn set_stage_name(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.stage_name = input;
            self
        }
        /// <p>Configuration of the devices in the stage.</p>
        pub fn device_selection_config(
            mut self,
            input: crate::model::DeviceSelectionConfig,
        ) -> Self {
            self.device_selection_config = Some(input);
            self
        }
        /// <p>Configuration of the devices in the stage.</p>
        pub fn set_device_selection_config(
            mut self,
            input: std::option::Option<crate::model::DeviceSelectionConfig>,
        ) -> Self {
            self.device_selection_config = input;
            self
        }
        /// <p>Configuration of the deployment details.</p>
        pub fn deployment_config(mut self, input: crate::model::EdgeDeploymentConfig) -> Self {
            self.deployment_config = Some(input);
            self
        }
        /// <p>Configuration of the deployment details.</p>
        pub fn set_deployment_config(
            mut self,
            input: std::option::Option<crate::model::EdgeDeploymentConfig>,
        ) -> Self {
            self.deployment_config = input;
            self
        }
        /// Consumes the builder and constructs a [`DeploymentStage`](crate::model::DeploymentStage).
        pub fn build(self) -> crate::model::DeploymentStage {
            crate::model::DeploymentStage {
                stage_name: self.stage_name,
                device_selection_config: self.device_selection_config,
                deployment_config: self.deployment_config,
            }
        }
    }
}
impl DeploymentStage {
    /// Creates a new builder-style object to manufacture [`DeploymentStage`](crate::model::DeploymentStage).
    pub fn builder() -> crate::model::deployment_stage::Builder {
        crate::model::deployment_stage::Builder::default()
    }
}

/// <p>The error code and error description associated with the resource.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct BatchDescribeModelPackageError {
    /// <p></p>
    #[doc(hidden)]
    pub error_code: std::option::Option<std::string::String>,
    /// <p></p>
    #[doc(hidden)]
    pub error_response: std::option::Option<std::string::String>,
}
impl BatchDescribeModelPackageError {
    /// <p></p>
    pub fn error_code(&self) -> std::option::Option<&str> {
        self.error_code.as_deref()
    }
    /// <p></p>
    pub fn error_response(&self) -> std::option::Option<&str> {
        self.error_response.as_deref()
    }
}
/// See [`BatchDescribeModelPackageError`](crate::model::BatchDescribeModelPackageError).
pub mod batch_describe_model_package_error {

    /// A builder for [`BatchDescribeModelPackageError`](crate::model::BatchDescribeModelPackageError).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) error_code: std::option::Option<std::string::String>,
        pub(crate) error_response: std::option::Option<std::string::String>,
    }
    impl Builder {
        /// <p></p>
        pub fn error_code(mut self, input: impl Into<std::string::String>) -> Self {
            self.error_code = Some(input.into());
            self
        }
        /// <p></p>
        pub fn set_error_code(mut self, input: std::option::Option<std::string::String>) -> Self {
            self.error_code = input;
            self
        }
        /// <p></p>
        pub fn error_response(mut self, input: impl Into<std::string::String>) -> Self {
            self.error_response = Some(input.into());
            self
        }
        /// <p></p>
        pub fn set_error_response(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.error_response = input;
            self
        }
        /// Consumes the builder and constructs a [`BatchDescribeModelPackageError`](crate::model::BatchDescribeModelPackageError).
        pub fn build(self) -> crate::model::BatchDescribeModelPackageError {
            crate::model::BatchDescribeModelPackageError {
                error_code: self.error_code,
                error_response: self.error_response,
            }
        }
    }
}
impl BatchDescribeModelPackageError {
    /// Creates a new builder-style object to manufacture [`BatchDescribeModelPackageError`](crate::model::BatchDescribeModelPackageError).
    pub fn builder() -> crate::model::batch_describe_model_package_error::Builder {
        crate::model::batch_describe_model_package_error::Builder::default()
    }
}

/// <p>Provides summary information about the model package.</p>
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]
pub struct BatchDescribeModelPackageSummary {
    /// <p>The group name for the model package</p>
    #[doc(hidden)]
    pub model_package_group_name: std::option::Option<std::string::String>,
    /// <p>The version number of a versioned model.</p>
    #[doc(hidden)]
    pub model_package_version: std::option::Option<i32>,
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    #[doc(hidden)]
    pub model_package_arn: std::option::Option<std::string::String>,
    /// <p>The description of the model package.</p>
    #[doc(hidden)]
    pub model_package_description: std::option::Option<std::string::String>,
    /// <p>The creation time of the mortgage package summary.</p>
    #[doc(hidden)]
    pub creation_time: std::option::Option<aws_smithy_types::DateTime>,
    /// <p>Defines how to perform inference generation after a training job is run.</p>
    #[doc(hidden)]
    pub inference_specification: std::option::Option<crate::model::InferenceSpecification>,
    /// <p>The status of the mortgage package.</p>
    #[doc(hidden)]
    pub model_package_status: std::option::Option<crate::model::ModelPackageStatus>,
    /// <p>The approval status of the model.</p>
    #[doc(hidden)]
    pub model_approval_status: std::option::Option<crate::model::ModelApprovalStatus>,
}
impl BatchDescribeModelPackageSummary {
    /// <p>The group name for the model package</p>
    pub fn model_package_group_name(&self) -> std::option::Option<&str> {
        self.model_package_group_name.as_deref()
    }
    /// <p>The version number of a versioned model.</p>
    pub fn model_package_version(&self) -> std::option::Option<i32> {
        self.model_package_version
    }
    /// <p>The Amazon Resource Name (ARN) of the model package.</p>
    pub fn model_package_arn(&self) -> std::option::Option<&str> {
        self.model_package_arn.as_deref()
    }
    /// <p>The description of the model package.</p>
    pub fn model_package_description(&self) -> std::option::Option<&str> {
        self.model_package_description.as_deref()
    }
    /// <p>The creation time of the mortgage package summary.</p>
    pub fn creation_time(&self) -> std::option::Option<&aws_smithy_types::DateTime> {
        self.creation_time.as_ref()
    }
    /// <p>Defines how to perform inference generation after a training job is run.</p>
    pub fn inference_specification(
        &self,
    ) -> std::option::Option<&crate::model::InferenceSpecification> {
        self.inference_specification.as_ref()
    }
    /// <p>The status of the mortgage package.</p>
    pub fn model_package_status(&self) -> std::option::Option<&crate::model::ModelPackageStatus> {
        self.model_package_status.as_ref()
    }
    /// <p>The approval status of the model.</p>
    pub fn model_approval_status(&self) -> std::option::Option<&crate::model::ModelApprovalStatus> {
        self.model_approval_status.as_ref()
    }
}
/// See [`BatchDescribeModelPackageSummary`](crate::model::BatchDescribeModelPackageSummary).
pub mod batch_describe_model_package_summary {

    /// A builder for [`BatchDescribeModelPackageSummary`](crate::model::BatchDescribeModelPackageSummary).
    #[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default, std::fmt::Debug)]
    pub struct Builder {
        pub(crate) model_package_group_name: std::option::Option<std::string::String>,
        pub(crate) model_package_version: std::option::Option<i32>,
        pub(crate) model_package_arn: std::option::Option<std::string::String>,
        pub(crate) model_package_description: std::option::Option<std::string::String>,
        pub(crate) creation_time: std::option::Option<aws_smithy_types::DateTime>,
        pub(crate) inference_specification:
            std::option::Option<crate::model::InferenceSpecification>,
        pub(crate) model_package_status: std::option::Option<crate::model::ModelPackageStatus>,
        pub(crate) model_approval_status: std::option::Option<crate::model::ModelApprovalStatus>,
    }
    impl Builder {
        /// <p>The group name for the model package</p>
        pub fn model_package_group_name(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_group_name = Some(input.into());
            self
        }
        /// <p>The group name for the model package</p>
        pub fn set_model_package_group_name(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_group_name = input;
            self
        }
        /// <p>The version number of a versioned model.</p>
        pub fn model_package_version(mut self, input: i32) -> Self {
            self.model_package_version = Some(input);
            self
        }
        /// <p>The version number of a versioned model.</p>
        pub fn set_model_package_version(mut self, input: std::option::Option<i32>) -> Self {
            self.model_package_version = input;
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn model_package_arn(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_arn = Some(input.into());
            self
        }
        /// <p>The Amazon Resource Name (ARN) of the model package.</p>
        pub fn set_model_package_arn(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_arn = input;
            self
        }
        /// <p>The description of the model package.</p>
        pub fn model_package_description(mut self, input: impl Into<std::string::String>) -> Self {
            self.model_package_description = Some(input.into());
            self
        }
        /// <p>The description of the model package.</p>
        pub fn set_model_package_description(
            mut self,
            input: std::option::Option<std::string::String>,
        ) -> Self {
            self.model_package_description = input;
            self
        }
        /// <p>The creation time of the mortgage package summary.</p>
        pub fn creation_time(mut self, input: aws_smithy_types::DateTime) -> Self {
            self.creation_time = Some(input);
            self
        }
        /// <p>The creation time of the mortgage package summary.</p>
        pub fn set_creation_time(
            mut self,
            input: std::option::Option<aws_smithy_types::DateTime>,
        ) -> Self {
            self.creation_time = input;
            self
        }
        /// <p>Defines how to perform inference generation after a training job is run.</p>
        pub fn inference_specification(
            mut self,
            input: crate::model::InferenceSpecification,
        ) -> Self {
            self.inference_specification = Some(input);
            self
        }
        /// <p>Defines how to perform inference generation after a training job is run.</p>
        pub fn set_inference_specification(
            mut self,
            input: std::option::Option<crate::model::InferenceSpecification>,
        ) -> Self {
            self.inference_specification = input;
            self
        }
        /// <p>The status of the mortgage package.</p>
        pub fn model_package_status(mut self, input: crate::model::ModelPackageStatus) -> Self {
            self.model_package_status = Some(input);
            self
        }
        /// <p>The status of the mortgage package.</p>
        pub fn set_model_package_status(
            mut self,
            input: std::option::Option<crate::model::ModelPackageStatus>,
        ) -> Self {
            self.model_package_status = input;
            self
        }
        /// <p>The approval status of the model.</p>
        pub fn model_approval_status(mut self, input: crate::model::ModelApprovalStatus) -> Self {
            self.model_approval_status = Some(input);
            self
        }
        /// <p>The approval status of the model.</p>
        pub fn set_model_approval_status(
            mut self,
            input: std::option::Option<crate::model::ModelApprovalStatus>,
        ) -> Self {
            self.model_approval_status = input;
            self
        }
        /// Consumes the builder and constructs a [`BatchDescribeModelPackageSummary`](crate::model::BatchDescribeModelPackageSummary).
        pub fn build(self) -> crate::model::BatchDescribeModelPackageSummary {
            crate::model::BatchDescribeModelPackageSummary {
                model_package_group_name: self.model_package_group_name,
                model_package_version: self.model_package_version,
                model_package_arn: self.model_package_arn,
                model_package_description: self.model_package_description,
                creation_time: self.creation_time,
                inference_specification: self.inference_specification,
                model_package_status: self.model_package_status,
                model_approval_status: self.model_approval_status,
            }
        }
    }
}
impl BatchDescribeModelPackageSummary {
    /// Creates a new builder-style object to manufacture [`BatchDescribeModelPackageSummary`](crate::model::BatchDescribeModelPackageSummary).
    pub fn builder() -> crate::model::batch_describe_model_package_summary::Builder {
        crate::model::batch_describe_model_package_summary::Builder::default()
    }
}