#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq)]
pub struct ValidationException {
    #[doc(hidden)]
    pub message: std::option::Option<std::string::String>,
    #[doc(hidden)]
    pub reason: std::option::Option<crate::types::ValidationExceptionReason>,
    #[doc(hidden)]
    pub field_list: std::option::Option<std::vec::Vec<crate::types::ValidationExceptionField>>,
    pub(crate) meta: aws_smithy_types::error::ErrorMetadata,
}
impl ValidationException {
    pub fn reason(&self) -> std::option::Option<&crate::types::ValidationExceptionReason> {
        self.reason.as_ref()
    }
    pub fn field_list(&self) -> std::option::Option<&[crate::types::ValidationExceptionField]> {
        self.field_list.as_deref()
    }
}
impl std::fmt::Debug for ValidationException {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let mut formatter = f.debug_struct("ValidationException");
        formatter.field("message", &"*** Sensitive Data Redacted ***");
        formatter.field("reason", &self.reason);
        formatter.field("field_list", &self.field_list);
        formatter.field("meta", &self.meta);
        formatter.finish()
    }
}
impl ValidationException {
    pub fn message(&self) -> std::option::Option<&str> {
        self.message.as_deref()
    }
}
impl std::fmt::Display for ValidationException {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "ValidationException")?;
        write!(f, ": {}", "*** Sensitive Data Redacted ***")?;
        Ok(())
    }
}
impl std::error::Error for ValidationException {}
impl aws_http::request_id::RequestId for crate::types::error::ValidationException {
    fn request_id(&self) -> Option<&str> {
        use aws_smithy_types::error::metadata::ProvideErrorMetadata;
        self.meta().request_id()
    }
}
impl aws_smithy_types::error::metadata::ProvideErrorMetadata for ValidationException {
    fn meta(&self) -> &aws_smithy_types::error::ErrorMetadata {
        &self.meta
    }
}
impl ValidationException {
    pub fn builder() -> crate::types::error::builders::ValidationExceptionBuilder {
        crate::types::error::builders::ValidationExceptionBuilder::default()
    }
}
#[non_exhaustive]
#[derive(std::clone::Clone, std::cmp::PartialEq, std::default::Default)]
pub struct ValidationExceptionBuilder {
    pub(crate) message: std::option::Option<std::string::String>,
    pub(crate) reason: std::option::Option<crate::types::ValidationExceptionReason>,
    pub(crate) field_list:
        std::option::Option<std::vec::Vec<crate::types::ValidationExceptionField>>,
    meta: std::option::Option<aws_smithy_types::error::ErrorMetadata>,
}
impl ValidationExceptionBuilder {
    pub fn message(mut self, input: impl Into<std::string::String>) -> Self {
        self.message = Some(input.into());
        self
    }
    pub fn set_message(mut self, input: std::option::Option<std::string::String>) -> Self {
        self.message = input;
        self
    }
    pub fn reason(mut self, input: crate::types::ValidationExceptionReason) -> Self {
        self.reason = Some(input);
        self
    }
    pub fn set_reason(
        mut self,
        input: std::option::Option<crate::types::ValidationExceptionReason>,
    ) -> Self {
        self.reason = input;
        self
    }
    pub fn field_list(mut self, input: crate::types::ValidationExceptionField) -> Self {
        let mut v = self.field_list.unwrap_or_default();
        v.push(input);
        self.field_list = Some(v);
        self
    }
    pub fn set_field_list(
        mut self,
        input: std::option::Option<std::vec::Vec<crate::types::ValidationExceptionField>>,
    ) -> Self {
        self.field_list = input;
        self
    }
    pub fn meta(mut self, meta: aws_smithy_types::error::ErrorMetadata) -> Self {
        self.meta = Some(meta);
        self
    }
    pub fn set_meta(
        &mut self,
        meta: std::option::Option<aws_smithy_types::error::ErrorMetadata>,
    ) -> &mut Self {
        self.meta = meta;
        self
    }
    pub fn build(self) -> crate::types::error::ValidationException {
        crate::types::error::ValidationException {
            message: self.message,
            reason: self.reason,
            field_list: self.field_list,
            meta: self.meta.unwrap_or_default(),
        }
    }
}
impl std::fmt::Debug for ValidationExceptionBuilder {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let mut formatter = f.debug_struct("ValidationExceptionBuilder");
        formatter.field("message", &"*** Sensitive Data Redacted ***");
        formatter.field("reason", &self.reason);
        formatter.field("field_list", &self.field_list);
        formatter.finish()
    }
}